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,175 @@
1
+ // server/drivers/dweb-proxy.ts
2
+ import readline from "node:readline";
3
+ var DWEB = (process.env.DWEB_URL ?? "http://127.0.0.1:49737").replace(/\/+$/, "");
4
+ var DWEB_DISPLAY = (() => {
5
+ try {
6
+ const url = new URL(DWEB);
7
+ url.username = "";
8
+ url.password = "";
9
+ return url.toString().replace(/\/+$/, "");
10
+ } catch {
11
+ return "(invalid DWEB_URL)";
12
+ }
13
+ })();
14
+ var TOOLS = [
15
+ {
16
+ name: "dweb_status",
17
+ description: "Ping the local dweb daemon and report its status: server id, hostname, platform, version, uptime, peer count, and the services it runs. Call this first to confirm the network is reachable and see what's available.",
18
+ inputSchema: { type: "object", properties: {} }
19
+ },
20
+ {
21
+ name: "dweb_repo_status",
22
+ description: "Report the state of the OpenMausBot repository the dweb daemon is tracking: repo name, checked-out branch, last commit, file count, and checkout path.",
23
+ inputSchema: { type: "object", properties: {} }
24
+ },
25
+ {
26
+ name: "dweb_opencode_models",
27
+ description: "List the models available on dweb's opencode integration. Each has an id you can pass to dweb_opencode_run. Returns a note if no models are available.",
28
+ inputSchema: { type: "object", properties: {} }
29
+ },
30
+ {
31
+ name: "dweb_opencode_run",
32
+ description: "Run a model on dweb's opencode integration and wait for the result. Give a command for the model to process; optionally pick a model with the 'model' arg (defaults to dweb's choice). Can take several minutes \u2014 use this for long-running model work and report the output back verbatim.",
33
+ inputSchema: {
34
+ type: "object",
35
+ properties: {
36
+ command: { type: "string", description: "The command/prompt to run on the model." },
37
+ model: { type: "string", description: "Optional model id (from dweb_opencode_models)." }
38
+ },
39
+ required: ["command"]
40
+ }
41
+ }
42
+ ];
43
+ var send = (msg) => process.stdout.write(JSON.stringify(msg) + "\n");
44
+ var ok = (id, result) => send({ jsonrpc: "2.0", id, result });
45
+ var rpcErr = (id, code, message) => send({ jsonrpc: "2.0", id, error: { code, message } });
46
+ var textResult = (id, text, isError = false) => ok(id, { content: [{ type: "text", text }], isError });
47
+ async function api(path, init) {
48
+ const res = await fetch(DWEB + path, {
49
+ signal: AbortSignal.timeout(3e4),
50
+ ...init,
51
+ headers: { "content-type": "application/json", ...init?.headers }
52
+ });
53
+ const body = await res.json().catch(() => ({}));
54
+ if (!res.ok) throw new Error(String(body.error ?? `HTTP ${res.status}`));
55
+ return body;
56
+ }
57
+ async function callTool(name, args) {
58
+ if (name === "dweb_status") {
59
+ const r = await api("/ping");
60
+ const lines = [
61
+ `status: ${String(r.status ?? "unknown")}`,
62
+ `server: ${String(r.server ?? "unknown")}`,
63
+ `id: ${String(r.id ?? "unknown")}`,
64
+ `hostname: ${String(r.hostname ?? "unknown")}`,
65
+ `platform: ${String(r.platform ?? "unknown")}`,
66
+ `version: ${String(r.version ?? "unknown")}`,
67
+ `uptime: ${String(r.uptime ?? "unknown")}`,
68
+ `peers: ${String(r.peers ?? "unknown")}`,
69
+ `services: ${String(r.services ?? "unknown")}`
70
+ ];
71
+ return { text: `dweb status:
72
+ ${lines.join("\n")}` };
73
+ }
74
+ if (name === "dweb_repo_status") {
75
+ const r = await api("/api/repo/status");
76
+ const lines = [
77
+ `repo: ${String(r.repo ?? "unknown")}`,
78
+ `branch: ${String(r.branch ?? "unknown")}`,
79
+ `commit: ${String(r.commit ?? "unknown")}`,
80
+ `files: ${String(r.files ?? "unknown")}`,
81
+ `path: ${String(r.path ?? "unknown")}`
82
+ ];
83
+ return { text: `dweb repo status:
84
+ ${lines.join("\n")}` };
85
+ }
86
+ if (name === "dweb_opencode_models") {
87
+ const r = await api("/api/opencode/models");
88
+ const models = Array.isArray(r.models) ? r.models : [];
89
+ if (!models.length) return { text: "No models available on dweb's opencode integration." };
90
+ const lines = models.map((model) => {
91
+ const id = typeof model === "object" && model !== null && "id" in model ? model.id : model;
92
+ return `- ${String(id)}`;
93
+ });
94
+ return { text: `Models available on dweb's opencode integration:
95
+ ${lines.join("\n")}` };
96
+ }
97
+ if (name === "dweb_opencode_run") {
98
+ if (typeof args.command !== "string" || !args.command.trim()) {
99
+ return { text: "dweb_opencode_run needs a string command.", isError: true };
100
+ }
101
+ if (args.model !== void 0 && typeof args.model !== "string") {
102
+ return { text: "dweb_opencode_run model must be a string.", isError: true };
103
+ }
104
+ const command = args.command.trim();
105
+ const model = args.model?.trim() || void 0;
106
+ const r = await api("/api/opencode/run", {
107
+ method: "POST",
108
+ body: JSON.stringify({ command, ...model !== void 0 ? { model } : {} }),
109
+ signal: AbortSignal.timeout(3e5)
110
+ });
111
+ if (r.status === "error") {
112
+ return {
113
+ text: `dweb request failed at ${DWEB_DISPLAY}: ${String(r.error ?? r.output ?? "opencode run failed")}`,
114
+ isError: true
115
+ };
116
+ }
117
+ return { text: String(r.output ?? "(no output)") };
118
+ }
119
+ return { text: `Unknown tool: ${name}`, isError: true };
120
+ }
121
+ async function handle(msg) {
122
+ const id = msg.id;
123
+ const method = msg.method;
124
+ if (!method) return;
125
+ const params = msg.params ?? {};
126
+ switch (method) {
127
+ case "initialize":
128
+ ok(id, {
129
+ protocolVersion: params.protocolVersion ?? "2024-11-05",
130
+ capabilities: { tools: {} },
131
+ serverInfo: { name: "dweb-proxy", version: "0.1.0" }
132
+ });
133
+ return;
134
+ case "notifications/initialized":
135
+ case "notifications/cancelled":
136
+ return;
137
+ case "ping":
138
+ ok(id, {});
139
+ return;
140
+ case "tools/list":
141
+ ok(id, { tools: TOOLS });
142
+ return;
143
+ case "tools/call": {
144
+ const name = params.name;
145
+ if (!TOOLS.some((t) => t.name === name)) return rpcErr(id, -32602, `Unknown tool: ${name}`);
146
+ try {
147
+ const rawArgs = params.arguments;
148
+ const args = typeof rawArgs === "object" && rawArgs !== null && !Array.isArray(rawArgs) ? rawArgs : {};
149
+ const { text, isError } = await callTool(name, args);
150
+ textResult(id, text, isError);
151
+ } catch (e) {
152
+ const message = e instanceof Error ? e.message : String(e);
153
+ textResult(id, `dweb request failed at ${DWEB_DISPLAY}: ${message}`, true);
154
+ }
155
+ return;
156
+ }
157
+ default:
158
+ if (id !== void 0) rpcErr(id, -32601, `Method not found: ${method}`);
159
+ }
160
+ }
161
+ var rl = readline.createInterface({ input: process.stdin, terminal: false });
162
+ rl.on("line", (line) => {
163
+ const t = line.trim();
164
+ if (!t) return;
165
+ let msg;
166
+ try {
167
+ msg = JSON.parse(t);
168
+ } catch {
169
+ return;
170
+ }
171
+ void handle(msg).catch((e) => {
172
+ if (msg.id !== void 0) rpcErr(msg.id, -32603, e.message);
173
+ });
174
+ });
175
+ rl.on("close", () => process.exit(0));
@@ -0,0 +1,339 @@
1
+ // server/drivers/phone-proxy.ts
2
+ import { spawn } from "node:child_process";
3
+ import { accessSync, constants, existsSync } from "node:fs";
4
+ import { createInterface } from "node:readline";
5
+ import { delimiter, join } from "node:path";
6
+ import { homedir } from "node:os";
7
+ var MAX_ADB_OUTPUT = 16 * 1024 * 1024;
8
+ var PACKAGE = /^[A-Za-z0-9_]+(?:\.[A-Za-z0-9_]+)+$/;
9
+ var COMPONENT = /^([A-Za-z0-9_]+(?:\.[A-Za-z0-9_]+)+)\/\S+$/;
10
+ var SAFE_TEXT = /^[A-Za-z0-9 _.,@-]+$/;
11
+ var KEYCODES = {
12
+ back: "KEYCODE_BACK",
13
+ delete: "KEYCODE_DEL",
14
+ down: "KEYCODE_DPAD_DOWN",
15
+ enter: "KEYCODE_ENTER",
16
+ escape: "KEYCODE_BACK",
17
+ home: "KEYCODE_HOME",
18
+ left: "KEYCODE_DPAD_LEFT",
19
+ recent: "KEYCODE_APP_SWITCH",
20
+ return: "KEYCODE_ENTER",
21
+ right: "KEYCODE_DPAD_RIGHT",
22
+ space: "KEYCODE_SPACE",
23
+ tab: "KEYCODE_TAB",
24
+ up: "KEYCODE_DPAD_UP"
25
+ };
26
+ var KNOWN_PACKAGES = {
27
+ skyscanner: "net.skyscanner.android.main",
28
+ uber: "com.ubercab"
29
+ };
30
+ function executableName(platform = process.platform) {
31
+ return platform === "win32" ? "adb.exe" : "adb";
32
+ }
33
+ function resolveAdbPath(env = process.env, platform = process.platform) {
34
+ const executable = executableName(platform);
35
+ const home = homedir();
36
+ const candidates = [
37
+ env.OMB_ADB_PATH,
38
+ env.OMB_RESOURCES_PATH && join(env.OMB_RESOURCES_PATH, "android-platform-tools", platform, executable),
39
+ ...(env.PATH ?? "").split(delimiter).map((entry) => entry && join(entry, executable)),
40
+ platform === "darwin" && join(home, "Library/Android/sdk/platform-tools/adb"),
41
+ platform === "darwin" && "/opt/homebrew/bin/adb",
42
+ platform === "darwin" && "/usr/local/bin/adb",
43
+ platform === "linux" && join(home, "Android/Sdk/platform-tools/adb")
44
+ ].filter((candidate) => Boolean(candidate));
45
+ for (const candidate of candidates) {
46
+ try {
47
+ accessSync(candidate, constants.X_OK);
48
+ return candidate;
49
+ } catch {
50
+ }
51
+ }
52
+ return null;
53
+ }
54
+ async function runAdb(args, options = {}) {
55
+ const adb = resolveAdbPath();
56
+ if (!adb) throw new Error("Android platform tools are unavailable. Reopen OpenMausBot or install adb.");
57
+ return new Promise((resolve, reject) => {
58
+ const child = spawn(adb, args, { stdio: ["ignore", "pipe", "pipe"], windowsHide: true });
59
+ const stdout = [];
60
+ const stderr = [];
61
+ let size = 0;
62
+ const timer = setTimeout(() => {
63
+ child.kill();
64
+ reject(new Error("The Android device command timed out"));
65
+ }, options.timeoutMs ?? 12e3);
66
+ child.stdout.on("data", (chunk) => {
67
+ size += chunk.length;
68
+ if (size > MAX_ADB_OUTPUT) child.kill();
69
+ else stdout.push(chunk);
70
+ });
71
+ child.stderr.on("data", (chunk) => stderr.push(chunk));
72
+ child.on("error", (error) => {
73
+ clearTimeout(timer);
74
+ reject(error);
75
+ });
76
+ child.on("close", (code) => {
77
+ clearTimeout(timer);
78
+ if (size > MAX_ADB_OUTPUT) return reject(new Error("The Android device returned too much data"));
79
+ if (code !== 0) return reject(new Error(Buffer.concat(stderr).toString("utf8").trim() || `adb exited ${code}`));
80
+ resolve(Buffer.concat(stdout));
81
+ });
82
+ });
83
+ }
84
+ function parseDevices(output) {
85
+ const devices = [];
86
+ for (const raw of output.split(/\r?\n/)) {
87
+ const line = raw.trim();
88
+ if (!line || line.startsWith("List of devices attached") || line.startsWith("* daemon")) continue;
89
+ const [serial, state, ...fields] = line.split(/\s+/);
90
+ if (!serial || !state) continue;
91
+ const connection = serial.startsWith("emulator-") ? "emulator" : serial.includes(":") || serial.startsWith("adb-") ? "network" : "usb";
92
+ const properties = Object.fromEntries(fields.flatMap((field) => {
93
+ const split = field.indexOf(":");
94
+ return split > 0 ? [[field.slice(0, split), field.slice(split + 1)]] : [];
95
+ }));
96
+ devices.push({
97
+ serial,
98
+ state,
99
+ connection,
100
+ model: String(properties.model ?? properties.product ?? "Android device").replaceAll("_", " ")
101
+ });
102
+ }
103
+ return devices;
104
+ }
105
+ async function usbDevices() {
106
+ if (!resolveAdbPath()) return [];
107
+ return parseDevices((await runAdb(["devices", "-l"])).toString("utf8")).filter((device) => device.connection === "usb");
108
+ }
109
+ async function readySerial(requested) {
110
+ const devices = await usbDevices();
111
+ const serial = typeof requested === "string" && requested ? requested : process.env.PH_ANDROID_SERIAL;
112
+ const candidates = serial ? devices.filter((device2) => device2.serial === serial) : devices;
113
+ if (!candidates.length) throw new Error("No physical USB Android device is connected");
114
+ if (candidates.length > 1 && !serial) throw new Error("Multiple USB Android devices are connected; pass serial");
115
+ const device = candidates[0];
116
+ if (device.state === "unauthorized") throw new Error("Unlock the phone and accept Allow USB debugging");
117
+ if (device.state !== "device") throw new Error(`The Android device is ${device.state}`);
118
+ return device.serial;
119
+ }
120
+ async function onDevice(serial, args, binary = false) {
121
+ return runAdb(["-s", serial, ...args], { binary });
122
+ }
123
+ function normalize(value) {
124
+ return value.toLowerCase().replace(/[^a-z0-9]/g, "");
125
+ }
126
+ function parseLaunchablePackages(output) {
127
+ const packages = [];
128
+ for (const raw of output.split(/\r?\n/)) {
129
+ const match = COMPONENT.exec(raw.trim());
130
+ if (match && !packages.includes(match[1])) packages.push(match[1]);
131
+ }
132
+ return packages;
133
+ }
134
+ function findPackages(name, packages) {
135
+ if (PACKAGE.test(name) && packages.includes(name)) return [name];
136
+ const needle = normalize(name);
137
+ const known = KNOWN_PACKAGES[needle];
138
+ if (known && packages.includes(known)) return [known];
139
+ if (needle.length < 4) return [];
140
+ const ranked = [
141
+ (token) => token === needle,
142
+ (token) => token.startsWith(needle),
143
+ (token) => token.includes(needle)
144
+ ];
145
+ for (const matches of ranked) {
146
+ const found = packages.filter((pkg) => pkg.split(".").some((token) => matches(normalize(token))));
147
+ if (found.length) return found;
148
+ }
149
+ return [];
150
+ }
151
+ async function launchablePackages(serial) {
152
+ const output = await onDevice(serial, [
153
+ "shell",
154
+ "cmd",
155
+ "package",
156
+ "query-activities",
157
+ "--brief",
158
+ "-a",
159
+ "android.intent.action.MAIN",
160
+ "-c",
161
+ "android.intent.category.LAUNCHER"
162
+ ]);
163
+ return parseLaunchablePackages(output.toString("utf8"));
164
+ }
165
+ function decodeXml(value) {
166
+ return value.replaceAll("&quot;", '"').replaceAll("&apos;", "'").replaceAll("&lt;", "<").replaceAll("&gt;", ">").replaceAll("&amp;", "&");
167
+ }
168
+ function parseUiNodes(xml) {
169
+ const nodes = [];
170
+ for (const match of xml.matchAll(/<node\s+([^>]+?)\/?\s*>/g)) {
171
+ const attributes = {};
172
+ for (const attribute of match[1].matchAll(/([\w:-]+)="([^"]*)"/g)) {
173
+ attributes[attribute[1]] = decodeXml(attribute[2]);
174
+ }
175
+ const bounds = /^\[(\d+),(\d+)\]\[(\d+),(\d+)\]$/.exec(attributes.bounds ?? "");
176
+ if (!bounds) continue;
177
+ const text = attributes.text ?? "";
178
+ const description = attributes["content-desc"] ?? "";
179
+ if (!text && !description && !attributes["resource-id"]) continue;
180
+ nodes.push({
181
+ text,
182
+ description,
183
+ id: attributes["resource-id"] ?? "",
184
+ className: attributes.class ?? "",
185
+ bounds: [Number(bounds[1]), Number(bounds[2]), Number(bounds[3]), Number(bounds[4])]
186
+ });
187
+ }
188
+ return nodes;
189
+ }
190
+ async function readNodes(serial) {
191
+ const streamed = (await onDevice(serial, ["shell", "uiautomator", "dump", "/dev/tty"])).toString("utf8");
192
+ const streamedStart = streamed.indexOf("<?xml");
193
+ if (streamedStart >= 0) return parseUiNodes(streamed.slice(streamedStart));
194
+ const remotePath = "/data/local/tmp/openmaus-window.xml";
195
+ await onDevice(serial, ["shell", "uiautomator", "dump", remotePath]);
196
+ const saved = (await onDevice(serial, ["shell", "cat", remotePath])).toString("utf8");
197
+ void onDevice(serial, ["shell", "rm", "-f", remotePath]).catch(() => void 0);
198
+ const savedStart = saved.indexOf("<?xml");
199
+ return parseUiNodes(savedStart >= 0 ? saved.slice(savedStart) : saved);
200
+ }
201
+ function nodeLines(nodes) {
202
+ return nodes.slice(0, 250).map((node, index) => {
203
+ const label = [node.text, node.description].filter(Boolean).join(" \xB7 ");
204
+ return `${index}: ${JSON.stringify(label || node.id)} bounds=${node.bounds.join(",")} class=${node.className}`;
205
+ }).join("\n") || "No accessible Android UI text is visible.";
206
+ }
207
+ var TOOLS = [
208
+ { name: "status", description: "Check physical USB Android devices and USB-debugging authorization before any Android phone task.", inputSchema: { type: "object", properties: {} } },
209
+ { name: "read_screen", description: "Read visible text, accessibility labels, resource ids, and pixel bounds from the connected Android screen. Use after every action to verify the result.", inputSchema: { type: "object", properties: { serial: { type: "string" } } } },
210
+ { name: "screenshot", description: "Capture the connected Android screen when accessibility text is insufficient. Returns a PNG image.", inputSchema: { type: "object", properties: { serial: { type: "string" } } } },
211
+ { name: "list_apps", description: "List installed launchable Android package names, optionally filtered by a human app name. Prefer open_app first.", inputSchema: { type: "object", properties: { query: { type: "string" }, serial: { type: "string" } } } },
212
+ { name: "open_app", description: "Open an installed Android app directly by its human name, such as Uber or Skyscanner. Do not scan the app drawer first.", inputSchema: { type: "object", properties: { name: { type: "string" }, serial: { type: "string" } }, required: ["name"] } },
213
+ { name: "tap_text", description: "Tap visible Android text or an accessibility label, then use read_screen to verify.", inputSchema: { type: "object", properties: { text: { type: "string" }, exact: { type: "boolean" }, index: { type: "integer", minimum: 0 }, serial: { type: "string" } }, required: ["text"] } },
214
+ { name: "tap", description: "Tap Android screen pixel coordinates obtained from read_screen or screenshot.", inputSchema: { type: "object", properties: { x: { type: "number" }, y: { type: "number" }, serial: { type: "string" } }, required: ["x", "y"] } },
215
+ { name: "swipe", description: "Swipe the Android screen in a direction, then use read_screen to verify.", inputSchema: { type: "object", properties: { direction: { type: "string", enum: ["up", "down", "left", "right"] }, serial: { type: "string" } }, required: ["direction"] } },
216
+ { name: "type_text", description: "Type basic ASCII text into the focused Android field. Never enter passwords, payment details, or one-time codes.", inputSchema: { type: "object", properties: { text: { type: "string", maxLength: 256 }, serial: { type: "string" } }, required: ["text"] } },
217
+ { name: "press", description: "Press an Android navigation or keyboard key.", inputSchema: { type: "object", properties: { key: { type: "string", enum: Object.keys(KEYCODES) }, serial: { type: "string" } }, required: ["key"] } }
218
+ ];
219
+ var textResult = (text, isError = false) => ({ content: [{ type: "text", text }], ...isError ? { isError: true } : {} });
220
+ async function callTool(name, args) {
221
+ if (name === "status") {
222
+ const adb = resolveAdbPath();
223
+ const devices = adb ? await usbDevices() : [];
224
+ return textResult(JSON.stringify({ available: Boolean(adb), devices }, null, 2));
225
+ }
226
+ const serial = await readySerial(args.serial);
227
+ if (name === "read_screen") return textResult(nodeLines(await readNodes(serial)));
228
+ if (name === "screenshot") {
229
+ const png = await onDevice(serial, ["exec-out", "screencap", "-p"], true);
230
+ if (!png.subarray(0, 8).equals(Buffer.from("89504e470d0a1a0a", "hex"))) throw new Error("Android returned an invalid screenshot");
231
+ return { content: [{ type: "text", text: `Android screenshot from ${serial}` }, { type: "image", data: png.toString("base64"), mimeType: "image/png" }] };
232
+ }
233
+ if (name === "list_apps") {
234
+ const packages = await launchablePackages(serial);
235
+ const query = typeof args.query === "string" ? args.query : "";
236
+ return textResult((query ? findPackages(query, packages) : packages).join("\n") || "No matching launchable app found");
237
+ }
238
+ if (name === "open_app") {
239
+ const appName = String(args.name ?? "").trim();
240
+ if (!appName) throw new Error("name is required");
241
+ const matches = findPackages(appName, await launchablePackages(serial));
242
+ if (matches.length !== 1) throw new Error(matches.length ? `App name is ambiguous: ${matches.join(", ")}` : `No installed launchable app matches ${JSON.stringify(appName)}`);
243
+ await onDevice(serial, ["shell", "monkey", "-p", matches[0], "-c", "android.intent.category.LAUNCHER", "1"]);
244
+ return textResult(`Opened ${appName} (${matches[0]})`);
245
+ }
246
+ if (name === "tap_text") {
247
+ const query = String(args.text ?? "").trim().toLowerCase();
248
+ if (!query) throw new Error("text is required");
249
+ const exact = args.exact === true;
250
+ const hits = (await readNodes(serial)).filter((node) => {
251
+ const labels = [node.text, node.description].filter(Boolean).map((value) => value.toLowerCase());
252
+ return labels.some((label) => exact ? label === query : label.includes(query));
253
+ });
254
+ const index = Number.isInteger(args.index) ? Number(args.index) : 0;
255
+ const hit = hits[index];
256
+ if (!hit) throw new Error(`No visible Android text matches ${JSON.stringify(args.text)}`);
257
+ const [x1, y1, x2, y2] = hit.bounds;
258
+ await onDevice(serial, ["shell", "input", "tap", String(Math.round((x1 + x2) / 2)), String(Math.round((y1 + y2) / 2))]);
259
+ return textResult(`Tapped ${JSON.stringify(hit.text || hit.description)}`);
260
+ }
261
+ if (name === "tap") {
262
+ const x = Number(args.x);
263
+ const y = Number(args.y);
264
+ if (!Number.isFinite(x) || !Number.isFinite(y) || x < 0 || y < 0 || x > 1e4 || y > 1e4) throw new Error("Invalid Android coordinates");
265
+ await onDevice(serial, ["shell", "input", "tap", String(Math.round(x)), String(Math.round(y))]);
266
+ return textResult(`Tapped ${Math.round(x)},${Math.round(y)}`);
267
+ }
268
+ if (name === "swipe") {
269
+ const direction = String(args.direction ?? "");
270
+ const size = (await onDevice(serial, ["shell", "wm", "size"])).toString("utf8");
271
+ const match = /(\d+)x(\d+)/.exec(size);
272
+ if (!match) throw new Error("Could not read Android screen size");
273
+ const width = Number(match[1]);
274
+ const height = Number(match[2]);
275
+ const points = {
276
+ up: [width / 2, height * 0.75, width / 2, height * 0.25],
277
+ down: [width / 2, height * 0.25, width / 2, height * 0.75],
278
+ left: [width * 0.75, height / 2, width * 0.25, height / 2],
279
+ right: [width * 0.25, height / 2, width * 0.75, height / 2]
280
+ };
281
+ const point = points[direction];
282
+ if (!point) throw new Error("Invalid swipe direction");
283
+ await onDevice(serial, ["shell", "input", "swipe", ...point.map((value) => String(Math.round(value))), "260"]);
284
+ return textResult(`Swiped ${direction}`);
285
+ }
286
+ if (name === "type_text") {
287
+ const value = String(args.text ?? "");
288
+ if (!value || value.length > 256 || !SAFE_TEXT.test(value)) throw new Error("Android text supports only basic ASCII text up to 256 characters");
289
+ await onDevice(serial, ["shell", "input", "text", value.replaceAll(" ", "%s")]);
290
+ return textResult("Typed text into the focused Android field");
291
+ }
292
+ if (name === "press") {
293
+ const key = String(args.key ?? "").toLowerCase();
294
+ if (!KEYCODES[key]) throw new Error("Unsupported Android key");
295
+ await onDevice(serial, ["shell", "input", "keyevent", KEYCODES[key]]);
296
+ return textResult(`Pressed ${key}`);
297
+ }
298
+ throw new Error(`Unknown phone tool: ${name}`);
299
+ }
300
+ var send = (message) => process.stdout.write(`${JSON.stringify(message)}
301
+ `);
302
+ var ok = (id, result) => send({ jsonrpc: "2.0", id, result });
303
+ var rpcError = (id, code, message) => send({ jsonrpc: "2.0", id, error: { code, message } });
304
+ async function handle(message) {
305
+ const id = message.id;
306
+ const method = message.method;
307
+ const params = message.params ?? {};
308
+ if (method === "initialize") return ok(id, { protocolVersion: String(params.protocolVersion ?? "2024-11-05"), capabilities: { tools: {} }, serverInfo: { name: "openmausbot-phone", version: "1" } });
309
+ if (method === "notifications/initialized" || method === "notifications/cancelled") return;
310
+ if (method === "ping") return ok(id, {});
311
+ if (method === "tools/list") return ok(id, { tools: TOOLS });
312
+ if (method === "tools/call") {
313
+ const name = String(params.name ?? "");
314
+ if (!TOOLS.some((tool) => tool.name === name)) return rpcError(id, -32602, `Unknown tool: ${name}`);
315
+ try {
316
+ return ok(id, await callTool(name, params.arguments ?? {}));
317
+ } catch (error) {
318
+ return ok(id, textResult(error instanceof Error ? error.message : String(error), true));
319
+ }
320
+ }
321
+ if (id !== void 0) rpcError(id, -32601, `Method not found: ${String(method)}`);
322
+ }
323
+ if (process.argv[1] && existsSync(process.argv[1]) && /phone-proxy\.(?:ts|js)$/.test(process.argv[1])) {
324
+ const lines = createInterface({ input: process.stdin, terminal: false });
325
+ lines.on("line", (line) => {
326
+ try {
327
+ const message = JSON.parse(line);
328
+ void handle(message).catch((error) => rpcError(message.id, -32603, error instanceof Error ? error.message : String(error)));
329
+ } catch {
330
+ }
331
+ });
332
+ }
333
+ export {
334
+ findPackages,
335
+ parseDevices,
336
+ parseLaunchablePackages,
337
+ parseUiNodes,
338
+ resolveAdbPath
339
+ };