openmausbot 0.1.55
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/LICENSE +202 -0
- package/README.md +14 -0
- package/cli.js +2 -0
- package/dist/app-icon.svg +29 -0
- package/dist/assets/abap-BdImnpbu.js +1 -0
- package/dist/assets/actionscript-3-B3316cI-.js +1 -0
- package/dist/assets/ada-bCR0ucgS.js +1 -0
- package/dist/assets/ahk-CsyLZFj1.js +1 -0
- package/dist/assets/ahk2-8Zs4aa1G.js +1 -0
- package/dist/assets/andromeeda-C4gqWexZ.js +1 -0
- package/dist/assets/angular-html-DA-rfuFy.js +1 -0
- package/dist/assets/angular-ts-BrjP3tb8.js +1 -0
- package/dist/assets/apache-Pmp26Uib.js +1 -0
- package/dist/assets/apex-DhZFqWV2.js +1 -0
- package/dist/assets/apl-CORt7UWP.js +1 -0
- package/dist/assets/applescript-Co6uUVPk.js +1 -0
- package/dist/assets/ara-BRHolxvo.js +1 -0
- package/dist/assets/asciidoc-CSVQ5wI8.js +1 -0
- package/dist/assets/asm-D_Q5rh1f.js +1 -0
- package/dist/assets/astro-HNnZUWAn.js +1 -0
- package/dist/assets/aurora-x-D-2ljcwZ.js +1 -0
- package/dist/assets/awk-DMzUqQB5.js +1 -0
- package/dist/assets/ayu-dark-DYE7WIF3.js +1 -0
- package/dist/assets/ayu-light-BA47KaF1.js +1 -0
- package/dist/assets/ayu-mirage-32ctXXKs.js +1 -0
- package/dist/assets/ballerina-BFfxhgS-.js +1 -0
- package/dist/assets/bat-CickPsom.js +1 -0
- package/dist/assets/beancount-k_qm7-4y.js +1 -0
- package/dist/assets/berry-uYugtg8r.js +1 -0
- package/dist/assets/bibtex-CHM0blh-.js +1 -0
- package/dist/assets/bicep-Bmn6On1c.js +1 -0
- package/dist/assets/bird2-Bx8U0n9b.js +1 -0
- package/dist/assets/blade-2xfisSek.js +1 -0
- package/dist/assets/bsl-DlhNcFeZ.js +1 -0
- package/dist/assets/c-BIGW1oBm.js +1 -0
- package/dist/assets/c3-Dp5svz6Z.js +1 -0
- package/dist/assets/cadence-Bv_4Rxtq.js +1 -0
- package/dist/assets/cairo-KRGpt6FW.js +1 -0
- package/dist/assets/catppuccin-frappe-CZL1YF0i.js +1 -0
- package/dist/assets/catppuccin-latte-DH-8KZSZ.js +1 -0
- package/dist/assets/catppuccin-macchiato-B7yYVSCf.js +1 -0
- package/dist/assets/catppuccin-mocha-Ct7hS0mc.js +1 -0
- package/dist/assets/chapel-DTp_pixX.js +1 -0
- package/dist/assets/clarity-Dn5IMItf.js +1 -0
- package/dist/assets/clojure-P80f7IUj.js +1 -0
- package/dist/assets/cmake-D1j8_8rp.js +1 -0
- package/dist/assets/cobol-nBiQ_Alo.js +1 -0
- package/dist/assets/codeowners-Bp6g37R7.js +1 -0
- package/dist/assets/codeql-DsOJ9woJ.js +1 -0
- package/dist/assets/coffee-Ch7k5sss.js +1 -0
- package/dist/assets/common-lisp-Cg-RD9OK.js +1 -0
- package/dist/assets/coq-C7JzOVbR.js +1 -0
- package/dist/assets/cpp-BMRokrvK.js +1 -0
- package/dist/assets/crystal-DGywbUpC.js +1 -0
- package/dist/assets/csharp-DSvCPggb.js +1 -0
- package/dist/assets/css-CLj8gQPS.js +1 -0
- package/dist/assets/csv-fuZLfV_i.js +1 -0
- package/dist/assets/cue-D82EKSYY.js +1 -0
- package/dist/assets/cypher-COkxafJQ.js +1 -0
- package/dist/assets/d-85-TOEBH.js +1 -0
- package/dist/assets/dark-plus-C3mMm8J8.js +1 -0
- package/dist/assets/dart-bE4Kk8sk.js +1 -0
- package/dist/assets/dax-CEL-wOlO.js +1 -0
- package/dist/assets/desktop-BmXAJ9_W.js +1 -0
- package/dist/assets/diff-D97Zzqfu.js +1 -0
- package/dist/assets/docker-BcOcwvcX.js +1 -0
- package/dist/assets/dotenv-Da5cRb03.js +1 -0
- package/dist/assets/dracula-BzJJZx-M.js +1 -0
- package/dist/assets/dracula-soft-BXkSAIEj.js +1 -0
- package/dist/assets/dream-maker-BtqSS_iP.js +1 -0
- package/dist/assets/edge-FbVlp4U3.js +1 -0
- package/dist/assets/elixir-CkH2-t6x.js +1 -0
- package/dist/assets/elm-DbKCFpqz.js +1 -0
- package/dist/assets/emacs-lisp-C_m_b--Z.js +1 -0
- package/dist/assets/erb-DXfck5VN.js +1 -0
- package/dist/assets/erlang-DsQrWhSR.js +1 -0
- package/dist/assets/everforest-dark-BgDCqdQA.js +1 -0
- package/dist/assets/everforest-light-C8M2exoo.js +1 -0
- package/dist/assets/fennel-BYunw83y.js +1 -0
- package/dist/assets/fish-BvzEVeQv.js +1 -0
- package/dist/assets/fluent-C4IJs8-o.js +1 -0
- package/dist/assets/fortran-fixed-form-CkoXwp7k.js +1 -0
- package/dist/assets/fortran-free-form-BxgE0vQu.js +1 -0
- package/dist/assets/fsharp-CXgrBDvD.js +1 -0
- package/dist/assets/gdresource-TyuKm33G.js +1 -0
- package/dist/assets/gdscript-DqcFQ5yU.js +1 -0
- package/dist/assets/gdshader-DkwncUOv.js +1 -0
- package/dist/assets/genie-D0YGMca9.js +1 -0
- package/dist/assets/gherkin-DyxjwDmM.js +1 -0
- package/dist/assets/git-commit-F4YmCXRG.js +1 -0
- package/dist/assets/git-rebase-r7XF79zn.js +1 -0
- package/dist/assets/github-dark-DHJKELXO.js +1 -0
- package/dist/assets/github-dark-default-Cuk6v7N8.js +1 -0
- package/dist/assets/github-dark-dimmed-DH5Ifo-i.js +1 -0
- package/dist/assets/github-dark-high-contrast-E3gJ1_iC.js +1 -0
- package/dist/assets/github-light-DAi9KRSo.js +1 -0
- package/dist/assets/github-light-default-D7oLnXFd.js +1 -0
- package/dist/assets/github-light-high-contrast-BfjtVDDH.js +1 -0
- package/dist/assets/gleam-BspZqrRM.js +1 -0
- package/dist/assets/glimmer-js-ByusRIyA.js +1 -0
- package/dist/assets/glimmer-ts-BfAWNZQY.js +1 -0
- package/dist/assets/glsl-DplSGwfg.js +1 -0
- package/dist/assets/gn-n2N0HUVH.js +1 -0
- package/dist/assets/gnuplot-DdkO51Og.js +1 -0
- package/dist/assets/go-C27-OAKa.js +1 -0
- package/dist/assets/graphql-ChdNCCLP.js +1 -0
- package/dist/assets/groovy-gcz8RCvz.js +1 -0
- package/dist/assets/gruvbox-dark-hard-CFHQjOhq.js +1 -0
- package/dist/assets/gruvbox-dark-medium-GsRaNv29.js +1 -0
- package/dist/assets/gruvbox-dark-soft-CVdnzihN.js +1 -0
- package/dist/assets/gruvbox-light-hard-CH1njM8p.js +1 -0
- package/dist/assets/gruvbox-light-medium-DRw_LuNl.js +1 -0
- package/dist/assets/gruvbox-light-soft-hJgmCMqR.js +1 -0
- package/dist/assets/hack-BWmVpMyf.js +1 -0
- package/dist/assets/haml-D5jkg6IW.js +1 -0
- package/dist/assets/handlebars-BpdQsYii.js +1 -0
- package/dist/assets/haskell-Df6bDoY_.js +1 -0
- package/dist/assets/haxe-CfZj7gIn.js +1 -0
- package/dist/assets/hcl-BWvSN4gD.js +1 -0
- package/dist/assets/hjson-D5-asLiD.js +1 -0
- package/dist/assets/hlsl-D3lLCCz7.js +1 -0
- package/dist/assets/horizon-BUw7H-hv.js +1 -0
- package/dist/assets/horizon-bright-CUuTKBJd.js +1 -0
- package/dist/assets/houston-DnULxvSX.js +1 -0
- package/dist/assets/html-derivative-DlHx6ybY.js +1 -0
- package/dist/assets/html-pp8916En.js +1 -0
- package/dist/assets/http-jrhK8wxY.js +1 -0
- package/dist/assets/hurl-irOxFIW8.js +1 -0
- package/dist/assets/hxml-2-FPmUDs.js +1 -0
- package/dist/assets/hy-DFXneXwc.js +1 -0
- package/dist/assets/imba-DGztddWO.js +1 -0
- package/dist/assets/index-B9rLIY81.js +263 -0
- package/dist/assets/index-CJBrtDbC.css +1 -0
- package/dist/assets/index-D-u0LYsV.js +153 -0
- package/dist/assets/ini-BEwlwnbL.js +1 -0
- package/dist/assets/java-CylS5w8V.js +1 -0
- package/dist/assets/javascript-wDzz0qaB.js +1 -0
- package/dist/assets/jinja-f2NsQr07.js +1 -0
- package/dist/assets/jison-wvAkD_A8.js +1 -0
- package/dist/assets/json-Cp-IABpG.js +1 -0
- package/dist/assets/json5-C9tS-k6U.js +1 -0
- package/dist/assets/jsonc-Des-eS-w.js +1 -0
- package/dist/assets/jsonl-DcaNXYhu.js +1 -0
- package/dist/assets/jsonnet-DFQXde-d.js +1 -0
- package/dist/assets/jssm-C2t-YnRu.js +1 -0
- package/dist/assets/jsx-g9-lgVsj.js +1 -0
- package/dist/assets/julia-5Bft2YPA.js +1 -0
- package/dist/assets/just-Cwhn7H3k.js +1 -0
- package/dist/assets/kanagawa-dragon-BuwD2xS4.js +1 -0
- package/dist/assets/kanagawa-lotus-C3DzagqV.js +1 -0
- package/dist/assets/kanagawa-wave-DFGoQZhC.js +1 -0
- package/dist/assets/kdl-DV7GczEv.js +1 -0
- package/dist/assets/kotlin-BdnUsdx6.js +1 -0
- package/dist/assets/kusto-wEQ09or8.js +1 -0
- package/dist/assets/laserwave-DUszq2jm.js +1 -0
- package/dist/assets/latex-D5pSuvFb.js +1 -0
- package/dist/assets/lean-BZvkOJ9d.js +1 -0
- package/dist/assets/less-B1dDrJ26.js +1 -0
- package/dist/assets/light-plus-B7mTdjB0.js +1 -0
- package/dist/assets/liquid-C0sCDyMI.js +1 -0
- package/dist/assets/llvm-BZoOZj88.js +1 -0
- package/dist/assets/log-2UxHyX5q.js +1 -0
- package/dist/assets/logo-BtOb2qkB.js +1 -0
- package/dist/assets/lua-BaeVxFsk.js +1 -0
- package/dist/assets/luau-BnpPk5vE.js +1 -0
- package/dist/assets/make-CHLpvVh8.js +1 -0
- package/dist/assets/markdown-Cvjx9yec.js +1 -0
- package/dist/assets/marko-DjSrsDqO.js +1 -0
- package/dist/assets/material-theme-D5KoaKCx.js +1 -0
- package/dist/assets/material-theme-darker-BfHTSMKl.js +1 -0
- package/dist/assets/material-theme-lighter-B0m2ddpp.js +1 -0
- package/dist/assets/material-theme-ocean-CyktbL80.js +1 -0
- package/dist/assets/material-theme-palenight-Csfq5Kiy.js +1 -0
- package/dist/assets/matlab-D7o27uSR.js +1 -0
- package/dist/assets/mdc-D1_yUvq7.js +1 -0
- package/dist/assets/mdx-Cmh6b_Ma.js +1 -0
- package/dist/assets/mermaid-CQcHuHx7.js +1 -0
- package/dist/assets/min-dark-CafNBF8u.js +1 -0
- package/dist/assets/min-light-CTRr51gU.js +1 -0
- package/dist/assets/mipsasm-CKIfxQSi.js +1 -0
- package/dist/assets/mojo-DJz3ZmWd.js +1 -0
- package/dist/assets/monokai-BRVnQi9A.js +1 -0
- package/dist/assets/moonbit-CHtswR0a.js +1 -0
- package/dist/assets/move-el3G9tDJ.js +1 -0
- package/dist/assets/narrat-DRg8JJMk.js +1 -0
- package/dist/assets/nextflow-C-mBbutL.js +1 -0
- package/dist/assets/nextflow-groovy-vE_lwT2v.js +1 -0
- package/dist/assets/nginx-BpAMiNFr.js +1 -0
- package/dist/assets/night-owl-C39BiMTA.js +1 -0
- package/dist/assets/night-owl-light-CMTm3GFP.js +1 -0
- package/dist/assets/nim-BIad80T-.js +1 -0
- package/dist/assets/nix-CwoSXNpI.js +1 -0
- package/dist/assets/nord-Ddv68eIx.js +1 -0
- package/dist/assets/nsis-BlV79W_Q.js +1 -0
- package/dist/assets/nushell-D3jzshHO.js +1 -0
- package/dist/assets/objective-c-DXmwc3jG.js +1 -0
- package/dist/assets/objective-cpp-CLxacb5B.js +1 -0
- package/dist/assets/ocaml-C0hk2d4L.js +1 -0
- package/dist/assets/odin-BBf5iR-q.js +1 -0
- package/dist/assets/one-dark-pro-DVMEJ2y_.js +1 -0
- package/dist/assets/one-light-C3Wv6jpd.js +1 -0
- package/dist/assets/openscad-C4EeE6gA.js +1 -0
- package/dist/assets/org-DM6o9KBp.js +1 -0
- package/dist/assets/pascal-D93ZcfNL.js +1 -0
- package/dist/assets/perl-B9cMNwum.js +1 -0
- package/dist/assets/php-Csjmro_R.js +1 -0
- package/dist/assets/pkl-u5AG7uiY.js +1 -0
- package/dist/assets/plastic-3e1v2bzS.js +1 -0
- package/dist/assets/plsql-ChMvpjG-.js +1 -0
- package/dist/assets/po-BTJTHyun.js +1 -0
- package/dist/assets/poimandres-CS3Unz2-.js +1 -0
- package/dist/assets/polar-C0HS_06l.js +1 -0
- package/dist/assets/postcss-CXtECtnM.js +1 -0
- package/dist/assets/powerquery-CEu0bR-o.js +1 -0
- package/dist/assets/powershell-BmBUJMz7.js +1 -0
- package/dist/assets/prisma-Vru482bI.js +1 -0
- package/dist/assets/prolog-CbFg5uaA.js +1 -0
- package/dist/assets/proto-C7zT0LnQ.js +1 -0
- package/dist/assets/pug-DKIMFp6K.js +1 -0
- package/dist/assets/puppet-BMWR74SV.js +1 -0
- package/dist/assets/purescript-CklMAg4u.js +1 -0
- package/dist/assets/python-B6aJPvgy.js +1 -0
- package/dist/assets/qml-3beO22l8.js +1 -0
- package/dist/assets/qmldir-C8lEn-DE.js +1 -0
- package/dist/assets/qss-IeuSbFQv.js +1 -0
- package/dist/assets/r-Cf5RLm7j.js +1 -0
- package/dist/assets/racket-BqYA7rlc.js +1 -0
- package/dist/assets/raku-DXvB9xmW.js +1 -0
- package/dist/assets/razor-BjBPvh-w.js +1 -0
- package/dist/assets/rbs-CpoqiR4B.js +1 -0
- package/dist/assets/red-hvxz__6c.js +1 -0
- package/dist/assets/reg-C-SQnVFl.js +1 -0
- package/dist/assets/regexp-CDVJQ6XC.js +1 -0
- package/dist/assets/rel-C3B-1QV4.js +1 -0
- package/dist/assets/riscv-BM1_JUlF.js +1 -0
- package/dist/assets/ron-D8l8udqQ.js +1 -0
- package/dist/assets/rose-pine-5qJOZa0Y.js +1 -0
- package/dist/assets/rose-pine-dawn-zx0QlTCp.js +1 -0
- package/dist/assets/rose-pine-moon-C9pEdX9L.js +1 -0
- package/dist/assets/rosmsg-BJDFO7_C.js +1 -0
- package/dist/assets/rst-bs7f0vWN.js +1 -0
- package/dist/assets/ruby-C0TQ7zu5.js +1 -0
- package/dist/assets/rust-B1yitclQ.js +1 -0
- package/dist/assets/sas-DEy46yEz.js +1 -0
- package/dist/assets/sass-Cj5Yp3dK.js +1 -0
- package/dist/assets/scala-CqE71os6.js +1 -0
- package/dist/assets/scheme-C98Dy4si.js +1 -0
- package/dist/assets/scss-D5BDwBP9.js +1 -0
- package/dist/assets/sdbl-DVxCFoDh.js +1 -0
- package/dist/assets/shaderlab-Dg9Lc6iA.js +1 -0
- package/dist/assets/shellscript-Yzrsuije.js +1 -0
- package/dist/assets/shellsession-BADoaaVG.js +1 -0
- package/dist/assets/slack-dark-BthQWCQV.js +1 -0
- package/dist/assets/slack-ochin-DqwNpetd.js +1 -0
- package/dist/assets/smalltalk-BOQMe2GC.js +1 -0
- package/dist/assets/smithy-cds9vsN8.js +1 -0
- package/dist/assets/snazzy-light-Bw305WKR.js +1 -0
- package/dist/assets/solarized-dark-CpvCGNkr.js +1 -0
- package/dist/assets/solarized-light-Dlz6yCKv.js +1 -0
- package/dist/assets/solidity-DijEV5ha.js +1 -0
- package/dist/assets/soy-8wufbnw4.js +1 -0
- package/dist/assets/sparql-rVzFXLq3.js +1 -0
- package/dist/assets/splunk-BtCnVYZw.js +1 -0
- package/dist/assets/sql-CRqJ_cUM.js +1 -0
- package/dist/assets/ssh-config-_ykCGR6B.js +1 -0
- package/dist/assets/stata-DI20mbqo.js +1 -0
- package/dist/assets/stylus-BEDo0Tqx.js +1 -0
- package/dist/assets/surrealql-Cjom0U5J.js +1 -0
- package/dist/assets/svelte-Cy7k_4gC.js +1 -0
- package/dist/assets/swift-C2oV4EkX.js +1 -0
- package/dist/assets/synthwave-84-CbfX1IO0.js +1 -0
- package/dist/assets/system-verilog-0hqHdDBg.js +1 -0
- package/dist/assets/systemd-4A_iFExJ.js +1 -0
- package/dist/assets/talonscript-CkByrt1z.js +1 -0
- package/dist/assets/tasl-QIJgUcNo.js +1 -0
- package/dist/assets/tcl-dwOrl1Do.js +1 -0
- package/dist/assets/templ-DhtptRzy.js +1 -0
- package/dist/assets/terraform-BETggiCN.js +1 -0
- package/dist/assets/tex-D96PA37w.js +1 -0
- package/dist/assets/tokyo-night-hegEt444.js +1 -0
- package/dist/assets/toml-vGWfd6FD.js +1 -0
- package/dist/assets/ts-tags-D351s5mN.js +1 -0
- package/dist/assets/tsv-B_m7g4N7.js +1 -0
- package/dist/assets/tsx-COt5Ahok.js +1 -0
- package/dist/assets/turtle-BsS91CYL.js +1 -0
- package/dist/assets/twig-27uCiNez.js +1 -0
- package/dist/assets/typescript-BPQ3VLAy.js +1 -0
- package/dist/assets/typespec-CAFt9gP4.js +1 -0
- package/dist/assets/typst-BUadGCkm.js +1 -0
- package/dist/assets/v-BGw2Nkan.js +1 -0
- package/dist/assets/vala-CsfeWuGM.js +1 -0
- package/dist/assets/vb-Cu-pLBUe.js +1 -0
- package/dist/assets/verilog-nZwndyjY.js +1 -0
- package/dist/assets/vesper-DRje8inN.js +1 -0
- package/dist/assets/vhdl-CeAyd5Ju.js +1 -0
- package/dist/assets/viml-CJc9bBzg.js +1 -0
- package/dist/assets/vitesse-black-Bkuqu6BP.js +1 -0
- package/dist/assets/vitesse-dark-D0r3Knsf.js +1 -0
- package/dist/assets/vitesse-light-CVO1_9PV.js +1 -0
- package/dist/assets/vue-BqiEGhQt.js +1 -0
- package/dist/assets/vue-html-AaS7Mt5G.js +1 -0
- package/dist/assets/vue-vine-BoDAl6tE.js +1 -0
- package/dist/assets/vyper-CDx5xZoG.js +1 -0
- package/dist/assets/wasm-CG6Dc4jp.js +1 -0
- package/dist/assets/wasm-MzD3tlZU.js +1 -0
- package/dist/assets/wenyan-BV7otONQ.js +1 -0
- package/dist/assets/wgsl-Dx-B1_4e.js +1 -0
- package/dist/assets/wikitext-BhOHFoWU.js +1 -0
- package/dist/assets/wit-5i3qLPDT.js +1 -0
- package/dist/assets/wolfram-lXgVvXCa.js +1 -0
- package/dist/assets/xml-sdJ4AIDG.js +1 -0
- package/dist/assets/xsl-CtQFsRM5.js +1 -0
- package/dist/assets/yaml-Buea-lGh.js +1 -0
- package/dist/assets/zenscript-DVFEvuxE.js +1 -0
- package/dist/assets/zig-VOosw3JB.js +1 -0
- package/dist/index.html +14 -0
- package/dist-server/companion/src/listener.js +187 -0
- package/dist-server/computer-proxy.js +1185 -0
- package/dist-server/connector-proxy.js +186 -0
- package/dist-server/container-mcp.js +15186 -0
- package/dist-server/drivers/agents-proxy.js +887 -0
- package/dist-server/drivers/browser-proxy.js +15037 -0
- package/dist-server/drivers/dweb-proxy.js +175 -0
- package/dist-server/drivers/phone-proxy.js +339 -0
- package/dist-server/drivers/pi-mcp-extension.ts +638 -0
- package/dist-server/index.js +64869 -0
- package/dist-server/local-computer.js +198 -0
- package/dist-server/mcp-server.js +1233 -0
- package/dist-server/openmausbot.js +3671 -0
- package/dist-server/pair-cli.js +3671 -0
- package/dist-server/permission-proxy.js +126 -0
- package/dist-server/prepare-cloudflared.js +253 -0
- package/dist-server/proxy-paths.js +29 -0
- package/dist-server/server/atomic.js +40 -0
- package/dist-server/server/attachments.js +471 -0
- package/dist-server/server/auto-approve.js +162 -0
- package/dist-server/server/auto-review.js +79 -0
- package/dist-server/server/avatar-image.js +144 -0
- package/dist-server/server/bot-cwd.js +29 -0
- package/dist-server/server/bot-directory.js +127 -0
- package/dist-server/server/bot-package.js +268 -0
- package/dist-server/server/bot-profile.js +76 -0
- package/dist-server/server/box-create-idempotency.js +463 -0
- package/dist-server/server/box.js +944 -0
- package/dist-server/server/brand.js +65 -0
- package/dist-server/server/browser-connection.js +187 -0
- package/dist-server/server/browser-lifecycle-cleanup.js +359 -0
- package/dist-server/server/calendar-calls.js +314 -0
- package/dist-server/server/channel-queue.js +70 -0
- package/dist-server/server/checkpoints.js +405 -0
- package/dist-server/server/chief-of-staff.js +49 -0
- package/dist-server/server/claude-update.js +70 -0
- package/dist-server/server/cli.js +524 -0
- package/dist-server/server/cloud-backend.js +30 -0
- package/dist-server/server/comms-visibility.js +109 -0
- package/dist-server/server/composio.js +945 -0
- package/dist-server/server/computer-control.js +149 -0
- package/dist-server/server/computer-observation.js +133 -0
- package/dist-server/server/computer-proxy.js +1061 -0
- package/dist-server/server/config.js +760 -0
- package/dist-server/server/connector-proxy.js +228 -0
- package/dist-server/server/container-computer.js +840 -0
- package/dist-server/server/container-mcp.js +27 -0
- package/dist-server/server/contracts.js +24 -0
- package/dist-server/server/control-client.js +100 -0
- package/dist-server/server/data-dir-lease.js +3 -0
- package/dist-server/server/decision-log.js +106 -0
- package/dist-server/server/delegations.js +628 -0
- package/dist-server/server/drivers/acp/core.js +904 -0
- package/dist-server/server/drivers/acp/cursor.js +365 -0
- package/dist-server/server/drivers/acp/custom.js +51 -0
- package/dist-server/server/drivers/acp/droid.js +225 -0
- package/dist-server/server/drivers/acp/gemini.js +95 -0
- package/dist-server/server/drivers/acp/grok.js +249 -0
- package/dist-server/server/drivers/acp/hermes.js +429 -0
- package/dist-server/server/drivers/acp/kimi.js +559 -0
- package/dist-server/server/drivers/acp/opencode-go.js +370 -0
- package/dist-server/server/drivers/acp/qwen.js +98 -0
- package/dist-server/server/drivers/agents-proxy.js +941 -0
- package/dist-server/server/drivers/antigravity-acp.js +507 -0
- package/dist-server/server/drivers/antigravity-release.js +65 -0
- package/dist-server/server/drivers/antigravity-runtime.js +395 -0
- package/dist-server/server/drivers/antigravity.js +144 -0
- package/dist-server/server/drivers/boxagent.js +245 -0
- package/dist-server/server/drivers/browser-proxy.js +520 -0
- package/dist-server/server/drivers/builtIn.js +36 -0
- package/dist-server/server/drivers/claude.js +1337 -0
- package/dist-server/server/drivers/codex-catalog.js +409 -0
- package/dist-server/server/drivers/codex.js +1116 -0
- package/dist-server/server/drivers/dweb-proxy.js +193 -0
- package/dist-server/server/drivers/grok.js +48 -0
- package/dist-server/server/drivers/grokagent.js +4 -0
- package/dist-server/server/drivers/local-inject.js +388 -0
- package/dist-server/server/drivers/minimax.js +108 -0
- package/dist-server/server/drivers/native.js +21 -0
- package/dist-server/server/drivers/openai-chat.js +240 -0
- package/dist-server/server/drivers/openai-compat.js +143 -0
- package/dist-server/server/drivers/phone-proxy.js +372 -0
- package/dist-server/server/drivers/pi.js +855 -0
- package/dist-server/server/drivers/retry.js +96 -0
- package/dist-server/server/enterprise.js +93 -0
- package/dist-server/server/env-path.js +329 -0
- package/dist-server/server/environment.js +105 -0
- package/dist-server/server/generated-image.js +39 -0
- package/dist-server/server/graceful-shutdown.js +24 -0
- package/dist-server/server/group-goal-run.js +124 -0
- package/dist-server/server/harness/bus.js +86 -0
- package/dist-server/server/harness/registry.js +217 -0
- package/dist-server/server/index.js +11634 -0
- package/dist-server/server/installed-playbooks.js +34 -0
- package/dist-server/server/local-computer.js +278 -0
- package/dist-server/server/local-routing.js +9 -0
- package/dist-server/server/local-vm-idle.js +44 -0
- package/dist-server/server/local-vm-inventory.js +34 -0
- package/dist-server/server/local-vm-lease.js +58 -0
- package/dist-server/server/mcp-bridge.js +251 -0
- package/dist-server/server/mcp-probe.js +153 -0
- package/dist-server/server/mcp-registry.js +130 -0
- package/dist-server/server/member-turn.js +6 -0
- package/dist-server/server/message-db.js +358 -0
- package/dist-server/server/message-file.js +439 -0
- package/dist-server/server/names.js +26 -0
- package/dist-server/server/notify.js +69 -0
- package/dist-server/server/openmaus-status-capsule.js +329 -0
- package/dist-server/server/openmausbot.js +6 -0
- package/dist-server/server/package-export.js +157 -0
- package/dist-server/server/pair-cli.js +7 -0
- package/dist-server/server/peer-approval-key.js +5 -0
- package/dist-server/server/peer-approval.js +182 -0
- package/dist-server/server/peer-provenance.js +44 -0
- package/dist-server/server/peer-roster.js +139 -0
- package/dist-server/server/permission-proxy.js +157 -0
- package/dist-server/server/phone-secret.js +358 -0
- package/dist-server/server/private-screen-capture.js +17 -0
- package/dist-server/server/procs.js +123 -0
- package/dist-server/server/project-scout.js +304 -0
- package/dist-server/server/proxy-paths.js +47 -0
- package/dist-server/server/redact.js +102 -0
- package/dist-server/server/remote-computer.js +170 -0
- package/dist-server/server/repeat-detector.js +48 -0
- package/dist-server/server/replies.js +38 -0
- package/dist-server/server/request-auth.js +327 -0
- package/dist-server/server/room-cwd.js +15 -0
- package/dist-server/server/room-post-budget.js +112 -0
- package/dist-server/server/room-turn-timeout.js +115 -0
- package/dist-server/server/routine-requests.js +871 -0
- package/dist-server/server/routines.js +1111 -0
- package/dist-server/server/schema.js +11 -0
- package/dist-server/server/screen-frame-gate.js +80 -0
- package/dist-server/server/section-context.js +85 -0
- package/dist-server/server/send-idempotency.js +53 -0
- package/dist-server/server/sessions.js +319 -0
- package/dist-server/server/skill-fetch.js +148 -0
- package/dist-server/server/skill-learn.js +61 -0
- package/dist-server/server/skill-library.js +116 -0
- package/dist-server/server/skills.js +1223 -0
- package/dist-server/server/steer-queue.js +114 -0
- package/dist-server/server/store.js +1217 -0
- package/dist-server/server/surface.js +107 -0
- package/dist-server/server/tailscale.js +103 -0
- package/dist-server/server/team-backup.js +183 -0
- package/dist-server/server/team-library.js +205 -0
- package/dist-server/server/team-manifest.js +224 -0
- package/dist-server/server/thread-events.js +226 -0
- package/dist-server/server/tts/elevenlabs.js +92 -0
- package/dist-server/server/tts/index.js +79 -0
- package/dist-server/server/tts/speech-text.js +195 -0
- package/dist-server/server/tts/system-voices.js +74 -0
- package/dist-server/server/tunnel.js +202 -0
- package/dist-server/server/turn-context.js +40 -0
- package/dist-server/server/turn-dispatch-guard.js +152 -0
- package/dist-server/server/turn-images.js +138 -0
- package/dist-server/server/turn-watchdog.js +65 -0
- package/dist-server/server/vps-computer.js +1099 -0
- package/dist-server/server/vps-container-mcp.js +31 -0
- package/dist-server/server/webhook-ingress.js +173 -0
- package/dist-server/server/webhooks.js +491 -0
- package/dist-server/server/workspace.js +178 -0
- package/dist-server/shared/approval-mode.js +39 -0
- package/dist-server/shared/bot-avatar.js +33 -0
- package/dist-server/shared/bot-profile.js +7 -0
- package/dist-server/shared/connector-availability.js +12 -0
- package/dist-server/shared/credential-request.js +82 -0
- package/dist-server/shared/group-goal-run.js +1 -0
- package/dist-server/shared/import-name.js +11 -0
- package/dist-server/shared/mascot-bodies.js +107 -0
- package/dist-server/shared/routine-request.js +10 -0
- package/dist-server/shared/routine-run.js +1 -0
- package/dist-server/shared/skill-request.js +16 -0
- package/dist-server/shared/team-backup.js +148 -0
- package/dist-server/src/lib/composer-attachments.js +676 -0
- package/dist-server/tunnel-guardian.js +390 -0
- package/dist-server/vps-container-mcp.js +15209 -0
- package/package.json +32 -0
- package/skills/create-verification-skill/SKILL.md +65 -0
- package/skills/create-verification-skill/manifest.json +13 -0
- package/skills/phone-harness/SKILL.md +26 -0
- package/skills/phone-harness/agents/openai.yaml +13 -0
- package/skills/phone-harness/manifest.json +17 -0
|
@@ -0,0 +1,395 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import { createReadStream, createWriteStream } from "node:fs";
|
|
3
|
+
import { access, chmod, mkdir, mkdtemp, open, readFile, rename, rm, stat, statfs, writeFile, } from "node:fs/promises";
|
|
4
|
+
import { constants } from "node:fs";
|
|
5
|
+
import { delimiter, dirname, isAbsolute, join, resolve } from "node:path";
|
|
6
|
+
import { Transform } from "node:stream";
|
|
7
|
+
import { pipeline } from "node:stream/promises";
|
|
8
|
+
import { createInflateRaw } from "node:zlib";
|
|
9
|
+
import { DATA_DIR } from "../config.js";
|
|
10
|
+
import { augmentedPath } from "../env-path.js";
|
|
11
|
+
import { resolveAntigravityReleaseAsset, } from "./antigravity-release.js";
|
|
12
|
+
const FREE_SPACE_MARGIN = 256 * 1024 * 1024;
|
|
13
|
+
const DOWNLOAD_TIMEOUT_MS = 45 * 60_000;
|
|
14
|
+
const INSTALL_RECORD = ".install-complete.json";
|
|
15
|
+
export class AntigravitySetupError extends Error {
|
|
16
|
+
status = 409;
|
|
17
|
+
constructor(message) {
|
|
18
|
+
super(message);
|
|
19
|
+
this.name = "AntigravitySetupError";
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
const installs = new Map();
|
|
23
|
+
function runtimeRoot(baseDir = DATA_DIR) {
|
|
24
|
+
return join(baseDir, "tools", "antigravity-acp", `${process.platform}-${process.arch}`);
|
|
25
|
+
}
|
|
26
|
+
function executableNames(platform = process.platform) {
|
|
27
|
+
return platform === "win32"
|
|
28
|
+
? { executable: "agy_acp_server.exe", harness: "localharness_external.exe" }
|
|
29
|
+
: { executable: "agy_acp_server.par", harness: "localharness_external" };
|
|
30
|
+
}
|
|
31
|
+
async function executableFile(path, bytes) {
|
|
32
|
+
try {
|
|
33
|
+
const info = await stat(path);
|
|
34
|
+
if (!info.isFile() || (bytes !== undefined && info.size !== bytes))
|
|
35
|
+
return false;
|
|
36
|
+
if (process.platform !== "win32")
|
|
37
|
+
await access(path, constants.X_OK);
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
async function completedRelease(directory, asset) {
|
|
45
|
+
try {
|
|
46
|
+
const record = JSON.parse(await readFile(join(directory, INSTALL_RECORD), "utf8"));
|
|
47
|
+
if (record.sha256 !== asset.sha256 ||
|
|
48
|
+
record.version !== asset.version ||
|
|
49
|
+
record.executable.name !== asset.executable.name ||
|
|
50
|
+
record.executable.bytes !== asset.executable.bytes ||
|
|
51
|
+
record.harness.name !== asset.harness.name ||
|
|
52
|
+
record.harness.bytes !== asset.harness.bytes)
|
|
53
|
+
return null;
|
|
54
|
+
const executablePath = join(directory, asset.executable.name);
|
|
55
|
+
const harnessPath = join(directory, asset.harness.name);
|
|
56
|
+
if (!(await executableFile(executablePath, asset.executable.bytes)))
|
|
57
|
+
return null;
|
|
58
|
+
if (!(await executableFile(harnessPath, asset.harness.bytes)))
|
|
59
|
+
return null;
|
|
60
|
+
return { executablePath, harnessPath, source: "managed", version: asset.version };
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function pathCandidates(binary, env) {
|
|
67
|
+
if (isAbsolute(binary) || binary.includes("/") || binary.includes("\\"))
|
|
68
|
+
return [resolve(binary)];
|
|
69
|
+
const pathValue = process.platform === "win32"
|
|
70
|
+
? Object.entries(env).findLast(([key]) => key.toUpperCase() === "PATH")?.[1]
|
|
71
|
+
: env.PATH;
|
|
72
|
+
return (pathValue ?? augmentedPath())
|
|
73
|
+
.split(delimiter)
|
|
74
|
+
.map((part) => part.trim().replace(/^"|"$/gu, ""))
|
|
75
|
+
.filter(Boolean)
|
|
76
|
+
.map((part) => resolve(part, binary));
|
|
77
|
+
}
|
|
78
|
+
async function externalRuntime(candidate, source) {
|
|
79
|
+
const names = executableNames();
|
|
80
|
+
const executablePath = resolve(candidate);
|
|
81
|
+
const harnessPath = join(dirname(executablePath), names.harness);
|
|
82
|
+
if (!(await executableFile(executablePath)) || !(await executableFile(harnessPath)))
|
|
83
|
+
return null;
|
|
84
|
+
return { executablePath, harnessPath, source, version: null };
|
|
85
|
+
}
|
|
86
|
+
/** Resolve an explicit official ACP binary, the pinned managed release, or an
|
|
87
|
+
* official binary already on PATH. Legacy `agy` commands (including saved
|
|
88
|
+
* absolute paths and Windows shims) migrate without editing user config. */
|
|
89
|
+
export async function resolveAntigravityRuntime(binaryPath, env = process.env, baseDir = DATA_DIR) {
|
|
90
|
+
const override = binaryPath?.trim();
|
|
91
|
+
const legacyCli = override !== undefined && /(?:^|[\\/])agy(?:\.(?:cmd|bat|exe|ps1))?$/iu.test(override);
|
|
92
|
+
if (override && override !== "agy") {
|
|
93
|
+
for (const candidate of pathCandidates(override, env)) {
|
|
94
|
+
const found = await externalRuntime(candidate, "override");
|
|
95
|
+
if (found)
|
|
96
|
+
return found;
|
|
97
|
+
}
|
|
98
|
+
// Older versions saved the detected agy path in engine settings. It is
|
|
99
|
+
// not an official ACP override: installing the new runtime must not leave
|
|
100
|
+
// discovery permanently stuck on that legacy command. A valid explicit
|
|
101
|
+
// ACP executable still wins above, regardless of its filename.
|
|
102
|
+
if (!legacyCli) {
|
|
103
|
+
throw new AntigravitySetupError("The custom Antigravity ACP executable or its localharness_external sibling is missing.");
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const asset = resolveAntigravityReleaseAsset();
|
|
107
|
+
if (asset) {
|
|
108
|
+
const managed = await completedRelease(join(runtimeRoot(baseDir), "versions", asset.sha256), asset);
|
|
109
|
+
if (managed)
|
|
110
|
+
return managed;
|
|
111
|
+
}
|
|
112
|
+
const names = executableNames();
|
|
113
|
+
for (const candidate of pathCandidates(names.executable, env)) {
|
|
114
|
+
const found = await externalRuntime(candidate, "path");
|
|
115
|
+
if (found)
|
|
116
|
+
return found;
|
|
117
|
+
}
|
|
118
|
+
if (!asset) {
|
|
119
|
+
throw new AntigravitySetupError(`Google does not publish an Antigravity runtime for ${process.platform}-${process.arch}. Set a custom executable path.`);
|
|
120
|
+
}
|
|
121
|
+
throw new AntigravitySetupError(legacyCli
|
|
122
|
+
? "Antigravity now uses Google's official runtime. Choose Install official Antigravity, then Sign in with Google. Your previous agy login is not copied."
|
|
123
|
+
: "Antigravity is not installed. Install the official Google runtime to continue.");
|
|
124
|
+
}
|
|
125
|
+
const EOCD_SIGNATURE = 0x06054b50;
|
|
126
|
+
const CENTRAL_SIGNATURE = 0x02014b50;
|
|
127
|
+
const LOCAL_SIGNATURE = 0x04034b50;
|
|
128
|
+
const MAX_EOCD_BYTES = 22 + 0xffff;
|
|
129
|
+
/** Read the ZIP directory without loading Google's 300 MiB archive (or its
|
|
130
|
+
* 1.5 GiB expanded binary) into memory. The whole archive is SHA-pinned first;
|
|
131
|
+
* this parser only accepts the exact two flat members named by the manifest. */
|
|
132
|
+
async function pinnedZipEntries(path) {
|
|
133
|
+
const handle = await open(path, "r");
|
|
134
|
+
try {
|
|
135
|
+
const info = await handle.stat();
|
|
136
|
+
const tailBytes = Math.min(info.size, MAX_EOCD_BYTES);
|
|
137
|
+
const tail = Buffer.alloc(tailBytes);
|
|
138
|
+
const tailOffset = info.size - tailBytes;
|
|
139
|
+
if ((await handle.read(tail, 0, tailBytes, tailOffset)).bytesRead !== tailBytes) {
|
|
140
|
+
throw new Error("The verified archive was truncated.");
|
|
141
|
+
}
|
|
142
|
+
let eocd = -1;
|
|
143
|
+
for (let cursor = tail.length - 22; cursor >= 0; cursor -= 1) {
|
|
144
|
+
if (tail.readUInt32LE(cursor) === EOCD_SIGNATURE
|
|
145
|
+
&& cursor + 22 + tail.readUInt16LE(cursor + 20) === tail.length) {
|
|
146
|
+
eocd = cursor;
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
if (eocd < 0)
|
|
151
|
+
throw new Error("The verified archive has no valid ZIP directory.");
|
|
152
|
+
const disk = tail.readUInt16LE(eocd + 4);
|
|
153
|
+
const directoryDisk = tail.readUInt16LE(eocd + 6);
|
|
154
|
+
const diskEntries = tail.readUInt16LE(eocd + 8);
|
|
155
|
+
const entryCount = tail.readUInt16LE(eocd + 10);
|
|
156
|
+
const directoryBytes = tail.readUInt32LE(eocd + 12);
|
|
157
|
+
const directoryOffset = tail.readUInt32LE(eocd + 16);
|
|
158
|
+
const eocdOffset = tailOffset + eocd;
|
|
159
|
+
if (disk !== 0 || directoryDisk !== 0 || diskEntries !== entryCount || entryCount !== 2
|
|
160
|
+
|| directoryBytes === 0xffffffff || directoryOffset === 0xffffffff
|
|
161
|
+
|| directoryOffset + directoryBytes > eocdOffset)
|
|
162
|
+
throw new Error("The verified archive uses an unsupported ZIP layout.");
|
|
163
|
+
const directory = Buffer.alloc(directoryBytes);
|
|
164
|
+
if ((await handle.read(directory, 0, directoryBytes, directoryOffset)).bytesRead !== directoryBytes) {
|
|
165
|
+
throw new Error("The verified archive directory was truncated.");
|
|
166
|
+
}
|
|
167
|
+
const entries = [];
|
|
168
|
+
let cursor = 0;
|
|
169
|
+
while (cursor < directory.length) {
|
|
170
|
+
if (cursor + 46 > directory.length || directory.readUInt32LE(cursor) !== CENTRAL_SIGNATURE) {
|
|
171
|
+
throw new Error("The verified archive directory is invalid.");
|
|
172
|
+
}
|
|
173
|
+
const flags = directory.readUInt16LE(cursor + 8);
|
|
174
|
+
const compression = directory.readUInt16LE(cursor + 10);
|
|
175
|
+
const compressedBytes = directory.readUInt32LE(cursor + 20);
|
|
176
|
+
const uncompressedBytes = directory.readUInt32LE(cursor + 24);
|
|
177
|
+
const nameBytes = directory.readUInt16LE(cursor + 28);
|
|
178
|
+
const extraBytes = directory.readUInt16LE(cursor + 30);
|
|
179
|
+
const commentBytes = directory.readUInt16LE(cursor + 32);
|
|
180
|
+
const startDisk = directory.readUInt16LE(cursor + 34);
|
|
181
|
+
const externalAttributes = directory.readUInt32LE(cursor + 38);
|
|
182
|
+
const localHeaderOffset = directory.readUInt32LE(cursor + 42);
|
|
183
|
+
const next = cursor + 46 + nameBytes + extraBytes + commentBytes;
|
|
184
|
+
if (next > directory.length || startDisk !== 0 || (flags & 1) !== 0
|
|
185
|
+
|| (compression !== 0 && compression !== 8)
|
|
186
|
+
|| compressedBytes === 0xffffffff || uncompressedBytes === 0xffffffff
|
|
187
|
+
|| localHeaderOffset === 0xffffffff)
|
|
188
|
+
throw new Error("The verified archive contains an unsupported ZIP member.");
|
|
189
|
+
entries.push({
|
|
190
|
+
name: directory.subarray(cursor + 46, cursor + 46 + nameBytes).toString("utf8"),
|
|
191
|
+
compression,
|
|
192
|
+
compressedBytes,
|
|
193
|
+
uncompressedBytes,
|
|
194
|
+
localHeaderOffset,
|
|
195
|
+
externalAttributes,
|
|
196
|
+
});
|
|
197
|
+
cursor = next;
|
|
198
|
+
}
|
|
199
|
+
if (entries.length !== entryCount)
|
|
200
|
+
throw new Error("The verified archive member count is invalid.");
|
|
201
|
+
return entries;
|
|
202
|
+
}
|
|
203
|
+
finally {
|
|
204
|
+
await handle.close();
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
async function zipEntryDataOffset(path, entry) {
|
|
208
|
+
const handle = await open(path, "r");
|
|
209
|
+
try {
|
|
210
|
+
const header = Buffer.alloc(30);
|
|
211
|
+
if ((await handle.read(header, 0, header.length, entry.localHeaderOffset)).bytesRead !== header.length) {
|
|
212
|
+
throw new Error("A verified archive member header was truncated.");
|
|
213
|
+
}
|
|
214
|
+
const nameBytes = header.readUInt16LE(26);
|
|
215
|
+
const extraBytes = header.readUInt16LE(28);
|
|
216
|
+
if (header.readUInt32LE(0) !== LOCAL_SIGNATURE
|
|
217
|
+
|| header.readUInt16LE(8) !== entry.compression
|
|
218
|
+
|| (header.readUInt16LE(6) & 1) !== 0)
|
|
219
|
+
throw new Error("A verified archive member header is invalid.");
|
|
220
|
+
const name = Buffer.alloc(nameBytes);
|
|
221
|
+
if ((await handle.read(name, 0, nameBytes, entry.localHeaderOffset + 30)).bytesRead !== nameBytes) {
|
|
222
|
+
throw new Error("A verified archive member name was truncated.");
|
|
223
|
+
}
|
|
224
|
+
if (name.toString("utf8") !== entry.name)
|
|
225
|
+
throw new Error("A verified archive member name did not match its directory.");
|
|
226
|
+
return entry.localHeaderOffset + 30 + nameBytes + extraBytes;
|
|
227
|
+
}
|
|
228
|
+
finally {
|
|
229
|
+
await handle.close();
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
async function extractPinnedArchive(archivePath, outputDirectory, asset) {
|
|
233
|
+
const expected = new Map([
|
|
234
|
+
[asset.executable.name, asset.executable.bytes],
|
|
235
|
+
[asset.harness.name, asset.harness.bytes],
|
|
236
|
+
]);
|
|
237
|
+
const seen = new Set();
|
|
238
|
+
for (const entry of await pinnedZipEntries(archivePath)) {
|
|
239
|
+
const expectedBytes = expected.get(entry.name);
|
|
240
|
+
const unixType = (entry.externalAttributes >>> 16) & 0o170000;
|
|
241
|
+
if (expectedBytes === undefined || seen.has(entry.name)
|
|
242
|
+
|| entry.name.includes("/") || entry.name.includes("\\")
|
|
243
|
+
|| (unixType !== 0 && unixType !== 0o100000)
|
|
244
|
+
|| entry.uncompressedBytes !== expectedBytes || entry.compressedBytes <= 0)
|
|
245
|
+
throw new Error("The archive contains an unexpected or unsafe file.");
|
|
246
|
+
seen.add(entry.name);
|
|
247
|
+
const dataOffset = await zipEntryDataOffset(archivePath, entry);
|
|
248
|
+
let bytes = 0;
|
|
249
|
+
const counter = new Transform({
|
|
250
|
+
transform(chunk, _encoding, callback) {
|
|
251
|
+
bytes += chunk.length;
|
|
252
|
+
callback(bytes <= expectedBytes ? null : new Error("An extracted file exceeded its pinned size."), chunk);
|
|
253
|
+
},
|
|
254
|
+
});
|
|
255
|
+
const source = createReadStream(archivePath, {
|
|
256
|
+
start: dataOffset,
|
|
257
|
+
end: dataOffset + entry.compressedBytes - 1,
|
|
258
|
+
});
|
|
259
|
+
const destination = createWriteStream(join(outputDirectory, entry.name), { flags: "wx", mode: 0o700 });
|
|
260
|
+
if (entry.compression === 8)
|
|
261
|
+
await pipeline(source, createInflateRaw(), counter, destination);
|
|
262
|
+
else
|
|
263
|
+
await pipeline(source, counter, destination);
|
|
264
|
+
if (bytes !== expectedBytes)
|
|
265
|
+
throw new Error("An extracted file was truncated.");
|
|
266
|
+
}
|
|
267
|
+
if (seen.size !== 2)
|
|
268
|
+
throw new Error("The archive is missing an expected file.");
|
|
269
|
+
}
|
|
270
|
+
async function installOnce(options) {
|
|
271
|
+
const asset = options.asset === undefined ? resolveAntigravityReleaseAsset() : options.asset;
|
|
272
|
+
if (!asset)
|
|
273
|
+
throw new Error(`Google does not publish an Antigravity runtime for ${process.platform}-${process.arch}.`);
|
|
274
|
+
const root = runtimeRoot(options.baseDir);
|
|
275
|
+
const versions = join(root, "versions");
|
|
276
|
+
const destination = join(versions, asset.sha256);
|
|
277
|
+
await mkdir(versions, { recursive: true, mode: 0o700 });
|
|
278
|
+
const existing = await completedRelease(destination, asset);
|
|
279
|
+
if (existing) {
|
|
280
|
+
await options.validate?.(existing, asset.version);
|
|
281
|
+
return existing;
|
|
282
|
+
}
|
|
283
|
+
try {
|
|
284
|
+
const disk = await statfs(versions, { bigint: true });
|
|
285
|
+
const required = BigInt(asset.archiveBytes + asset.executable.bytes + asset.harness.bytes + FREE_SPACE_MARGIN);
|
|
286
|
+
if (disk.bavail * disk.bsize < required) {
|
|
287
|
+
throw new Error(`Antigravity needs at least ${Math.ceil(Number(required) / 1024 / 1024)} MiB of free space to install.`);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
catch (error) {
|
|
291
|
+
if (error instanceof Error && error.message.includes("Antigravity needs"))
|
|
292
|
+
throw error;
|
|
293
|
+
// statfs is unavailable on a few filesystems. The bounded download and
|
|
294
|
+
// extraction checks still fail safely if the disk fills.
|
|
295
|
+
}
|
|
296
|
+
const staging = await mkdtemp(join(versions, `.install-${randomUUID()}-`));
|
|
297
|
+
try {
|
|
298
|
+
const archivePath = join(staging, "download.zip");
|
|
299
|
+
const runtimeDirectory = join(staging, "runtime");
|
|
300
|
+
await mkdir(runtimeDirectory, { mode: 0o700 });
|
|
301
|
+
const controller = new AbortController();
|
|
302
|
+
const timeout = setTimeout(() => controller.abort(), DOWNLOAD_TIMEOUT_MS);
|
|
303
|
+
timeout.unref?.();
|
|
304
|
+
try {
|
|
305
|
+
const response = await (options.fetchImpl ?? fetch)(asset.url, { signal: controller.signal, redirect: "follow" });
|
|
306
|
+
if (!response.ok || !response.body)
|
|
307
|
+
throw new Error(`Google download failed (${response.status}).`);
|
|
308
|
+
const finalUrl = new URL(response.url || asset.url);
|
|
309
|
+
if (finalUrl.protocol !== "https:" || finalUrl.hostname !== "dl.google.com") {
|
|
310
|
+
throw new Error("The Antigravity download redirected outside dl.google.com.");
|
|
311
|
+
}
|
|
312
|
+
const encoding = response.headers.get("content-encoding")?.trim().toLowerCase();
|
|
313
|
+
const length = response.headers.get("content-length");
|
|
314
|
+
if ((!encoding || encoding === "identity") && length && Number(length) !== asset.archiveBytes) {
|
|
315
|
+
throw new Error("The Antigravity download size did not match the pinned release.");
|
|
316
|
+
}
|
|
317
|
+
const handle = await open(archivePath, "wx", 0o600);
|
|
318
|
+
const hash = createHash("sha256");
|
|
319
|
+
let downloaded = 0;
|
|
320
|
+
try {
|
|
321
|
+
for await (const raw of response.body) {
|
|
322
|
+
const chunk = Buffer.from(raw);
|
|
323
|
+
if (downloaded + chunk.length > asset.archiveBytes) {
|
|
324
|
+
throw new Error("The Antigravity download exceeded its pinned size.");
|
|
325
|
+
}
|
|
326
|
+
let offset = 0;
|
|
327
|
+
while (offset < chunk.length) {
|
|
328
|
+
const { bytesWritten } = await handle.write(chunk, offset, chunk.length - offset, null);
|
|
329
|
+
if (bytesWritten <= 0)
|
|
330
|
+
throw new Error("The Antigravity download could not be written completely.");
|
|
331
|
+
offset += bytesWritten;
|
|
332
|
+
}
|
|
333
|
+
hash.update(chunk);
|
|
334
|
+
downloaded += chunk.length;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
finally {
|
|
338
|
+
await handle.close();
|
|
339
|
+
}
|
|
340
|
+
if (downloaded !== asset.archiveBytes || hash.digest("hex") !== asset.sha256) {
|
|
341
|
+
throw new Error("The Antigravity download failed its SHA-256 or size check. Nothing was installed.");
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
finally {
|
|
345
|
+
clearTimeout(timeout);
|
|
346
|
+
}
|
|
347
|
+
await extractPinnedArchive(archivePath, runtimeDirectory, asset);
|
|
348
|
+
if (process.platform !== "win32") {
|
|
349
|
+
await chmod(join(runtimeDirectory, asset.executable.name), 0o755);
|
|
350
|
+
await chmod(join(runtimeDirectory, asset.harness.name), 0o755);
|
|
351
|
+
}
|
|
352
|
+
const candidate = {
|
|
353
|
+
executablePath: join(runtimeDirectory, asset.executable.name),
|
|
354
|
+
harnessPath: join(runtimeDirectory, asset.harness.name),
|
|
355
|
+
source: "managed",
|
|
356
|
+
version: asset.version,
|
|
357
|
+
};
|
|
358
|
+
await options.validate?.(candidate, asset.version);
|
|
359
|
+
const record = {
|
|
360
|
+
sha256: asset.sha256,
|
|
361
|
+
version: asset.version,
|
|
362
|
+
executable: asset.executable,
|
|
363
|
+
harness: asset.harness,
|
|
364
|
+
};
|
|
365
|
+
await writeFile(join(runtimeDirectory, INSTALL_RECORD), `${JSON.stringify(record)}\n`, { flag: "wx", mode: 0o600 });
|
|
366
|
+
try {
|
|
367
|
+
await rename(runtimeDirectory, destination);
|
|
368
|
+
}
|
|
369
|
+
catch (error) {
|
|
370
|
+
const winner = await completedRelease(destination, asset);
|
|
371
|
+
if (!winner)
|
|
372
|
+
throw error;
|
|
373
|
+
}
|
|
374
|
+
const installed = await completedRelease(destination, asset);
|
|
375
|
+
if (!installed)
|
|
376
|
+
throw new Error("The installed Antigravity runtime is incomplete.");
|
|
377
|
+
return installed;
|
|
378
|
+
}
|
|
379
|
+
finally {
|
|
380
|
+
await rm(staging, { recursive: true, force: true });
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
/** Coalesce concurrent clicks so only one large Google artifact is fetched. */
|
|
384
|
+
export function installAntigravityRuntime(options = {}) {
|
|
385
|
+
const key = runtimeRoot(options.baseDir);
|
|
386
|
+
const existing = installs.get(key);
|
|
387
|
+
if (existing)
|
|
388
|
+
return existing;
|
|
389
|
+
const running = installOnce(options).finally(() => installs.delete(key));
|
|
390
|
+
installs.set(key, running);
|
|
391
|
+
return running;
|
|
392
|
+
}
|
|
393
|
+
export function antigravityManagedInstallAvailable() {
|
|
394
|
+
return resolveAntigravityReleaseAsset() !== null;
|
|
395
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { createAcpDriver } from "./acp/core.js";
|
|
2
|
+
import { AntigravityAuthController, antigravityProfileAuthenticated, catalogFromAntigravityConfigOptions, prepareAntigravityProfile, probeAntigravityModels, validateAntigravityRuntime, } from "./antigravity-acp.js";
|
|
3
|
+
import { antigravityManagedInstallAvailable, installAntigravityRuntime, resolveAntigravityRuntime, } from "./antigravity-runtime.js";
|
|
4
|
+
import { resolveAntigravityReleaseAsset } from "./antigravity-release.js";
|
|
5
|
+
export const STATIC_ANTIGRAVITY_MODELS = {
|
|
6
|
+
default: "gemini-3.8-flash-high",
|
|
7
|
+
options: [
|
|
8
|
+
{ id: "gemini-3.8-flash-high", label: "Gemini 3.8 Flash (High)" },
|
|
9
|
+
{ id: "gemini-3.8-flash-medium", label: "Gemini 3.8 Flash (Medium)" },
|
|
10
|
+
{ id: "gemini-3.8-flash-low", label: "Gemini 3.8 Flash (Low)" },
|
|
11
|
+
],
|
|
12
|
+
};
|
|
13
|
+
export function antigravityPermissionMode(fullAuto) {
|
|
14
|
+
return fullAuto ? "yolo" : "default";
|
|
15
|
+
}
|
|
16
|
+
export function antigravityModelsFromSession(value) {
|
|
17
|
+
return catalogFromAntigravityConfigOptions(value, STATIC_ANTIGRAVITY_MODELS.default);
|
|
18
|
+
}
|
|
19
|
+
const managedAsset = resolveAntigravityReleaseAsset();
|
|
20
|
+
const support = {
|
|
21
|
+
driverKind: "antigravityAgent",
|
|
22
|
+
displayName: "Antigravity",
|
|
23
|
+
models: STATIC_ANTIGRAVITY_MODELS,
|
|
24
|
+
defaultCli: "agy", // migration alias: resolveAntigravityRuntime treats it as managed
|
|
25
|
+
nativeSource: "antigravity.acp",
|
|
26
|
+
loginNote: "Antigravity needs a Google account — choose Sign in with Google in engine setup",
|
|
27
|
+
install: {
|
|
28
|
+
docsUrl: "https://github.com/agentclientprotocol/registry/tree/main/antigravity-acp",
|
|
29
|
+
...(managedAsset
|
|
30
|
+
? { managed: { label: "Install official Antigravity", downloadBytes: managedAsset.archiveBytes } }
|
|
31
|
+
: {}),
|
|
32
|
+
},
|
|
33
|
+
images: true,
|
|
34
|
+
spawnArgs: () => [],
|
|
35
|
+
selectModel: { configId: "model" },
|
|
36
|
+
resumeMethod: "resume",
|
|
37
|
+
clientFileSystem: true,
|
|
38
|
+
redactStderr: true,
|
|
39
|
+
sanitizeToolPayload: true,
|
|
40
|
+
resolveModelsOnCreate: false,
|
|
41
|
+
resolveCommand: async (env, config, instanceId) => {
|
|
42
|
+
const runtime = await resolveAntigravityRuntime(config.cli, env);
|
|
43
|
+
const profile = await prepareAntigravityProfile({ instanceId, runtime, baseEnv: env });
|
|
44
|
+
return {
|
|
45
|
+
command: runtime.executablePath,
|
|
46
|
+
args: process.platform === "linux" ? ["--uid="] : [],
|
|
47
|
+
env: profile.environment,
|
|
48
|
+
};
|
|
49
|
+
},
|
|
50
|
+
resolveModels: async (env, config, instanceId) => {
|
|
51
|
+
const runtime = await resolveAntigravityRuntime(config.cli, env);
|
|
52
|
+
const profile = await prepareAntigravityProfile({ instanceId, runtime, baseEnv: env });
|
|
53
|
+
if (!(await antigravityProfileAuthenticated(profile)))
|
|
54
|
+
throw new Error(support.loginNote);
|
|
55
|
+
return probeAntigravityModels({
|
|
56
|
+
runtime,
|
|
57
|
+
profile,
|
|
58
|
+
fallbackDefault: STATIC_ANTIGRAVITY_MODELS.default,
|
|
59
|
+
});
|
|
60
|
+
},
|
|
61
|
+
pickAuthMethod: (methods) => methods.some((method) => method.id === "oauth-personal")
|
|
62
|
+
? "oauth-personal"
|
|
63
|
+
: null,
|
|
64
|
+
authFailure: "fail",
|
|
65
|
+
requireAuthenticationBeforeSpawn: true,
|
|
66
|
+
isAuthenticated: async (env, config, instanceId) => {
|
|
67
|
+
try {
|
|
68
|
+
const runtime = await resolveAntigravityRuntime(config.cli, env);
|
|
69
|
+
const profile = await prepareAntigravityProfile({ instanceId, runtime, baseEnv: env });
|
|
70
|
+
return antigravityProfileAuthenticated(profile);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
snapshot: async (env, config, instanceId) => {
|
|
77
|
+
try {
|
|
78
|
+
const runtime = await resolveAntigravityRuntime(config.cli, env);
|
|
79
|
+
const profile = await prepareAntigravityProfile({ instanceId, runtime, baseEnv: env });
|
|
80
|
+
return {
|
|
81
|
+
state: "available",
|
|
82
|
+
version: runtime.version,
|
|
83
|
+
authenticated: await antigravityProfileAuthenticated(profile),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
return { state: "unavailable", reason: error instanceof Error ? error.message : String(error) };
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
configureSession: async ({ request, sessionId, config }) => {
|
|
91
|
+
const wanted = antigravityPermissionMode(config.fullAuto);
|
|
92
|
+
const result = await request("session/set_config_option", {
|
|
93
|
+
sessionId,
|
|
94
|
+
configId: "mode",
|
|
95
|
+
value: wanted,
|
|
96
|
+
});
|
|
97
|
+
const mode = Array.isArray(result?.configOptions)
|
|
98
|
+
? result.configOptions.find((option) => option?.id === "mode")?.currentValue
|
|
99
|
+
: undefined;
|
|
100
|
+
if (mode !== wanted)
|
|
101
|
+
throw new Error(`Antigravity did not apply ${wanted} permission mode.`);
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
const AcpAntigravityDriver = createAcpDriver(support);
|
|
105
|
+
export const AntigravityDriver = {
|
|
106
|
+
...AcpAntigravityDriver,
|
|
107
|
+
async create(input) {
|
|
108
|
+
const base = await AcpAntigravityDriver.create(input);
|
|
109
|
+
const auth = new AntigravityAuthController();
|
|
110
|
+
const runtimeAndProfile = async () => {
|
|
111
|
+
const environment = { ...process.env, ...input.environment };
|
|
112
|
+
const runtime = await resolveAntigravityRuntime(input.config.cli, environment);
|
|
113
|
+
const profile = await prepareAntigravityProfile({
|
|
114
|
+
instanceId: input.instanceId,
|
|
115
|
+
runtime,
|
|
116
|
+
baseEnv: environment,
|
|
117
|
+
});
|
|
118
|
+
return { runtime, profile };
|
|
119
|
+
};
|
|
120
|
+
return {
|
|
121
|
+
...base,
|
|
122
|
+
get models() {
|
|
123
|
+
return base.models;
|
|
124
|
+
},
|
|
125
|
+
...(antigravityManagedInstallAvailable()
|
|
126
|
+
? {
|
|
127
|
+
installRuntime: async () => {
|
|
128
|
+
await installAntigravityRuntime({ validate: validateAntigravityRuntime });
|
|
129
|
+
},
|
|
130
|
+
}
|
|
131
|
+
: {}),
|
|
132
|
+
startAuthentication: async () => {
|
|
133
|
+
const { runtime, profile } = await runtimeAndProfile();
|
|
134
|
+
return auth.start(runtime, profile);
|
|
135
|
+
},
|
|
136
|
+
completeAuthentication: async (flowId, callbackUrl) => auth.complete(flowId, callbackUrl),
|
|
137
|
+
cancelAuthentication: async () => auth.cancel(),
|
|
138
|
+
dispose: async () => {
|
|
139
|
+
auth.cancel();
|
|
140
|
+
await base.dispose();
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
},
|
|
144
|
+
};
|