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,507 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import { mkdir, mkdtemp, readFile, rm, stat } from "node:fs/promises";
3
+ import { request as httpRequest } from "node:http";
4
+ import { tmpdir } from "node:os";
5
+ import { delimiter, join, resolve } from "node:path";
6
+ import { DATA_DIR, stripWorkspaceCredentialEnv } from "../config.js";
7
+ import { writeFileAtomic } from "../atomic.js";
8
+ import { killCliTree, spawnCli } from "../procs.js";
9
+ // Printed on stderr by Google's server, not stdout.
10
+ export const ANTIGRAVITY_AUTH_PREFIX = "Open the following link to authenticate the ACP server: ";
11
+ const AUTH_TIMEOUT_MS = 5 * 60_000;
12
+ // Google's packaged server can take tens of seconds to cold-start, especially
13
+ // on Windows. Match T3 Code's bounded setup allowance, not a fast CLI probe.
14
+ const STARTUP_TIMEOUT_MS = 90_000;
15
+ const MAX_PROTOCOL_LINE_BYTES = 16 * 1024 * 1024;
16
+ // Past the 16 KiB ceiling parseAntigravityAuthorizationUrl accepts, so a
17
+ // partial stderr line is never dropped while it could still become a link.
18
+ const MAX_DIAGNOSTIC_LINE_CHARS = 64 * 1024;
19
+ const REMOVED_ENVIRONMENT_KEYS = new Set([
20
+ "GEMINI_API_KEY",
21
+ "GOOGLE_API_KEY",
22
+ "GOOGLE_APPLICATION_CREDENTIALS",
23
+ "GOOGLE_CLOUD_PROJECT",
24
+ "GOOGLE_CLOUD_LOCATION",
25
+ "GOOGLE_CLOUD_QUOTA_PROJECT",
26
+ "GOOGLE_GENAI_USE_VERTEXAI",
27
+ "GCLOUD_PROJECT",
28
+ "CLOUDSDK_CORE_PROJECT",
29
+ "AGY_ACP_CCPA_PROJECT",
30
+ "AGY_ACP_ENABLE_OAUTH",
31
+ "GEMINI_HOME",
32
+ "AGY_ACP_FORCE_FILE_STORAGE",
33
+ "ANTIGRAVITY_HARNESS_PATH",
34
+ "BROWSER",
35
+ "PYTHONUNBUFFERED",
36
+ "ELECTRON_RUN_AS_NODE",
37
+ ]);
38
+ const BROWSER_MARKER = "__OPENMAUS_ANTIGRAVITY_AUTH_URL__";
39
+ const browserHelperSource = `process.stderr.on("error",()=>process.exit(0)).write(` +
40
+ `"${BROWSER_MARKER}"+JSON.stringify(process.argv[1])+"\\n",` +
41
+ `()=>process.exit(0))`;
42
+ function quoteBrowserArgument(value) {
43
+ return `'${value.replaceAll("'", `'"'"'`)}'`;
44
+ }
45
+ /** Complete lines in a stream buffer, plus the unterminated tail to keep. */
46
+ function takeLines(buffer) {
47
+ const parts = buffer.split("\n");
48
+ const rest = parts.pop() ?? "";
49
+ return { lines: parts.map((line) => line.replace(/\r$/u, "")), rest };
50
+ }
51
+ /** The sign-in link in a server output line, or null for anything else.
52
+ * Google announces it two ways and both land on stderr: it hands the link to
53
+ * $BROWSER — our helper re-emits it JSON-encoded behind a private marker — and
54
+ * it also prints the link in plain text for terminal users. Either is enough;
55
+ * the marker form is preferred because JSON delimits the URL exactly. */
56
+ export function authorizationUrlFromLine(line) {
57
+ if (line.startsWith(ANTIGRAVITY_AUTH_PREFIX))
58
+ return line.slice(ANTIGRAVITY_AUTH_PREFIX.length).trim();
59
+ if (!line.startsWith(BROWSER_MARKER))
60
+ return null;
61
+ try {
62
+ const url = JSON.parse(line.slice(BROWSER_MARKER.length));
63
+ return typeof url === "string" ? url : null;
64
+ }
65
+ catch {
66
+ return null;
67
+ }
68
+ }
69
+ export function antigravityProfileDirectory(instanceId, baseDir = DATA_DIR) {
70
+ return join(baseDir, "providers", "antigravity", createHash("sha256").update(instanceId).digest("hex"));
71
+ }
72
+ /** Every configured Antigravity instance gets an isolated Google profile.
73
+ * Foreign Google credentials are deliberately stripped so selecting this
74
+ * provider can never silently change the account or billing path. */
75
+ export async function prepareAntigravityProfile(input) {
76
+ const directory = resolve(input.profileDirectory ?? antigravityProfileDirectory(input.instanceId, input.baseDir));
77
+ const acpDirectory = join(directory, "antigravity-acp");
78
+ await mkdir(acpDirectory, { recursive: true, mode: 0o700 });
79
+ if (process.platform !== "win32") {
80
+ const { chmod } = await import("node:fs/promises");
81
+ await chmod(directory, 0o700);
82
+ await chmod(acpDirectory, 0o700);
83
+ }
84
+ writeFileAtomic(join(acpDirectory, "settings.json"), `${JSON.stringify({ auth: { type: "oauth-personal" } })}\n`, { mode: 0o600 });
85
+ const executable = process.platform === "win32" ? process.execPath.replaceAll("\\", "/") : process.execPath;
86
+ if (/\r|\n|\0|%s/u.test(executable) || executable.includes(delimiter)) {
87
+ throw new Error("The OpenMausBot runtime path cannot safely suppress Antigravity browser launches.");
88
+ }
89
+ const browserCommand = [executable, "-e", browserHelperSource, "--", "%s"]
90
+ .map(quoteBrowserArgument)
91
+ .join(" ");
92
+ const environment = {};
93
+ for (const [key, value] of Object.entries(input.baseEnv ?? process.env)) {
94
+ if (!REMOVED_ENVIRONMENT_KEYS.has(key.toUpperCase()))
95
+ environment[key] = value;
96
+ }
97
+ stripWorkspaceCredentialEnv(environment);
98
+ Object.assign(environment, {
99
+ GEMINI_HOME: directory,
100
+ AGY_ACP_FORCE_FILE_STORAGE: "1",
101
+ ANTIGRAVITY_HARNESS_PATH: input.runtime.harnessPath,
102
+ BROWSER: browserCommand,
103
+ PYTHONUNBUFFERED: "1",
104
+ ELECTRON_RUN_AS_NODE: "1",
105
+ });
106
+ return { directory, tokenPath: join(acpDirectory, "acp_token.json"), environment };
107
+ }
108
+ export async function antigravityProfileAuthenticated(profile) {
109
+ try {
110
+ const info = await stat(profile.tokenPath);
111
+ if (!info.isFile() || info.size <= 0 || info.size > 1024 * 1024)
112
+ return false;
113
+ await readFile(profile.tokenPath, { encoding: "utf8" });
114
+ return true;
115
+ }
116
+ catch {
117
+ return false;
118
+ }
119
+ }
120
+ /** Tiny dependency-free ACP client for setup/model probes. Actual chat turns
121
+ * continue to use the shared provider-neutral ACP runtime. */
122
+ export class AntigravityAcpClient {
123
+ child;
124
+ nextId = 1;
125
+ pending = new Map();
126
+ buffer = "";
127
+ diagnosticBuffer = "";
128
+ closed = false;
129
+ onAuthorizationUrl;
130
+ constructor(runtime, profile, cwd, onAuthorizationUrl) {
131
+ this.onAuthorizationUrl = onAuthorizationUrl;
132
+ this.child = spawnCli(runtime.executablePath, process.platform === "linux" ? ["--uid="] : [], { cwd, env: profile.environment, stdio: ["pipe", "pipe", "pipe"] });
133
+ this.child.stdout.setEncoding("utf8");
134
+ this.child.stdout.on("data", (chunk) => this.consume(chunk));
135
+ // Google announces the sign-in link on stderr, not stdout. Scan for that
136
+ // one line and drop every other byte: stderr also carries authorization
137
+ // codes, so nothing else is retained or surfaced.
138
+ this.child.stderr.setEncoding("utf8");
139
+ this.child.stderr.on("data", (chunk) => this.consumeDiagnostics(chunk));
140
+ this.child.once("error", (error) => this.failAll(error));
141
+ this.child.once("close", (code) => {
142
+ if (!this.closed)
143
+ this.failAll(new Error(`Antigravity ACP exited ${code ?? "unexpectedly"}.`));
144
+ });
145
+ }
146
+ consume(chunk) {
147
+ this.buffer += chunk;
148
+ if (Buffer.byteLength(this.buffer) > MAX_PROTOCOL_LINE_BYTES) {
149
+ this.failAll(new Error("Antigravity sent a protocol line that is too large."));
150
+ this.close();
151
+ return;
152
+ }
153
+ const { lines, rest } = takeLines(this.buffer);
154
+ this.buffer = rest;
155
+ for (const line of lines) {
156
+ if (this.announceAuthorizationUrl(line))
157
+ continue;
158
+ let message;
159
+ try {
160
+ message = JSON.parse(line);
161
+ }
162
+ catch {
163
+ continue;
164
+ }
165
+ if (typeof message?.id !== "number")
166
+ continue;
167
+ const pending = this.pending.get(message.id);
168
+ if (!pending)
169
+ continue;
170
+ this.pending.delete(message.id);
171
+ if (pending.timer)
172
+ clearTimeout(pending.timer);
173
+ if (message.error) {
174
+ const error = new Error(message.error.message ?? "Antigravity ACP request failed.");
175
+ Object.assign(error, { code: message.error.code, data: message.error.data });
176
+ pending.reject(error);
177
+ }
178
+ else
179
+ pending.resolve(message.result);
180
+ }
181
+ }
182
+ /** Report a sign-in link if this line carries one. Returns whether the line
183
+ * was an announcement, so callers can skip protocol parsing for it. */
184
+ announceAuthorizationUrl(line) {
185
+ const raw = authorizationUrlFromLine(line);
186
+ if (raw === null)
187
+ return false;
188
+ try {
189
+ this.onAuthorizationUrl?.(parseAntigravityAuthorizationUrl(raw).authorizationUrl);
190
+ }
191
+ catch (error) {
192
+ this.failAll(error instanceof Error ? error : new Error(String(error)));
193
+ }
194
+ return true;
195
+ }
196
+ /** Read stderr only far enough to spot the sign-in link. Lines are matched
197
+ * and released immediately and the tail is capped, so no authorization code
198
+ * is ever held. Draining also keeps the pipe from stalling the server. */
199
+ consumeDiagnostics(chunk) {
200
+ const { lines, rest } = takeLines(this.diagnosticBuffer + chunk);
201
+ // A partial line already longer than any legal link cannot become one.
202
+ this.diagnosticBuffer = rest.length > MAX_DIAGNOSTIC_LINE_CHARS ? "" : rest;
203
+ for (const line of lines)
204
+ this.announceAuthorizationUrl(line);
205
+ }
206
+ failAll(error) {
207
+ for (const pending of this.pending.values()) {
208
+ if (pending.timer)
209
+ clearTimeout(pending.timer);
210
+ pending.reject(error);
211
+ }
212
+ this.pending.clear();
213
+ }
214
+ request(method, params, timeoutMs = 30_000) {
215
+ if (this.closed)
216
+ return Promise.reject(new Error("Antigravity ACP is closed."));
217
+ const id = this.nextId++;
218
+ return new Promise((resolveRequest, reject) => {
219
+ const timer = setTimeout(() => {
220
+ this.pending.delete(id);
221
+ reject(new Error(`${method} timed out.`));
222
+ }, timeoutMs);
223
+ timer.unref?.();
224
+ this.pending.set(id, { resolve: resolveRequest, reject, timer });
225
+ this.child.stdin.write(`${JSON.stringify({ jsonrpc: "2.0", id, method, params })}\n`);
226
+ });
227
+ }
228
+ async initialize(timeoutMs = STARTUP_TIMEOUT_MS) {
229
+ return this.request("initialize", {
230
+ protocolVersion: 1,
231
+ clientInfo: { name: "openmausbot", version: "0.0.0" },
232
+ clientCapabilities: { fs: { readTextFile: false, writeTextFile: false }, terminal: false },
233
+ }, timeoutMs);
234
+ }
235
+ close() {
236
+ if (this.closed)
237
+ return;
238
+ this.closed = true;
239
+ this.failAll(new Error("Antigravity ACP was closed."));
240
+ killCliTree(this.child);
241
+ }
242
+ }
243
+ export function parseAntigravityAuthorizationUrl(authorizationUrl) {
244
+ if (authorizationUrl.length > 16_384 || /\s/u.test(authorizationUrl)) {
245
+ throw new Error("Antigravity returned an invalid Google sign-in URL.");
246
+ }
247
+ const url = new URL(authorizationUrl);
248
+ const state = url.searchParams.get("state");
249
+ const redirectUri = url.searchParams.get("redirect_uri");
250
+ if (url.origin !== "https://accounts.google.com" ||
251
+ url.pathname !== "/o/oauth2/v2/auth" ||
252
+ url.username || url.password || url.hash ||
253
+ url.searchParams.getAll("state").length !== 1 ||
254
+ url.searchParams.getAll("redirect_uri").length !== 1 ||
255
+ url.searchParams.getAll("response_type").length !== 1 ||
256
+ url.searchParams.get("response_type") !== "code" ||
257
+ !state || state.length > 512 || /\s/u.test(state) ||
258
+ !redirectUri || !/^http:\/\/127\.0\.0\.1:[1-9][0-9]{0,4}\/$/u.test(redirectUri))
259
+ throw new Error("Antigravity returned an invalid Google sign-in URL.");
260
+ const redirect = new URL(redirectUri);
261
+ if (Number(redirect.port) < 1024 || Number(redirect.port) > 65535) {
262
+ throw new Error("Antigravity returned an invalid Google sign-in URL.");
263
+ }
264
+ return { authorizationUrl, redirectUri, state };
265
+ }
266
+ export function validateAntigravityCallbackUrl(pending, callbackUrl) {
267
+ if (callbackUrl.length > 16_384)
268
+ throw new Error("The sign-in response URL is too long.");
269
+ let callback;
270
+ try {
271
+ callback = new URL(callbackUrl);
272
+ }
273
+ catch {
274
+ throw new Error("Paste the complete redirect URL from Google.");
275
+ }
276
+ const expected = new URL(pending.redirectUri);
277
+ const states = callback.searchParams.getAll("state");
278
+ const codes = callback.searchParams.getAll("code");
279
+ const errors = callback.searchParams.getAll("error");
280
+ const issuers = callback.searchParams.getAll("iss");
281
+ if (callback.protocol !== "http:" || callback.hostname !== "127.0.0.1" ||
282
+ callback.origin !== expected.origin || callback.pathname !== expected.pathname ||
283
+ callback.username || callback.password || callback.hash ||
284
+ states.length !== 1 || states[0] !== pending.state ||
285
+ !((codes.length === 1 && codes[0] && errors.length === 0) ||
286
+ (errors.length === 1 && errors[0] && codes.length === 0)) ||
287
+ issuers.length > 1 || (issuers.length === 1 && issuers[0] !== "https://accounts.google.com"))
288
+ throw new Error("This redirect URL does not belong to the current sign-in.");
289
+ return callback;
290
+ }
291
+ export function forwardAntigravityCallback(callback) {
292
+ return new Promise((resolveForward, reject) => {
293
+ const req = httpRequest({
294
+ protocol: "http:",
295
+ hostname: "127.0.0.1",
296
+ port: callback.port,
297
+ path: `${callback.pathname}${callback.search}`,
298
+ method: "GET",
299
+ agent: false,
300
+ timeout: 10_000,
301
+ }, (response) => {
302
+ response.resume();
303
+ response.once("end", () => {
304
+ const status = response.statusCode ?? 0;
305
+ if (status >= 200 && status < 300)
306
+ resolveForward();
307
+ else
308
+ reject(new Error("Could not deliver the Google sign-in response."));
309
+ });
310
+ response.once("error", reject);
311
+ });
312
+ req.once("timeout", () => req.destroy(new Error("The Google sign-in response timed out.")));
313
+ req.once("error", reject);
314
+ req.end();
315
+ });
316
+ }
317
+ function modelOptions(value) {
318
+ if (!Array.isArray(value))
319
+ return [];
320
+ const result = [];
321
+ const seen = new Set();
322
+ const visit = (entry) => {
323
+ if (Array.isArray(entry?.options))
324
+ return entry.options.forEach(visit);
325
+ const id = typeof entry?.value === "string" ? entry.value : "";
326
+ if (!id || seen.has(id))
327
+ return;
328
+ seen.add(id);
329
+ result.push({ id, label: typeof entry?.name === "string" && entry.name.trim() ? entry.name.trim() : id });
330
+ };
331
+ value.forEach(visit);
332
+ return result;
333
+ }
334
+ export function catalogFromAntigravityConfigOptions(configOptions, fallbackDefault) {
335
+ const model = Array.isArray(configOptions)
336
+ ? configOptions.find((option) => option?.id === "model" && option?.type === "select")
337
+ : null;
338
+ const options = modelOptions(model?.options);
339
+ if (!options.length)
340
+ return null;
341
+ const current = typeof model?.currentValue === "string" ? model.currentValue : "";
342
+ return { default: options.some((option) => option.id === fallbackDefault) ? fallbackDefault : current || options[0].id, options };
343
+ }
344
+ export async function probeAntigravityModels(input) {
345
+ const deadline = Date.now() + (input.timeoutMs ?? STARTUP_TIMEOUT_MS);
346
+ const remaining = () => {
347
+ const milliseconds = deadline - Date.now();
348
+ if (milliseconds <= 0)
349
+ throw new Error("Antigravity model discovery timed out.");
350
+ return milliseconds;
351
+ };
352
+ const client = new AntigravityAcpClient(input.runtime, input.profile, input.cwd ?? input.profile.directory);
353
+ try {
354
+ await client.initialize(remaining());
355
+ await client.request("authenticate", { methodId: "oauth-personal" }, remaining());
356
+ const session = await client.request("session/new", { cwd: input.cwd ?? input.profile.directory, mcpServers: [] }, remaining());
357
+ const catalog = catalogFromAntigravityConfigOptions(session?.configOptions, input.fallbackDefault);
358
+ if (!catalog)
359
+ throw new Error("Antigravity did not return a model catalog for this Google account.");
360
+ return catalog;
361
+ }
362
+ finally {
363
+ client.close();
364
+ }
365
+ }
366
+ /**
367
+ * Validates whether an ACP initialization response matches an official Google Antigravity release.
368
+ *
369
+ * @param initialized - The raw initialization response payload returned by the ACP client.
370
+ * @param expectedVersion - The expected release version tag or semver string.
371
+ * @returns `true` if the initialize result satisfies protocol, agent identity, capability, and auth requirements.
372
+ */
373
+ export function isValidAntigravityInitializeResult(initialized, expectedVersion) {
374
+ if (!initialized || initialized.protocolVersion !== 1)
375
+ return false;
376
+ const name = initialized.agentInfo?.name;
377
+ if (name !== "antigravity-acp" && name !== "Google Antigravity")
378
+ return false;
379
+ const actualVersion = initialized.agentInfo?.version;
380
+ if (typeof actualVersion !== "string")
381
+ return false;
382
+ const normalizedActual = actualVersion.replace(/^agy_acp_server_/u, "").trim();
383
+ const normalizedExpected = expectedVersion.replace(/^agy_acp_server_/u, "").trim();
384
+ if (actualVersion !== expectedVersion && normalizedActual !== normalizedExpected)
385
+ return false;
386
+ // ACP advertises these optional operations as capability objects (including
387
+ // empty objects). Keep accepting the boolean form used by older runtimes.
388
+ const advertised = (value) => value === true
389
+ || (typeof value === "object" && value !== null && !Array.isArray(value));
390
+ if (initialized.agentCapabilities?.loadSession !== true ||
391
+ !advertised(initialized.agentCapabilities?.sessionCapabilities?.resume) ||
392
+ !advertised(initialized.agentCapabilities?.auth?.logout)) {
393
+ return false;
394
+ }
395
+ if (!Array.isArray(initialized.authMethods) || !initialized.authMethods.some((method) => method?.id === "oauth-personal")) {
396
+ return false;
397
+ }
398
+ return true;
399
+ }
400
+ /**
401
+ * Starts a transient Antigravity ACP client against a temporary profile to verify
402
+ * that the downloaded runtime binary starts properly and identifies as the expected release.
403
+ *
404
+ * @param runtime - The resolved Antigravity executable and harness paths.
405
+ * @param expectedVersion - The expected version string or tag.
406
+ * @returns A promise that resolves when verification succeeds, or rejects if initialization fails.
407
+ */
408
+ export async function validateAntigravityRuntime(runtime, expectedVersion) {
409
+ const profileDirectory = await mkdtemp(join(tmpdir(), "openmaus-antigravity-verify-"));
410
+ try {
411
+ const profile = await prepareAntigravityProfile({
412
+ instanceId: `verify-${randomUUID()}`,
413
+ runtime,
414
+ profileDirectory,
415
+ });
416
+ const client = new AntigravityAcpClient(runtime, profile, profileDirectory);
417
+ try {
418
+ const initialized = await client.initialize();
419
+ if (!isValidAntigravityInitializeResult(initialized, expectedVersion)) {
420
+ throw new Error("The download did not identify as the expected Google Antigravity ACP release.");
421
+ }
422
+ }
423
+ finally {
424
+ client.close();
425
+ }
426
+ }
427
+ finally {
428
+ await rm(profileDirectory, { recursive: true, force: true });
429
+ }
430
+ }
431
+ /** One in-flight personal Google login per provider instance. */
432
+ export class AntigravityAuthController {
433
+ flow = null;
434
+ async start(runtime, profile) {
435
+ this.cancel();
436
+ let foundUrl;
437
+ let failUrl;
438
+ const urlPromise = new Promise((resolveUrl, reject) => {
439
+ foundUrl = resolveUrl;
440
+ failUrl = reject;
441
+ });
442
+ const client = new AntigravityAcpClient(runtime, profile, profile.directory, (url) => {
443
+ try {
444
+ foundUrl(parseAntigravityAuthorizationUrl(url));
445
+ }
446
+ catch (error) {
447
+ failUrl(error instanceof Error ? error : new Error(String(error)));
448
+ }
449
+ });
450
+ try {
451
+ await client.initialize();
452
+ const authenticated = client.request("authenticate", { methodId: "oauth-personal" }, AUTH_TIMEOUT_MS);
453
+ let startupTimer;
454
+ const startupTimeout = new Promise((_resolve, reject) => {
455
+ startupTimer = setTimeout(() => reject(new Error("Google sign-in did not start in time.")), STARTUP_TIMEOUT_MS);
456
+ startupTimer.unref?.();
457
+ });
458
+ const outcome = await Promise.race([
459
+ urlPromise.then((request) => ({ kind: "url", request })),
460
+ authenticated.then(() => ({ kind: "done" })),
461
+ startupTimeout,
462
+ ]).finally(() => {
463
+ if (startupTimer)
464
+ clearTimeout(startupTimer);
465
+ });
466
+ if (outcome.kind === "done") {
467
+ client.close();
468
+ return { phase: "succeeded", flowId: null, authorizationUrl: null, expiresAt: null };
469
+ }
470
+ const flow = {
471
+ id: randomUUID(),
472
+ client,
473
+ completed: authenticated,
474
+ pending: { redirectUri: outcome.request.redirectUri, state: outcome.request.state },
475
+ expiresAt: Date.now() + AUTH_TIMEOUT_MS,
476
+ };
477
+ this.flow = flow;
478
+ void authenticated.finally(() => {
479
+ if (this.flow === flow)
480
+ this.flow = null;
481
+ client.close();
482
+ }).catch(() => { });
483
+ return {
484
+ phase: "waiting",
485
+ flowId: flow.id,
486
+ authorizationUrl: outcome.request.authorizationUrl,
487
+ expiresAt: new Date(flow.expiresAt).toISOString(),
488
+ };
489
+ }
490
+ catch (error) {
491
+ client.close();
492
+ throw error;
493
+ }
494
+ }
495
+ async complete(flowId, callbackUrl) {
496
+ const flow = this.flow;
497
+ if (!flow || flow.id !== flowId || Date.now() >= flow.expiresAt) {
498
+ throw new Error("This Google sign-in is no longer active. Start again.");
499
+ }
500
+ await forwardAntigravityCallback(validateAntigravityCallbackUrl(flow.pending, callbackUrl));
501
+ await flow.completed;
502
+ }
503
+ cancel() {
504
+ this.flow?.client.close();
505
+ this.flow = null;
506
+ }
507
+ }
@@ -0,0 +1,65 @@
1
+ // URLs come from Google's official ACP registry entry. Hashes and expanded
2
+ // member sizes were checked independently in T3 Code on 2026-09-03.
3
+ // Registry: agentclientprotocol/registry@81bf71b55e15f630c4fb8a86d20d3088071d2071
4
+ // Metadata: pingdotgg/t3code@8ea52c8f2
5
+ export const ANTIGRAVITY_RELEASE_VERSION = "agy_acp_server_1.1.1";
6
+ const RELEASES = new Map([
7
+ [
8
+ "darwin-arm64",
9
+ {
10
+ version: ANTIGRAVITY_RELEASE_VERSION,
11
+ url: "https://dl.google.com/agy-extensions/releases/macos/agy-acp-server-agy_acp_server_1.1.1-darwin-arm64.zip",
12
+ sha256: "fdfa915652cdb7ba8085cc8fffed072cbe009251aa2c951aabdda07a8c28a189",
13
+ archiveBytes: 316_014_828,
14
+ executable: { name: "agy_acp_server.par", bytes: 802_163_856 },
15
+ harness: { name: "localharness_external", bytes: 116_766_704 },
16
+ },
17
+ ],
18
+ [
19
+ "linux-x64",
20
+ {
21
+ version: ANTIGRAVITY_RELEASE_VERSION,
22
+ url: "https://dl.google.com/agy-extensions/releases/linux/agy-acp-server-agy_acp_server_1.1.1-linux-x86_64.zip",
23
+ sha256: "38f62d01b32deb0907b3d39a71ec301fd36369f6ffd1cf262d4af385177f79df",
24
+ archiveBytes: 681_969_407,
25
+ executable: { name: "agy_acp_server.par", bytes: 1_880_360_328 },
26
+ harness: { name: "localharness_external", bytes: 128_966_920 },
27
+ },
28
+ ],
29
+ [
30
+ "linux-arm64",
31
+ {
32
+ version: ANTIGRAVITY_RELEASE_VERSION,
33
+ url: "https://dl.google.com/agy-extensions/releases/linux/agy-acp-server-agy_acp_server_1.1.1-linux-arm64.zip",
34
+ sha256: "ed69e64b308fcb123ab54bf3277bf9cb0d651064f885ea5aab0ff520c7175398",
35
+ archiveBytes: 656_572_786,
36
+ executable: { name: "agy_acp_server.par", bytes: 1_862_073_131 },
37
+ harness: { name: "localharness_external", bytes: 122_158_704 },
38
+ },
39
+ ],
40
+ [
41
+ "win32-x64",
42
+ {
43
+ version: ANTIGRAVITY_RELEASE_VERSION,
44
+ url: "https://dl.google.com/agy-extensions/releases/windows/agy-acp-server-agy_acp_server_1.1.1-windows-x86_64.zip",
45
+ sha256: "47cb50eef14f0a4655d78cfcfda869bcea7aaee5f9787e936bc2935ea612c3b8",
46
+ archiveBytes: 468_238_392,
47
+ executable: { name: "agy_acp_server.exe", bytes: 430_801_616 },
48
+ harness: { name: "localharness_external.exe", bytes: 130_971_800 },
49
+ },
50
+ ],
51
+ [
52
+ "win32-arm64",
53
+ {
54
+ version: ANTIGRAVITY_RELEASE_VERSION,
55
+ url: "https://dl.google.com/agy-extensions/releases/windows/agy-acp-server-agy_acp_server_1.1.1-windows-arm64.zip",
56
+ sha256: "35f4b1f47ba6a3fea7b0a3e30010df5ea73a64b4f0e7cf991cddc673ddfbcafc",
57
+ archiveBytes: 468_521_191,
58
+ executable: { name: "agy_acp_server.exe", bytes: 435_075_816 },
59
+ harness: { name: "localharness_external.exe", bytes: 122_455_704 },
60
+ },
61
+ ],
62
+ ]);
63
+ export function resolveAntigravityReleaseAsset(platform = process.platform, arch = process.arch) {
64
+ return RELEASES.get(`${platform}-${arch}`) ?? null;
65
+ }