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.
Files changed (499) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +14 -0
  3. package/cli.js +2 -0
  4. package/dist/app-icon.svg +29 -0
  5. package/dist/assets/abap-BdImnpbu.js +1 -0
  6. package/dist/assets/actionscript-3-B3316cI-.js +1 -0
  7. package/dist/assets/ada-bCR0ucgS.js +1 -0
  8. package/dist/assets/ahk-CsyLZFj1.js +1 -0
  9. package/dist/assets/ahk2-8Zs4aa1G.js +1 -0
  10. package/dist/assets/andromeeda-C4gqWexZ.js +1 -0
  11. package/dist/assets/angular-html-DA-rfuFy.js +1 -0
  12. package/dist/assets/angular-ts-BrjP3tb8.js +1 -0
  13. package/dist/assets/apache-Pmp26Uib.js +1 -0
  14. package/dist/assets/apex-DhZFqWV2.js +1 -0
  15. package/dist/assets/apl-CORt7UWP.js +1 -0
  16. package/dist/assets/applescript-Co6uUVPk.js +1 -0
  17. package/dist/assets/ara-BRHolxvo.js +1 -0
  18. package/dist/assets/asciidoc-CSVQ5wI8.js +1 -0
  19. package/dist/assets/asm-D_Q5rh1f.js +1 -0
  20. package/dist/assets/astro-HNnZUWAn.js +1 -0
  21. package/dist/assets/aurora-x-D-2ljcwZ.js +1 -0
  22. package/dist/assets/awk-DMzUqQB5.js +1 -0
  23. package/dist/assets/ayu-dark-DYE7WIF3.js +1 -0
  24. package/dist/assets/ayu-light-BA47KaF1.js +1 -0
  25. package/dist/assets/ayu-mirage-32ctXXKs.js +1 -0
  26. package/dist/assets/ballerina-BFfxhgS-.js +1 -0
  27. package/dist/assets/bat-CickPsom.js +1 -0
  28. package/dist/assets/beancount-k_qm7-4y.js +1 -0
  29. package/dist/assets/berry-uYugtg8r.js +1 -0
  30. package/dist/assets/bibtex-CHM0blh-.js +1 -0
  31. package/dist/assets/bicep-Bmn6On1c.js +1 -0
  32. package/dist/assets/bird2-Bx8U0n9b.js +1 -0
  33. package/dist/assets/blade-2xfisSek.js +1 -0
  34. package/dist/assets/bsl-DlhNcFeZ.js +1 -0
  35. package/dist/assets/c-BIGW1oBm.js +1 -0
  36. package/dist/assets/c3-Dp5svz6Z.js +1 -0
  37. package/dist/assets/cadence-Bv_4Rxtq.js +1 -0
  38. package/dist/assets/cairo-KRGpt6FW.js +1 -0
  39. package/dist/assets/catppuccin-frappe-CZL1YF0i.js +1 -0
  40. package/dist/assets/catppuccin-latte-DH-8KZSZ.js +1 -0
  41. package/dist/assets/catppuccin-macchiato-B7yYVSCf.js +1 -0
  42. package/dist/assets/catppuccin-mocha-Ct7hS0mc.js +1 -0
  43. package/dist/assets/chapel-DTp_pixX.js +1 -0
  44. package/dist/assets/clarity-Dn5IMItf.js +1 -0
  45. package/dist/assets/clojure-P80f7IUj.js +1 -0
  46. package/dist/assets/cmake-D1j8_8rp.js +1 -0
  47. package/dist/assets/cobol-nBiQ_Alo.js +1 -0
  48. package/dist/assets/codeowners-Bp6g37R7.js +1 -0
  49. package/dist/assets/codeql-DsOJ9woJ.js +1 -0
  50. package/dist/assets/coffee-Ch7k5sss.js +1 -0
  51. package/dist/assets/common-lisp-Cg-RD9OK.js +1 -0
  52. package/dist/assets/coq-C7JzOVbR.js +1 -0
  53. package/dist/assets/cpp-BMRokrvK.js +1 -0
  54. package/dist/assets/crystal-DGywbUpC.js +1 -0
  55. package/dist/assets/csharp-DSvCPggb.js +1 -0
  56. package/dist/assets/css-CLj8gQPS.js +1 -0
  57. package/dist/assets/csv-fuZLfV_i.js +1 -0
  58. package/dist/assets/cue-D82EKSYY.js +1 -0
  59. package/dist/assets/cypher-COkxafJQ.js +1 -0
  60. package/dist/assets/d-85-TOEBH.js +1 -0
  61. package/dist/assets/dark-plus-C3mMm8J8.js +1 -0
  62. package/dist/assets/dart-bE4Kk8sk.js +1 -0
  63. package/dist/assets/dax-CEL-wOlO.js +1 -0
  64. package/dist/assets/desktop-BmXAJ9_W.js +1 -0
  65. package/dist/assets/diff-D97Zzqfu.js +1 -0
  66. package/dist/assets/docker-BcOcwvcX.js +1 -0
  67. package/dist/assets/dotenv-Da5cRb03.js +1 -0
  68. package/dist/assets/dracula-BzJJZx-M.js +1 -0
  69. package/dist/assets/dracula-soft-BXkSAIEj.js +1 -0
  70. package/dist/assets/dream-maker-BtqSS_iP.js +1 -0
  71. package/dist/assets/edge-FbVlp4U3.js +1 -0
  72. package/dist/assets/elixir-CkH2-t6x.js +1 -0
  73. package/dist/assets/elm-DbKCFpqz.js +1 -0
  74. package/dist/assets/emacs-lisp-C_m_b--Z.js +1 -0
  75. package/dist/assets/erb-DXfck5VN.js +1 -0
  76. package/dist/assets/erlang-DsQrWhSR.js +1 -0
  77. package/dist/assets/everforest-dark-BgDCqdQA.js +1 -0
  78. package/dist/assets/everforest-light-C8M2exoo.js +1 -0
  79. package/dist/assets/fennel-BYunw83y.js +1 -0
  80. package/dist/assets/fish-BvzEVeQv.js +1 -0
  81. package/dist/assets/fluent-C4IJs8-o.js +1 -0
  82. package/dist/assets/fortran-fixed-form-CkoXwp7k.js +1 -0
  83. package/dist/assets/fortran-free-form-BxgE0vQu.js +1 -0
  84. package/dist/assets/fsharp-CXgrBDvD.js +1 -0
  85. package/dist/assets/gdresource-TyuKm33G.js +1 -0
  86. package/dist/assets/gdscript-DqcFQ5yU.js +1 -0
  87. package/dist/assets/gdshader-DkwncUOv.js +1 -0
  88. package/dist/assets/genie-D0YGMca9.js +1 -0
  89. package/dist/assets/gherkin-DyxjwDmM.js +1 -0
  90. package/dist/assets/git-commit-F4YmCXRG.js +1 -0
  91. package/dist/assets/git-rebase-r7XF79zn.js +1 -0
  92. package/dist/assets/github-dark-DHJKELXO.js +1 -0
  93. package/dist/assets/github-dark-default-Cuk6v7N8.js +1 -0
  94. package/dist/assets/github-dark-dimmed-DH5Ifo-i.js +1 -0
  95. package/dist/assets/github-dark-high-contrast-E3gJ1_iC.js +1 -0
  96. package/dist/assets/github-light-DAi9KRSo.js +1 -0
  97. package/dist/assets/github-light-default-D7oLnXFd.js +1 -0
  98. package/dist/assets/github-light-high-contrast-BfjtVDDH.js +1 -0
  99. package/dist/assets/gleam-BspZqrRM.js +1 -0
  100. package/dist/assets/glimmer-js-ByusRIyA.js +1 -0
  101. package/dist/assets/glimmer-ts-BfAWNZQY.js +1 -0
  102. package/dist/assets/glsl-DplSGwfg.js +1 -0
  103. package/dist/assets/gn-n2N0HUVH.js +1 -0
  104. package/dist/assets/gnuplot-DdkO51Og.js +1 -0
  105. package/dist/assets/go-C27-OAKa.js +1 -0
  106. package/dist/assets/graphql-ChdNCCLP.js +1 -0
  107. package/dist/assets/groovy-gcz8RCvz.js +1 -0
  108. package/dist/assets/gruvbox-dark-hard-CFHQjOhq.js +1 -0
  109. package/dist/assets/gruvbox-dark-medium-GsRaNv29.js +1 -0
  110. package/dist/assets/gruvbox-dark-soft-CVdnzihN.js +1 -0
  111. package/dist/assets/gruvbox-light-hard-CH1njM8p.js +1 -0
  112. package/dist/assets/gruvbox-light-medium-DRw_LuNl.js +1 -0
  113. package/dist/assets/gruvbox-light-soft-hJgmCMqR.js +1 -0
  114. package/dist/assets/hack-BWmVpMyf.js +1 -0
  115. package/dist/assets/haml-D5jkg6IW.js +1 -0
  116. package/dist/assets/handlebars-BpdQsYii.js +1 -0
  117. package/dist/assets/haskell-Df6bDoY_.js +1 -0
  118. package/dist/assets/haxe-CfZj7gIn.js +1 -0
  119. package/dist/assets/hcl-BWvSN4gD.js +1 -0
  120. package/dist/assets/hjson-D5-asLiD.js +1 -0
  121. package/dist/assets/hlsl-D3lLCCz7.js +1 -0
  122. package/dist/assets/horizon-BUw7H-hv.js +1 -0
  123. package/dist/assets/horizon-bright-CUuTKBJd.js +1 -0
  124. package/dist/assets/houston-DnULxvSX.js +1 -0
  125. package/dist/assets/html-derivative-DlHx6ybY.js +1 -0
  126. package/dist/assets/html-pp8916En.js +1 -0
  127. package/dist/assets/http-jrhK8wxY.js +1 -0
  128. package/dist/assets/hurl-irOxFIW8.js +1 -0
  129. package/dist/assets/hxml-2-FPmUDs.js +1 -0
  130. package/dist/assets/hy-DFXneXwc.js +1 -0
  131. package/dist/assets/imba-DGztddWO.js +1 -0
  132. package/dist/assets/index-B9rLIY81.js +263 -0
  133. package/dist/assets/index-CJBrtDbC.css +1 -0
  134. package/dist/assets/index-D-u0LYsV.js +153 -0
  135. package/dist/assets/ini-BEwlwnbL.js +1 -0
  136. package/dist/assets/java-CylS5w8V.js +1 -0
  137. package/dist/assets/javascript-wDzz0qaB.js +1 -0
  138. package/dist/assets/jinja-f2NsQr07.js +1 -0
  139. package/dist/assets/jison-wvAkD_A8.js +1 -0
  140. package/dist/assets/json-Cp-IABpG.js +1 -0
  141. package/dist/assets/json5-C9tS-k6U.js +1 -0
  142. package/dist/assets/jsonc-Des-eS-w.js +1 -0
  143. package/dist/assets/jsonl-DcaNXYhu.js +1 -0
  144. package/dist/assets/jsonnet-DFQXde-d.js +1 -0
  145. package/dist/assets/jssm-C2t-YnRu.js +1 -0
  146. package/dist/assets/jsx-g9-lgVsj.js +1 -0
  147. package/dist/assets/julia-5Bft2YPA.js +1 -0
  148. package/dist/assets/just-Cwhn7H3k.js +1 -0
  149. package/dist/assets/kanagawa-dragon-BuwD2xS4.js +1 -0
  150. package/dist/assets/kanagawa-lotus-C3DzagqV.js +1 -0
  151. package/dist/assets/kanagawa-wave-DFGoQZhC.js +1 -0
  152. package/dist/assets/kdl-DV7GczEv.js +1 -0
  153. package/dist/assets/kotlin-BdnUsdx6.js +1 -0
  154. package/dist/assets/kusto-wEQ09or8.js +1 -0
  155. package/dist/assets/laserwave-DUszq2jm.js +1 -0
  156. package/dist/assets/latex-D5pSuvFb.js +1 -0
  157. package/dist/assets/lean-BZvkOJ9d.js +1 -0
  158. package/dist/assets/less-B1dDrJ26.js +1 -0
  159. package/dist/assets/light-plus-B7mTdjB0.js +1 -0
  160. package/dist/assets/liquid-C0sCDyMI.js +1 -0
  161. package/dist/assets/llvm-BZoOZj88.js +1 -0
  162. package/dist/assets/log-2UxHyX5q.js +1 -0
  163. package/dist/assets/logo-BtOb2qkB.js +1 -0
  164. package/dist/assets/lua-BaeVxFsk.js +1 -0
  165. package/dist/assets/luau-BnpPk5vE.js +1 -0
  166. package/dist/assets/make-CHLpvVh8.js +1 -0
  167. package/dist/assets/markdown-Cvjx9yec.js +1 -0
  168. package/dist/assets/marko-DjSrsDqO.js +1 -0
  169. package/dist/assets/material-theme-D5KoaKCx.js +1 -0
  170. package/dist/assets/material-theme-darker-BfHTSMKl.js +1 -0
  171. package/dist/assets/material-theme-lighter-B0m2ddpp.js +1 -0
  172. package/dist/assets/material-theme-ocean-CyktbL80.js +1 -0
  173. package/dist/assets/material-theme-palenight-Csfq5Kiy.js +1 -0
  174. package/dist/assets/matlab-D7o27uSR.js +1 -0
  175. package/dist/assets/mdc-D1_yUvq7.js +1 -0
  176. package/dist/assets/mdx-Cmh6b_Ma.js +1 -0
  177. package/dist/assets/mermaid-CQcHuHx7.js +1 -0
  178. package/dist/assets/min-dark-CafNBF8u.js +1 -0
  179. package/dist/assets/min-light-CTRr51gU.js +1 -0
  180. package/dist/assets/mipsasm-CKIfxQSi.js +1 -0
  181. package/dist/assets/mojo-DJz3ZmWd.js +1 -0
  182. package/dist/assets/monokai-BRVnQi9A.js +1 -0
  183. package/dist/assets/moonbit-CHtswR0a.js +1 -0
  184. package/dist/assets/move-el3G9tDJ.js +1 -0
  185. package/dist/assets/narrat-DRg8JJMk.js +1 -0
  186. package/dist/assets/nextflow-C-mBbutL.js +1 -0
  187. package/dist/assets/nextflow-groovy-vE_lwT2v.js +1 -0
  188. package/dist/assets/nginx-BpAMiNFr.js +1 -0
  189. package/dist/assets/night-owl-C39BiMTA.js +1 -0
  190. package/dist/assets/night-owl-light-CMTm3GFP.js +1 -0
  191. package/dist/assets/nim-BIad80T-.js +1 -0
  192. package/dist/assets/nix-CwoSXNpI.js +1 -0
  193. package/dist/assets/nord-Ddv68eIx.js +1 -0
  194. package/dist/assets/nsis-BlV79W_Q.js +1 -0
  195. package/dist/assets/nushell-D3jzshHO.js +1 -0
  196. package/dist/assets/objective-c-DXmwc3jG.js +1 -0
  197. package/dist/assets/objective-cpp-CLxacb5B.js +1 -0
  198. package/dist/assets/ocaml-C0hk2d4L.js +1 -0
  199. package/dist/assets/odin-BBf5iR-q.js +1 -0
  200. package/dist/assets/one-dark-pro-DVMEJ2y_.js +1 -0
  201. package/dist/assets/one-light-C3Wv6jpd.js +1 -0
  202. package/dist/assets/openscad-C4EeE6gA.js +1 -0
  203. package/dist/assets/org-DM6o9KBp.js +1 -0
  204. package/dist/assets/pascal-D93ZcfNL.js +1 -0
  205. package/dist/assets/perl-B9cMNwum.js +1 -0
  206. package/dist/assets/php-Csjmro_R.js +1 -0
  207. package/dist/assets/pkl-u5AG7uiY.js +1 -0
  208. package/dist/assets/plastic-3e1v2bzS.js +1 -0
  209. package/dist/assets/plsql-ChMvpjG-.js +1 -0
  210. package/dist/assets/po-BTJTHyun.js +1 -0
  211. package/dist/assets/poimandres-CS3Unz2-.js +1 -0
  212. package/dist/assets/polar-C0HS_06l.js +1 -0
  213. package/dist/assets/postcss-CXtECtnM.js +1 -0
  214. package/dist/assets/powerquery-CEu0bR-o.js +1 -0
  215. package/dist/assets/powershell-BmBUJMz7.js +1 -0
  216. package/dist/assets/prisma-Vru482bI.js +1 -0
  217. package/dist/assets/prolog-CbFg5uaA.js +1 -0
  218. package/dist/assets/proto-C7zT0LnQ.js +1 -0
  219. package/dist/assets/pug-DKIMFp6K.js +1 -0
  220. package/dist/assets/puppet-BMWR74SV.js +1 -0
  221. package/dist/assets/purescript-CklMAg4u.js +1 -0
  222. package/dist/assets/python-B6aJPvgy.js +1 -0
  223. package/dist/assets/qml-3beO22l8.js +1 -0
  224. package/dist/assets/qmldir-C8lEn-DE.js +1 -0
  225. package/dist/assets/qss-IeuSbFQv.js +1 -0
  226. package/dist/assets/r-Cf5RLm7j.js +1 -0
  227. package/dist/assets/racket-BqYA7rlc.js +1 -0
  228. package/dist/assets/raku-DXvB9xmW.js +1 -0
  229. package/dist/assets/razor-BjBPvh-w.js +1 -0
  230. package/dist/assets/rbs-CpoqiR4B.js +1 -0
  231. package/dist/assets/red-hvxz__6c.js +1 -0
  232. package/dist/assets/reg-C-SQnVFl.js +1 -0
  233. package/dist/assets/regexp-CDVJQ6XC.js +1 -0
  234. package/dist/assets/rel-C3B-1QV4.js +1 -0
  235. package/dist/assets/riscv-BM1_JUlF.js +1 -0
  236. package/dist/assets/ron-D8l8udqQ.js +1 -0
  237. package/dist/assets/rose-pine-5qJOZa0Y.js +1 -0
  238. package/dist/assets/rose-pine-dawn-zx0QlTCp.js +1 -0
  239. package/dist/assets/rose-pine-moon-C9pEdX9L.js +1 -0
  240. package/dist/assets/rosmsg-BJDFO7_C.js +1 -0
  241. package/dist/assets/rst-bs7f0vWN.js +1 -0
  242. package/dist/assets/ruby-C0TQ7zu5.js +1 -0
  243. package/dist/assets/rust-B1yitclQ.js +1 -0
  244. package/dist/assets/sas-DEy46yEz.js +1 -0
  245. package/dist/assets/sass-Cj5Yp3dK.js +1 -0
  246. package/dist/assets/scala-CqE71os6.js +1 -0
  247. package/dist/assets/scheme-C98Dy4si.js +1 -0
  248. package/dist/assets/scss-D5BDwBP9.js +1 -0
  249. package/dist/assets/sdbl-DVxCFoDh.js +1 -0
  250. package/dist/assets/shaderlab-Dg9Lc6iA.js +1 -0
  251. package/dist/assets/shellscript-Yzrsuije.js +1 -0
  252. package/dist/assets/shellsession-BADoaaVG.js +1 -0
  253. package/dist/assets/slack-dark-BthQWCQV.js +1 -0
  254. package/dist/assets/slack-ochin-DqwNpetd.js +1 -0
  255. package/dist/assets/smalltalk-BOQMe2GC.js +1 -0
  256. package/dist/assets/smithy-cds9vsN8.js +1 -0
  257. package/dist/assets/snazzy-light-Bw305WKR.js +1 -0
  258. package/dist/assets/solarized-dark-CpvCGNkr.js +1 -0
  259. package/dist/assets/solarized-light-Dlz6yCKv.js +1 -0
  260. package/dist/assets/solidity-DijEV5ha.js +1 -0
  261. package/dist/assets/soy-8wufbnw4.js +1 -0
  262. package/dist/assets/sparql-rVzFXLq3.js +1 -0
  263. package/dist/assets/splunk-BtCnVYZw.js +1 -0
  264. package/dist/assets/sql-CRqJ_cUM.js +1 -0
  265. package/dist/assets/ssh-config-_ykCGR6B.js +1 -0
  266. package/dist/assets/stata-DI20mbqo.js +1 -0
  267. package/dist/assets/stylus-BEDo0Tqx.js +1 -0
  268. package/dist/assets/surrealql-Cjom0U5J.js +1 -0
  269. package/dist/assets/svelte-Cy7k_4gC.js +1 -0
  270. package/dist/assets/swift-C2oV4EkX.js +1 -0
  271. package/dist/assets/synthwave-84-CbfX1IO0.js +1 -0
  272. package/dist/assets/system-verilog-0hqHdDBg.js +1 -0
  273. package/dist/assets/systemd-4A_iFExJ.js +1 -0
  274. package/dist/assets/talonscript-CkByrt1z.js +1 -0
  275. package/dist/assets/tasl-QIJgUcNo.js +1 -0
  276. package/dist/assets/tcl-dwOrl1Do.js +1 -0
  277. package/dist/assets/templ-DhtptRzy.js +1 -0
  278. package/dist/assets/terraform-BETggiCN.js +1 -0
  279. package/dist/assets/tex-D96PA37w.js +1 -0
  280. package/dist/assets/tokyo-night-hegEt444.js +1 -0
  281. package/dist/assets/toml-vGWfd6FD.js +1 -0
  282. package/dist/assets/ts-tags-D351s5mN.js +1 -0
  283. package/dist/assets/tsv-B_m7g4N7.js +1 -0
  284. package/dist/assets/tsx-COt5Ahok.js +1 -0
  285. package/dist/assets/turtle-BsS91CYL.js +1 -0
  286. package/dist/assets/twig-27uCiNez.js +1 -0
  287. package/dist/assets/typescript-BPQ3VLAy.js +1 -0
  288. package/dist/assets/typespec-CAFt9gP4.js +1 -0
  289. package/dist/assets/typst-BUadGCkm.js +1 -0
  290. package/dist/assets/v-BGw2Nkan.js +1 -0
  291. package/dist/assets/vala-CsfeWuGM.js +1 -0
  292. package/dist/assets/vb-Cu-pLBUe.js +1 -0
  293. package/dist/assets/verilog-nZwndyjY.js +1 -0
  294. package/dist/assets/vesper-DRje8inN.js +1 -0
  295. package/dist/assets/vhdl-CeAyd5Ju.js +1 -0
  296. package/dist/assets/viml-CJc9bBzg.js +1 -0
  297. package/dist/assets/vitesse-black-Bkuqu6BP.js +1 -0
  298. package/dist/assets/vitesse-dark-D0r3Knsf.js +1 -0
  299. package/dist/assets/vitesse-light-CVO1_9PV.js +1 -0
  300. package/dist/assets/vue-BqiEGhQt.js +1 -0
  301. package/dist/assets/vue-html-AaS7Mt5G.js +1 -0
  302. package/dist/assets/vue-vine-BoDAl6tE.js +1 -0
  303. package/dist/assets/vyper-CDx5xZoG.js +1 -0
  304. package/dist/assets/wasm-CG6Dc4jp.js +1 -0
  305. package/dist/assets/wasm-MzD3tlZU.js +1 -0
  306. package/dist/assets/wenyan-BV7otONQ.js +1 -0
  307. package/dist/assets/wgsl-Dx-B1_4e.js +1 -0
  308. package/dist/assets/wikitext-BhOHFoWU.js +1 -0
  309. package/dist/assets/wit-5i3qLPDT.js +1 -0
  310. package/dist/assets/wolfram-lXgVvXCa.js +1 -0
  311. package/dist/assets/xml-sdJ4AIDG.js +1 -0
  312. package/dist/assets/xsl-CtQFsRM5.js +1 -0
  313. package/dist/assets/yaml-Buea-lGh.js +1 -0
  314. package/dist/assets/zenscript-DVFEvuxE.js +1 -0
  315. package/dist/assets/zig-VOosw3JB.js +1 -0
  316. package/dist/index.html +14 -0
  317. package/dist-server/companion/src/listener.js +187 -0
  318. package/dist-server/computer-proxy.js +1185 -0
  319. package/dist-server/connector-proxy.js +186 -0
  320. package/dist-server/container-mcp.js +15186 -0
  321. package/dist-server/drivers/agents-proxy.js +887 -0
  322. package/dist-server/drivers/browser-proxy.js +15037 -0
  323. package/dist-server/drivers/dweb-proxy.js +175 -0
  324. package/dist-server/drivers/phone-proxy.js +339 -0
  325. package/dist-server/drivers/pi-mcp-extension.ts +638 -0
  326. package/dist-server/index.js +64869 -0
  327. package/dist-server/local-computer.js +198 -0
  328. package/dist-server/mcp-server.js +1233 -0
  329. package/dist-server/openmausbot.js +3671 -0
  330. package/dist-server/pair-cli.js +3671 -0
  331. package/dist-server/permission-proxy.js +126 -0
  332. package/dist-server/prepare-cloudflared.js +253 -0
  333. package/dist-server/proxy-paths.js +29 -0
  334. package/dist-server/server/atomic.js +40 -0
  335. package/dist-server/server/attachments.js +471 -0
  336. package/dist-server/server/auto-approve.js +162 -0
  337. package/dist-server/server/auto-review.js +79 -0
  338. package/dist-server/server/avatar-image.js +144 -0
  339. package/dist-server/server/bot-cwd.js +29 -0
  340. package/dist-server/server/bot-directory.js +127 -0
  341. package/dist-server/server/bot-package.js +268 -0
  342. package/dist-server/server/bot-profile.js +76 -0
  343. package/dist-server/server/box-create-idempotency.js +463 -0
  344. package/dist-server/server/box.js +944 -0
  345. package/dist-server/server/brand.js +65 -0
  346. package/dist-server/server/browser-connection.js +187 -0
  347. package/dist-server/server/browser-lifecycle-cleanup.js +359 -0
  348. package/dist-server/server/calendar-calls.js +314 -0
  349. package/dist-server/server/channel-queue.js +70 -0
  350. package/dist-server/server/checkpoints.js +405 -0
  351. package/dist-server/server/chief-of-staff.js +49 -0
  352. package/dist-server/server/claude-update.js +70 -0
  353. package/dist-server/server/cli.js +524 -0
  354. package/dist-server/server/cloud-backend.js +30 -0
  355. package/dist-server/server/comms-visibility.js +109 -0
  356. package/dist-server/server/composio.js +945 -0
  357. package/dist-server/server/computer-control.js +149 -0
  358. package/dist-server/server/computer-observation.js +133 -0
  359. package/dist-server/server/computer-proxy.js +1061 -0
  360. package/dist-server/server/config.js +760 -0
  361. package/dist-server/server/connector-proxy.js +228 -0
  362. package/dist-server/server/container-computer.js +840 -0
  363. package/dist-server/server/container-mcp.js +27 -0
  364. package/dist-server/server/contracts.js +24 -0
  365. package/dist-server/server/control-client.js +100 -0
  366. package/dist-server/server/data-dir-lease.js +3 -0
  367. package/dist-server/server/decision-log.js +106 -0
  368. package/dist-server/server/delegations.js +628 -0
  369. package/dist-server/server/drivers/acp/core.js +904 -0
  370. package/dist-server/server/drivers/acp/cursor.js +365 -0
  371. package/dist-server/server/drivers/acp/custom.js +51 -0
  372. package/dist-server/server/drivers/acp/droid.js +225 -0
  373. package/dist-server/server/drivers/acp/gemini.js +95 -0
  374. package/dist-server/server/drivers/acp/grok.js +249 -0
  375. package/dist-server/server/drivers/acp/hermes.js +429 -0
  376. package/dist-server/server/drivers/acp/kimi.js +559 -0
  377. package/dist-server/server/drivers/acp/opencode-go.js +370 -0
  378. package/dist-server/server/drivers/acp/qwen.js +98 -0
  379. package/dist-server/server/drivers/agents-proxy.js +941 -0
  380. package/dist-server/server/drivers/antigravity-acp.js +507 -0
  381. package/dist-server/server/drivers/antigravity-release.js +65 -0
  382. package/dist-server/server/drivers/antigravity-runtime.js +395 -0
  383. package/dist-server/server/drivers/antigravity.js +144 -0
  384. package/dist-server/server/drivers/boxagent.js +245 -0
  385. package/dist-server/server/drivers/browser-proxy.js +520 -0
  386. package/dist-server/server/drivers/builtIn.js +36 -0
  387. package/dist-server/server/drivers/claude.js +1337 -0
  388. package/dist-server/server/drivers/codex-catalog.js +409 -0
  389. package/dist-server/server/drivers/codex.js +1116 -0
  390. package/dist-server/server/drivers/dweb-proxy.js +193 -0
  391. package/dist-server/server/drivers/grok.js +48 -0
  392. package/dist-server/server/drivers/grokagent.js +4 -0
  393. package/dist-server/server/drivers/local-inject.js +388 -0
  394. package/dist-server/server/drivers/minimax.js +108 -0
  395. package/dist-server/server/drivers/native.js +21 -0
  396. package/dist-server/server/drivers/openai-chat.js +240 -0
  397. package/dist-server/server/drivers/openai-compat.js +143 -0
  398. package/dist-server/server/drivers/phone-proxy.js +372 -0
  399. package/dist-server/server/drivers/pi.js +855 -0
  400. package/dist-server/server/drivers/retry.js +96 -0
  401. package/dist-server/server/enterprise.js +93 -0
  402. package/dist-server/server/env-path.js +329 -0
  403. package/dist-server/server/environment.js +105 -0
  404. package/dist-server/server/generated-image.js +39 -0
  405. package/dist-server/server/graceful-shutdown.js +24 -0
  406. package/dist-server/server/group-goal-run.js +124 -0
  407. package/dist-server/server/harness/bus.js +86 -0
  408. package/dist-server/server/harness/registry.js +217 -0
  409. package/dist-server/server/index.js +11634 -0
  410. package/dist-server/server/installed-playbooks.js +34 -0
  411. package/dist-server/server/local-computer.js +278 -0
  412. package/dist-server/server/local-routing.js +9 -0
  413. package/dist-server/server/local-vm-idle.js +44 -0
  414. package/dist-server/server/local-vm-inventory.js +34 -0
  415. package/dist-server/server/local-vm-lease.js +58 -0
  416. package/dist-server/server/mcp-bridge.js +251 -0
  417. package/dist-server/server/mcp-probe.js +153 -0
  418. package/dist-server/server/mcp-registry.js +130 -0
  419. package/dist-server/server/member-turn.js +6 -0
  420. package/dist-server/server/message-db.js +358 -0
  421. package/dist-server/server/message-file.js +439 -0
  422. package/dist-server/server/names.js +26 -0
  423. package/dist-server/server/notify.js +69 -0
  424. package/dist-server/server/openmaus-status-capsule.js +329 -0
  425. package/dist-server/server/openmausbot.js +6 -0
  426. package/dist-server/server/package-export.js +157 -0
  427. package/dist-server/server/pair-cli.js +7 -0
  428. package/dist-server/server/peer-approval-key.js +5 -0
  429. package/dist-server/server/peer-approval.js +182 -0
  430. package/dist-server/server/peer-provenance.js +44 -0
  431. package/dist-server/server/peer-roster.js +139 -0
  432. package/dist-server/server/permission-proxy.js +157 -0
  433. package/dist-server/server/phone-secret.js +358 -0
  434. package/dist-server/server/private-screen-capture.js +17 -0
  435. package/dist-server/server/procs.js +123 -0
  436. package/dist-server/server/project-scout.js +304 -0
  437. package/dist-server/server/proxy-paths.js +47 -0
  438. package/dist-server/server/redact.js +102 -0
  439. package/dist-server/server/remote-computer.js +170 -0
  440. package/dist-server/server/repeat-detector.js +48 -0
  441. package/dist-server/server/replies.js +38 -0
  442. package/dist-server/server/request-auth.js +327 -0
  443. package/dist-server/server/room-cwd.js +15 -0
  444. package/dist-server/server/room-post-budget.js +112 -0
  445. package/dist-server/server/room-turn-timeout.js +115 -0
  446. package/dist-server/server/routine-requests.js +871 -0
  447. package/dist-server/server/routines.js +1111 -0
  448. package/dist-server/server/schema.js +11 -0
  449. package/dist-server/server/screen-frame-gate.js +80 -0
  450. package/dist-server/server/section-context.js +85 -0
  451. package/dist-server/server/send-idempotency.js +53 -0
  452. package/dist-server/server/sessions.js +319 -0
  453. package/dist-server/server/skill-fetch.js +148 -0
  454. package/dist-server/server/skill-learn.js +61 -0
  455. package/dist-server/server/skill-library.js +116 -0
  456. package/dist-server/server/skills.js +1223 -0
  457. package/dist-server/server/steer-queue.js +114 -0
  458. package/dist-server/server/store.js +1217 -0
  459. package/dist-server/server/surface.js +107 -0
  460. package/dist-server/server/tailscale.js +103 -0
  461. package/dist-server/server/team-backup.js +183 -0
  462. package/dist-server/server/team-library.js +205 -0
  463. package/dist-server/server/team-manifest.js +224 -0
  464. package/dist-server/server/thread-events.js +226 -0
  465. package/dist-server/server/tts/elevenlabs.js +92 -0
  466. package/dist-server/server/tts/index.js +79 -0
  467. package/dist-server/server/tts/speech-text.js +195 -0
  468. package/dist-server/server/tts/system-voices.js +74 -0
  469. package/dist-server/server/tunnel.js +202 -0
  470. package/dist-server/server/turn-context.js +40 -0
  471. package/dist-server/server/turn-dispatch-guard.js +152 -0
  472. package/dist-server/server/turn-images.js +138 -0
  473. package/dist-server/server/turn-watchdog.js +65 -0
  474. package/dist-server/server/vps-computer.js +1099 -0
  475. package/dist-server/server/vps-container-mcp.js +31 -0
  476. package/dist-server/server/webhook-ingress.js +173 -0
  477. package/dist-server/server/webhooks.js +491 -0
  478. package/dist-server/server/workspace.js +178 -0
  479. package/dist-server/shared/approval-mode.js +39 -0
  480. package/dist-server/shared/bot-avatar.js +33 -0
  481. package/dist-server/shared/bot-profile.js +7 -0
  482. package/dist-server/shared/connector-availability.js +12 -0
  483. package/dist-server/shared/credential-request.js +82 -0
  484. package/dist-server/shared/group-goal-run.js +1 -0
  485. package/dist-server/shared/import-name.js +11 -0
  486. package/dist-server/shared/mascot-bodies.js +107 -0
  487. package/dist-server/shared/routine-request.js +10 -0
  488. package/dist-server/shared/routine-run.js +1 -0
  489. package/dist-server/shared/skill-request.js +16 -0
  490. package/dist-server/shared/team-backup.js +148 -0
  491. package/dist-server/src/lib/composer-attachments.js +676 -0
  492. package/dist-server/tunnel-guardian.js +390 -0
  493. package/dist-server/vps-container-mcp.js +15209 -0
  494. package/package.json +32 -0
  495. package/skills/create-verification-skill/SKILL.md +65 -0
  496. package/skills/create-verification-skill/manifest.json +13 -0
  497. package/skills/phone-harness/SKILL.md +26 -0
  498. package/skills/phone-harness/agents/openai.yaml +13 -0
  499. 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
+ };