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,95 @@
|
|
|
1
|
+
// Gemini CLI harness support — Google's `gemini` CLI over ACP stdio
|
|
2
|
+
// (`gemini --acp`). Rides the generic runtime in acp/core.ts.
|
|
3
|
+
//
|
|
4
|
+
// RETIRED FROM THE DEFAULT FLEET: Google stopped serving Gemini CLI requests
|
|
5
|
+
// for the free/Pro/Ultra tiers on 2026-06-18 and pointed everyone at the
|
|
6
|
+
// Antigravity CLI (see drivers/antigravity.ts), so this only reaches a model
|
|
7
|
+
// on an enterprise licence. Kept registered for exactly that case — add
|
|
8
|
+
// {"instances": {"gemini": {"driver": "geminiAgent"}}} to config.json.
|
|
9
|
+
//
|
|
10
|
+
// Auth reality since 2026-06-18 (#28): consumer "Login with Google" no
|
|
11
|
+
// longer serves the Gemini CLI — consumer tiers route through Antigravity,
|
|
12
|
+
// and the login that produced ~/.gemini/oauth_creds.json stopped working
|
|
13
|
+
// for them. The remaining paths are a GEMINI_API_KEY, Vertex, or an
|
|
14
|
+
// enterprise Code Assist licence (whose OAuth refresh still works). The
|
|
15
|
+
// driver cannot tell a consumer from an enterprise file locally, so the
|
|
16
|
+
// file check only counts a *live-looking* credential (unexpired access
|
|
17
|
+
// token, or a refresh token the CLI may still be able to use) and the
|
|
18
|
+
// login note names the three real paths instead of the retired login.
|
|
19
|
+
//
|
|
20
|
+
// Auth is intentionally lenient (authFailure "continue"): the CLI may run
|
|
21
|
+
// off an ambient login, so we attempt the advertised authenticate method
|
|
22
|
+
// but never hard-fail the turn on it, unlike Grok's subscription-bound
|
|
23
|
+
// cached_token.
|
|
24
|
+
//
|
|
25
|
+
// NOTE: untested against a live `gemini` CLI on this machine (not installed);
|
|
26
|
+
// the ACP flag + auth method ids follow the published Gemini CLI ACP contract
|
|
27
|
+
// and should be re-verified end-to-end once the CLI is present.
|
|
28
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
29
|
+
import { homedir } from "node:os";
|
|
30
|
+
import { join } from "node:path";
|
|
31
|
+
import { createAcpDriver } from "./core.js";
|
|
32
|
+
// Prefer an explicit key method, then personal OAuth, then Vertex — but fall
|
|
33
|
+
// back to whatever the CLI advertises so a new method id still works.
|
|
34
|
+
const AUTH_PREFERENCE = ["gemini-api-key", "oauth-personal", "vertex-ai"];
|
|
35
|
+
/** A stored oauth_creds.json only counts when it looks alive: the access
|
|
36
|
+
* token has not passed its expiry_date, or a refresh token is present that
|
|
37
|
+
* an enterprise licence may still redeem. A stale consumer credential —
|
|
38
|
+
* the common case since 2026-06-18 — reads as not signed in, which is the
|
|
39
|
+
* truthful answer for an engine that would fail its first turn anyway. */
|
|
40
|
+
function liveOauthCredential() {
|
|
41
|
+
try {
|
|
42
|
+
const creds = JSON.parse(readFileSync(join(homedir(), ".gemini", "oauth_creds.json"), "utf8"));
|
|
43
|
+
if (typeof creds.access_token !== "string" || creds.access_token.trim().length === 0)
|
|
44
|
+
return false;
|
|
45
|
+
const hasRefresh = typeof creds.refresh_token === "string" && creds.refresh_token.trim().length > 0;
|
|
46
|
+
if (creds.expiry_date !== undefined) {
|
|
47
|
+
if (typeof creds.expiry_date !== "number" || !Number.isFinite(creds.expiry_date))
|
|
48
|
+
return false;
|
|
49
|
+
return Date.now() < creds.expiry_date || hasRefresh;
|
|
50
|
+
}
|
|
51
|
+
// no recorded expiry — treat possession of the credential as the signal
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const nonBlank = (value) => Boolean(value?.trim());
|
|
59
|
+
/** The credential check as a named function, so the support entry and the
|
|
60
|
+
* exported test surface are the same implementation, not a self-call.
|
|
61
|
+
* Config is unused — kept to match the AcpSupport signature. */
|
|
62
|
+
export function geminiIsAuthenticated(env) {
|
|
63
|
+
return (nonBlank(env.GEMINI_API_KEY) ||
|
|
64
|
+
nonBlank(env.GOOGLE_API_KEY) ||
|
|
65
|
+
(existsSync(join(homedir(), ".gemini", "oauth_creds.json")) && liveOauthCredential()));
|
|
66
|
+
}
|
|
67
|
+
const support = {
|
|
68
|
+
driverKind: "geminiAgent",
|
|
69
|
+
displayName: "Gemini",
|
|
70
|
+
models: {
|
|
71
|
+
default: "gemini-2.5-pro",
|
|
72
|
+
options: [
|
|
73
|
+
{ id: "gemini-2.5-pro", label: "Gemini 2.5 Pro" },
|
|
74
|
+
{ id: "gemini-2.5-flash", label: "Gemini 2.5 Flash" },
|
|
75
|
+
],
|
|
76
|
+
},
|
|
77
|
+
defaultCli: "gemini",
|
|
78
|
+
nativeSource: "gemini.acp",
|
|
79
|
+
loginNote: "Gemini CLI needs a GEMINI_API_KEY, a Vertex AI setup, or an enterprise Code Assist login — consumer Google logins stopped working on 2026-06-18 (use the Antigravity engine for those accounts)",
|
|
80
|
+
// --acp is the stable Gemini CLI surface. --experimental-acp remains an
|
|
81
|
+
// alias for older releases, but using it now emits a deprecation warning.
|
|
82
|
+
spawnArgs: (_config, turn) => ["--acp", ...(turn.model ? ["-m", turn.model] : [])],
|
|
83
|
+
credentialEnv: ["GEMINI_API_KEY", "GOOGLE_API_KEY"],
|
|
84
|
+
pickAuthMethod: (methods) => {
|
|
85
|
+
const ids = methods.map((m) => m.id).filter((id) => typeof id === "string");
|
|
86
|
+
for (const pref of AUTH_PREFERENCE)
|
|
87
|
+
if (ids.includes(pref))
|
|
88
|
+
return pref;
|
|
89
|
+
return ids[0] ?? null;
|
|
90
|
+
},
|
|
91
|
+
authFailure: "continue",
|
|
92
|
+
isAuthenticated: geminiIsAuthenticated,
|
|
93
|
+
buildPromptText: (turn) => (turn.system ? `${turn.system}\n\n${turn.text}` : turn.text),
|
|
94
|
+
};
|
|
95
|
+
export const GeminiAgentDriver = createAcpDriver(support);
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
// Grok Build harness support — the official `grok` CLI over ACP stdio
|
|
2
|
+
// (`grok … agent stdio`), on the grok.com subscription login
|
|
3
|
+
// (~/.grok/auth.json), NOT the xAI API key (that driver is drivers/grok.ts).
|
|
4
|
+
// The generic protocol runtime lives in acp/core.ts; this file is only the
|
|
5
|
+
// per-harness quirks. Verified against grok 1.0.0.
|
|
6
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
7
|
+
import { homedir } from "node:os";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
import { decodeInjectId, hostApiKey, localHost, mergeLocalInject } from "../local-inject.js";
|
|
10
|
+
import { createAcpDriver } from "./core.js";
|
|
11
|
+
export const STATIC_GROK_MODELS = {
|
|
12
|
+
default: "grok-4.6",
|
|
13
|
+
options: [
|
|
14
|
+
{ id: "grok-4.6", label: "Grok 4.6" },
|
|
15
|
+
{ id: "grok-4.5", label: "Grok 4.5" },
|
|
16
|
+
],
|
|
17
|
+
};
|
|
18
|
+
const SLUG = /^[a-z0-9][a-z0-9._-]*$/i;
|
|
19
|
+
function grokHome(env) {
|
|
20
|
+
if (env.GROK_HOME)
|
|
21
|
+
return env.GROK_HOME;
|
|
22
|
+
return join(env.HOME || env.USERPROFILE || homedir(), ".grok");
|
|
23
|
+
}
|
|
24
|
+
function unquote(raw) {
|
|
25
|
+
const value = raw.trim();
|
|
26
|
+
if (value.length >= 2 && value.startsWith('"') && value.endsWith('"')) {
|
|
27
|
+
return value.slice(1, -1).replace(/\\"/g, '"');
|
|
28
|
+
}
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
/** Local slugs from ~/.grok/config.toml, plus the two cloud defaults.
|
|
32
|
+
* `grok -m <slug>` already accepts these; the picker just didn't list them. */
|
|
33
|
+
export function readGrokModelCatalog(env = process.env) {
|
|
34
|
+
const path = join(grokHome(env), "config.toml");
|
|
35
|
+
let text = "";
|
|
36
|
+
try {
|
|
37
|
+
text = readFileSync(path, "utf8");
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return STATIC_GROK_MODELS;
|
|
41
|
+
}
|
|
42
|
+
const options = STATIC_GROK_MODELS.options.map((o) => ({ ...o }));
|
|
43
|
+
const seen = new Set(options.map((o) => o.id));
|
|
44
|
+
let configuredDefault = null;
|
|
45
|
+
let current = null;
|
|
46
|
+
let inModels = false;
|
|
47
|
+
const flush = () => {
|
|
48
|
+
if (!current || !SLUG.test(current.slug) || seen.has(current.slug)) {
|
|
49
|
+
current = null;
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
seen.add(current.slug);
|
|
53
|
+
options.push({ id: current.slug, label: current.name || current.slug, custom: true });
|
|
54
|
+
current = null;
|
|
55
|
+
};
|
|
56
|
+
for (const line of text.split(/\r?\n/)) {
|
|
57
|
+
const stripped = line.trim();
|
|
58
|
+
if (stripped === "[models]") {
|
|
59
|
+
flush();
|
|
60
|
+
inModels = true;
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (stripped.startsWith("[model.") && stripped.endsWith("]")) {
|
|
64
|
+
flush();
|
|
65
|
+
inModels = false;
|
|
66
|
+
let inner = stripped.slice("[model.".length, -1);
|
|
67
|
+
if (inner.startsWith('"') && inner.endsWith('"'))
|
|
68
|
+
inner = inner.slice(1, -1);
|
|
69
|
+
current = { slug: inner };
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (stripped.startsWith("[")) {
|
|
73
|
+
flush();
|
|
74
|
+
inModels = false;
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if (!stripped || stripped.startsWith("#") || !stripped.includes("="))
|
|
78
|
+
continue;
|
|
79
|
+
const eq = stripped.indexOf("=");
|
|
80
|
+
const key = stripped.slice(0, eq).trim();
|
|
81
|
+
const value = unquote(stripped.slice(eq + 1));
|
|
82
|
+
if (current && key === "name" && value)
|
|
83
|
+
current.name = value;
|
|
84
|
+
if (!current && inModels && key === "default")
|
|
85
|
+
configuredDefault = value;
|
|
86
|
+
}
|
|
87
|
+
flush();
|
|
88
|
+
return {
|
|
89
|
+
default: configuredDefault && seen.has(configuredDefault) ? configuredDefault : STATIC_GROK_MODELS.default,
|
|
90
|
+
options,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
function suggestGrokSlug(host, model, taken) {
|
|
94
|
+
let base = `${host}-${model}`.toLowerCase().replace(/[^a-z0-9._-]+/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "");
|
|
95
|
+
if (!base || !/^[a-z]/.test(base))
|
|
96
|
+
base = `m-${base || "model"}`;
|
|
97
|
+
let slug = base;
|
|
98
|
+
let n = 2;
|
|
99
|
+
while (taken.has(slug)) {
|
|
100
|
+
slug = `${base}-${n}`;
|
|
101
|
+
n += 1;
|
|
102
|
+
}
|
|
103
|
+
return slug;
|
|
104
|
+
}
|
|
105
|
+
function quoteToml(value) {
|
|
106
|
+
return `"${value.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`;
|
|
107
|
+
}
|
|
108
|
+
/** Write a [model.slug] block so `grok -m` can reach the injected host. */
|
|
109
|
+
export function ensureGrokInjectSlug(modelId, env = process.env) {
|
|
110
|
+
const inject = decodeInjectId(modelId);
|
|
111
|
+
if (!inject)
|
|
112
|
+
return modelId;
|
|
113
|
+
const host = localHost(inject.host);
|
|
114
|
+
if (!host)
|
|
115
|
+
return modelId;
|
|
116
|
+
const path = join(grokHome(env), "config.toml");
|
|
117
|
+
let text = "";
|
|
118
|
+
try {
|
|
119
|
+
text = readFileSync(path, "utf8");
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
text = "";
|
|
123
|
+
}
|
|
124
|
+
const taken = new Set(STATIC_GROK_MODELS.options.map((option) => option.id));
|
|
125
|
+
let current = null;
|
|
126
|
+
const flush = () => {
|
|
127
|
+
if (!current)
|
|
128
|
+
return;
|
|
129
|
+
taken.add(current.slug);
|
|
130
|
+
if (current.model === inject.model && current.baseUrl === host.baseUrl) {
|
|
131
|
+
found = current.slug;
|
|
132
|
+
}
|
|
133
|
+
current = null;
|
|
134
|
+
};
|
|
135
|
+
let found = null;
|
|
136
|
+
for (const line of text.split(/\r?\n/)) {
|
|
137
|
+
const stripped = line.trim();
|
|
138
|
+
if (stripped.startsWith("[model.") && stripped.endsWith("]")) {
|
|
139
|
+
flush();
|
|
140
|
+
let inner = stripped.slice("[model.".length, -1);
|
|
141
|
+
if (inner.startsWith('"') && inner.endsWith('"'))
|
|
142
|
+
inner = inner.slice(1, -1);
|
|
143
|
+
current = { slug: inner };
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
if (stripped.startsWith("[")) {
|
|
147
|
+
flush();
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
if (!current || !stripped.includes("="))
|
|
151
|
+
continue;
|
|
152
|
+
const eq = stripped.indexOf("=");
|
|
153
|
+
const key = stripped.slice(0, eq).trim();
|
|
154
|
+
const value = unquote(stripped.slice(eq + 1));
|
|
155
|
+
if (key === "model")
|
|
156
|
+
current.model = value;
|
|
157
|
+
if (key === "base_url")
|
|
158
|
+
current.baseUrl = value;
|
|
159
|
+
}
|
|
160
|
+
flush();
|
|
161
|
+
if (found)
|
|
162
|
+
return found;
|
|
163
|
+
const slug = suggestGrokSlug(inject.host, inject.model, taken);
|
|
164
|
+
const heading = /[^a-z0-9_-]/i.test(slug) ? `[model."${slug}"]` : `[model.${slug}]`;
|
|
165
|
+
const block = [
|
|
166
|
+
heading,
|
|
167
|
+
`model = ${quoteToml(inject.model)}`,
|
|
168
|
+
`base_url = ${quoteToml(host.baseUrl)}`,
|
|
169
|
+
`name = ${quoteToml(`${inject.model} (${host.label})`)}`,
|
|
170
|
+
`api_backend = "chat_completions"`,
|
|
171
|
+
`api_key = ${quoteToml(hostApiKey(host, env))}`,
|
|
172
|
+
"",
|
|
173
|
+
].join("\n");
|
|
174
|
+
const next = text && !text.endsWith("\n") ? `${text}\n\n${block}` : `${text}${text ? "\n" : ""}${block}`;
|
|
175
|
+
writeFileSync(path, next);
|
|
176
|
+
return slug;
|
|
177
|
+
}
|
|
178
|
+
const support = {
|
|
179
|
+
driverKind: "grokAgent",
|
|
180
|
+
displayName: "Grok",
|
|
181
|
+
images: false,
|
|
182
|
+
models: STATIC_GROK_MODELS,
|
|
183
|
+
resolveModels: (env) => mergeLocalInject(readGrokModelCatalog(env), env),
|
|
184
|
+
// Grok's accepted levels vary by model and the CLI validates lazily — a
|
|
185
|
+
// rejected level only logs and falls back. Offer the intersection shared
|
|
186
|
+
// by every model in this driver's picker; notably, grok-4.5 rejects xhigh.
|
|
187
|
+
effortLevels: ["low", "medium", "high"],
|
|
188
|
+
defaultCli: "grok",
|
|
189
|
+
nativeSource: "grok.acp",
|
|
190
|
+
loginNote: "Grok CLI is not signed in — run `grok login` in a terminal",
|
|
191
|
+
// No Windows one-liner: the installer is a POSIX shell script, and offering
|
|
192
|
+
// `curl … | bash` there would be advice that cannot run. Windows falls back
|
|
193
|
+
// to docsUrl, which is honest rather than broken.
|
|
194
|
+
install: {
|
|
195
|
+
command: {
|
|
196
|
+
darwin: "curl -fsSL https://x.ai/cli/install.sh | bash",
|
|
197
|
+
linux: "curl -fsSL https://x.ai/cli/install.sh | bash",
|
|
198
|
+
},
|
|
199
|
+
docsUrl: "https://x.ai/cli",
|
|
200
|
+
signInCommand: "grok login",
|
|
201
|
+
},
|
|
202
|
+
// Write the [model.slug] block with the instance HOME/GROK_HOME, then pass
|
|
203
|
+
// the slug on argv. spawnArgs must not call ensureGrokInjectSlug itself —
|
|
204
|
+
// that helper defaults to process.env and would miss the instance override.
|
|
205
|
+
resolveTurnModel: (model, env) => (model ? ensureGrokInjectSlug(model, env) : model),
|
|
206
|
+
// --permission-mode is a global grok flag. -m and --reasoning-effort are
|
|
207
|
+
// agent flags: Grok 1.0.6 only applies them when they sit AFTER `agent`
|
|
208
|
+
// and BEFORE `stdio` (`grok agent -m slug stdio`). Putting -m first is
|
|
209
|
+
// accepted as a TUI option and then ignored, so ACP session/new keeps
|
|
210
|
+
// [models].default (grok-4.6) and oMLX never sees a request.
|
|
211
|
+
spawnArgs: (config, turn) => [
|
|
212
|
+
"--permission-mode",
|
|
213
|
+
config.fullAuto ? "bypassPermissions" : "default",
|
|
214
|
+
"agent",
|
|
215
|
+
...(turn.model ? ["-m", turn.model] : []),
|
|
216
|
+
// long form on purpose: `--effort` is documented as an alias, and an
|
|
217
|
+
// alias is the part a CLI is free to rename
|
|
218
|
+
...(turn.effort ? ["--reasoning-effort", turn.effort] : []),
|
|
219
|
+
"stdio",
|
|
220
|
+
],
|
|
221
|
+
// -m on argv is necessary but not sufficient: session/new still starts on
|
|
222
|
+
// [models].default. Pin the slug over the wire, same as Hermes/Droid.
|
|
223
|
+
async configureSession({ request, sessionId, turn }) {
|
|
224
|
+
if (!turn.model)
|
|
225
|
+
return;
|
|
226
|
+
try {
|
|
227
|
+
await request("session/set_model", { sessionId, modelId: turn.model });
|
|
228
|
+
}
|
|
229
|
+
catch (e) {
|
|
230
|
+
throw new Error(`Grok rejected model "${turn.model}" via session/set_model: ${e.message}. ` +
|
|
231
|
+
`Check that grok is current (1.0.6+ supports it) and that this slug exists in ~/.grok/config.toml.`);
|
|
232
|
+
}
|
|
233
|
+
},
|
|
234
|
+
// The CLI owns its own grok.com login; a leaked API key silently flips
|
|
235
|
+
// billing from the subscription to pay-as-you-go.
|
|
236
|
+
transformEnv: (env) => {
|
|
237
|
+
delete env.XAI_API_KEY;
|
|
238
|
+
},
|
|
239
|
+
// Bind the grok.com subscription login. No API-key fallback by design —
|
|
240
|
+
// an unauthenticated CLI is a user action, not something to paper over.
|
|
241
|
+
pickAuthMethod: (methods) => (methods.some((m) => m.id === "cached_token") ? "cached_token" : null),
|
|
242
|
+
authFailure: "fail",
|
|
243
|
+
isAuthenticated: () => existsSync(join(homedir(), ".grok", "auth.json")),
|
|
244
|
+
// `--append-system-prompt`/`--rules` are accepted by the CLI but do NOT
|
|
245
|
+
// reach the agent-stdio system prompt (verified against 1.0.0), so the
|
|
246
|
+
// persona is prepended codex-style.
|
|
247
|
+
buildPromptText: (turn) => (turn.system ? `${turn.system}\n\n${turn.text}` : turn.text),
|
|
248
|
+
};
|
|
249
|
+
export const GrokAgentDriver = createAcpDriver(support);
|