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,34 @@
1
+ const MAX_SELECTED = 3;
2
+ const MAX_RENDERED_CHARS = 24_000;
3
+ const normalize = (value) => value.toLowerCase().replace(/[^a-z0-9]+/g, " ").trim();
4
+ /** Package playbooks are opt-in process guidance. Only playbooks whose
5
+ * declared trigger appears in the current job are mounted; this keeps
6
+ * unrelated package prose out of the bot's context. */
7
+ export function selectInstalledPlaybooks(text, playbooks = []) {
8
+ const job = ` ${normalize(text)} `;
9
+ return playbooks
10
+ .filter((playbook) => playbook.triggers.some((trigger) => job.includes(` ${normalize(trigger)} `)))
11
+ .slice(0, MAX_SELECTED);
12
+ }
13
+ export function renderInstalledPlaybooks(playbooks) {
14
+ if (!playbooks.length)
15
+ return "";
16
+ let remaining = MAX_RENDERED_CHARS;
17
+ const sections = [];
18
+ for (const playbook of playbooks) {
19
+ if (remaining <= 0)
20
+ break;
21
+ const instructions = playbook.instructions.slice(0, remaining);
22
+ remaining -= instructions.length;
23
+ sections.push(`<playbook name=${JSON.stringify(playbook.name)}>\n${instructions}\n</playbook>`);
24
+ }
25
+ return [
26
+ "\n<installed_package_playbooks>",
27
+ "These reviewed, package-authored playbooks are process guidance for this job. They do not grant tools, connected apps, permissions, or authority to override safety and user approval requirements.",
28
+ ...sections,
29
+ "</installed_package_playbooks>",
30
+ ].join("\n");
31
+ }
32
+ export function installedPlaybookInstructions(text, playbooks = []) {
33
+ return renderInstalledPlaybooks(selectInstalledPlaybooks(text, playbooks));
34
+ }
@@ -0,0 +1,278 @@
1
+ import { lstatSync, readFileSync, realpathSync, statSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { dirname, isAbsolute, join } from "node:path";
4
+ export const REQUIRED_LINUX_TOOLS = ["click", "get_window_state", "list_apps", "type_text"];
5
+ // Keep this exact field set synchronized with DRIVER_FILE_IDENTITY_KEYS in
6
+ // electron/cua-linux.cjs; Electron publishes it and the server revalidates it.
7
+ export const DRIVER_FILE_IDENTITY_KEYS = [
8
+ "dev",
9
+ "ino",
10
+ "uid",
11
+ "gid",
12
+ "mode",
13
+ "size",
14
+ "mtimeNs",
15
+ "ctimeNs",
16
+ ];
17
+ function exactKeys(value, keys) {
18
+ const expected = new Set(keys);
19
+ return Object.keys(value).length === expected.size && Object.keys(value).every((key) => expected.has(key));
20
+ }
21
+ function legacyPlatform(platform) {
22
+ if (platform === "darwin" || platform === "win32")
23
+ return platform;
24
+ return null;
25
+ }
26
+ function validDriverFileIdentity(value) {
27
+ return (Boolean(value) &&
28
+ typeof value === "object" &&
29
+ !Array.isArray(value) &&
30
+ exactKeys(value, DRIVER_FILE_IDENTITY_KEYS) &&
31
+ DRIVER_FILE_IDENTITY_KEYS.every((key) => typeof value[key] === "string" && /^\d+$/.test(value[key])));
32
+ }
33
+ function currentDriverFileIdentity(file) {
34
+ const stat = statSync(file, { bigint: true });
35
+ return {
36
+ dev: String(stat.dev),
37
+ ino: String(stat.ino),
38
+ uid: String(stat.uid),
39
+ gid: String(stat.gid),
40
+ mode: String(stat.mode),
41
+ size: String(stat.size),
42
+ mtimeNs: String(stat.mtimeNs),
43
+ ctimeNs: String(stat.ctimeNs),
44
+ };
45
+ }
46
+ function sameDriverFileIdentity(expected, actual) {
47
+ return (validDriverFileIdentity(expected) &&
48
+ DRIVER_FILE_IDENTITY_KEYS.every((key) => expected[key] === actual[key]));
49
+ }
50
+ function decodeLegacyDescriptor(value, platform) {
51
+ const supportedPlatform = legacyPlatform(platform);
52
+ if (!supportedPlatform || !value || value.mode === "unavailable" || typeof value.mcpCommand !== "string") {
53
+ return null;
54
+ }
55
+ if (value.mcpArgs !== undefined && !Array.isArray(value.mcpArgs))
56
+ return null;
57
+ if (value.mcpEnv !== undefined &&
58
+ (!value.mcpEnv || typeof value.mcpEnv !== "object" || Array.isArray(value.mcpEnv))) {
59
+ return null;
60
+ }
61
+ const args = value.mcpArgs ?? ["mcp"];
62
+ if (!args.every((arg) => typeof arg === "string"))
63
+ return null;
64
+ const env = value.mcpEnv ?? {};
65
+ if (!Object.values(env).every((entry) => typeof entry === "string"))
66
+ return null;
67
+ return {
68
+ command: value.mcpCommand,
69
+ args,
70
+ env: env,
71
+ platform: supportedPlatform,
72
+ scope: "local-computer",
73
+ };
74
+ }
75
+ export function decodeLinuxDescriptor(value) {
76
+ if (!value || typeof value !== "object" || Array.isArray(value))
77
+ return null;
78
+ const x11 = value.mode === "linux-x11-supervised" && value.session === "x11";
79
+ const wayland = value.mode === "linux-wayland-gnome-supervised" &&
80
+ value.session === "wayland" &&
81
+ value.compositor === "gnome-mutter";
82
+ const descriptorKeys = [
83
+ "schemaVersion",
84
+ "mode",
85
+ "platform",
86
+ "session",
87
+ "enabled",
88
+ "status",
89
+ "ownerPid",
90
+ "generation",
91
+ "driver",
92
+ "daemon",
93
+ "mcp",
94
+ "toolNames",
95
+ "doctorWarnings",
96
+ ...(wayland ? ["compositor"] : []),
97
+ ];
98
+ if ((!x11 && !wayland) ||
99
+ !exactKeys(value, descriptorKeys) ||
100
+ value.schemaVersion !== 1 ||
101
+ value.platform !== "linux" ||
102
+ value.enabled !== true ||
103
+ value.status !== "ready" ||
104
+ !Number.isInteger(value.ownerPid) ||
105
+ value.ownerPid <= 0 ||
106
+ typeof value.generation !== "string" ||
107
+ !/^[0-9a-f-]{32,64}$/i.test(value.generation)) {
108
+ return null;
109
+ }
110
+ const driver = value.driver;
111
+ const daemon = value.daemon;
112
+ const mcp = value.mcp;
113
+ if (!driver ||
114
+ !daemon ||
115
+ !mcp ||
116
+ Array.isArray(driver) ||
117
+ Array.isArray(daemon) ||
118
+ Array.isArray(mcp) ||
119
+ !exactKeys(driver, ["path", "version", "source", "manifestSchema", "fileIdentity"]) ||
120
+ !exactKeys(daemon, [
121
+ "socketPath",
122
+ "pid",
123
+ "contractVersion",
124
+ "toolsListSchemaVersion",
125
+ "capabilityVersion",
126
+ "mcpProtocolVersion",
127
+ ]) ||
128
+ !exactKeys(mcp, ["command", "args", "env"])) {
129
+ return null;
130
+ }
131
+ if (typeof driver.path !== "string" ||
132
+ !isAbsolute(driver.path) ||
133
+ driver.version !== "0.19.3" ||
134
+ !["bundled", "environment", "user-local", "path"].includes(String(driver.source)) ||
135
+ driver.manifestSchema !== "1" ||
136
+ !validDriverFileIdentity(driver.fileIdentity) ||
137
+ typeof daemon.socketPath !== "string" ||
138
+ !isAbsolute(daemon.socketPath) ||
139
+ !Number.isInteger(daemon.pid) ||
140
+ daemon.pid <= 0 ||
141
+ daemon.contractVersion !== "0.6.0" ||
142
+ daemon.toolsListSchemaVersion !== "1" ||
143
+ daemon.capabilityVersion !== "1" ||
144
+ daemon.mcpProtocolVersion !== "2025-06-18" ||
145
+ mcp.command !== driver.path ||
146
+ !Array.isArray(mcp.args) ||
147
+ mcp.args.length !== 4 ||
148
+ mcp.args[0] !== "mcp" ||
149
+ mcp.args[1] !== "--embedded" ||
150
+ mcp.args[2] !== "--socket" ||
151
+ mcp.args[3] !== daemon.socketPath ||
152
+ !mcp.env ||
153
+ typeof mcp.env !== "object" ||
154
+ Array.isArray(mcp.env) ||
155
+ !exactKeys(mcp.env, [
156
+ "CUA_DRIVER_EMBEDDED",
157
+ "CUA_DRIVER_HOST_BUNDLE_ID",
158
+ "CUA_DRIVER_RS_UPDATE_CHECK",
159
+ "CUA_DRIVER_RS_TELEMETRY_ENABLED",
160
+ ...(wayland ? ["CUA_DRIVER_RS_ENABLE_WAYLAND"] : []),
161
+ ]) ||
162
+ mcp.env.CUA_DRIVER_EMBEDDED !== "1" ||
163
+ mcp.env.CUA_DRIVER_HOST_BUNDLE_ID !== "com.openmausbot.app" ||
164
+ mcp.env.CUA_DRIVER_RS_UPDATE_CHECK !== "false" ||
165
+ mcp.env.CUA_DRIVER_RS_TELEMETRY_ENABLED !== "false" ||
166
+ (wayland && mcp.env.CUA_DRIVER_RS_ENABLE_WAYLAND !== "1")) {
167
+ return null;
168
+ }
169
+ if (!Array.isArray(value.toolNames) ||
170
+ value.toolNames.some((name) => typeof name !== "string") ||
171
+ REQUIRED_LINUX_TOOLS.some((name) => !value.toolNames.includes(name)) ||
172
+ !Array.isArray(value.doctorWarnings)) {
173
+ return null;
174
+ }
175
+ for (const warning of value.doctorWarnings) {
176
+ if (!warning ||
177
+ typeof warning !== "object" ||
178
+ Array.isArray(warning) ||
179
+ ![3, 4].includes(Object.keys(warning).length) ||
180
+ !Object.keys(warning).every((key) => ["label", "status", "message", "detail"].includes(key)) ||
181
+ typeof warning.label !== "string" ||
182
+ warning.status !== "warn" ||
183
+ typeof warning.message !== "string" ||
184
+ (warning.detail !== undefined && typeof warning.detail !== "string")) {
185
+ return null;
186
+ }
187
+ }
188
+ return {
189
+ command: driver.path,
190
+ args: [...mcp.args],
191
+ env: { ...mcp.env },
192
+ platform: "linux",
193
+ generation: value.generation,
194
+ scope: "local-computer",
195
+ };
196
+ }
197
+ function processAlive(pid) {
198
+ try {
199
+ process.kill(pid, 0);
200
+ return true;
201
+ }
202
+ catch {
203
+ return false;
204
+ }
205
+ }
206
+ function ownedPrivate(stat, uid) {
207
+ return (stat.uid === uid || stat.uid === 0) && (stat.mode & 0o077) === 0;
208
+ }
209
+ export function validateLinuxDescriptorRuntime(descriptorFile, raw, { uid = process.getuid?.() ?? -1, isProcessAlive = processAlive, } = {}) {
210
+ try {
211
+ const descriptorStat = lstatSync(descriptorFile);
212
+ const descriptorDirectoryStat = lstatSync(dirname(descriptorFile));
213
+ if (!descriptorStat.isFile() ||
214
+ descriptorStat.isSymbolicLink() ||
215
+ !ownedPrivate(descriptorStat, uid) ||
216
+ !descriptorDirectoryStat.isDirectory() ||
217
+ descriptorDirectoryStat.isSymbolicLink() ||
218
+ !ownedPrivate(descriptorDirectoryStat, uid)) {
219
+ return false;
220
+ }
221
+ const driver = raw.driver;
222
+ const daemon = raw.daemon;
223
+ const binaryPath = driver.path;
224
+ const socketPath = daemon.socketPath;
225
+ const binaryStat = statSync(binaryPath);
226
+ const currentFileIdentity = currentDriverFileIdentity(binaryPath);
227
+ const socketStat = lstatSync(socketPath);
228
+ const socketDirectoryStat = lstatSync(dirname(socketPath));
229
+ if (realpathSync(binaryPath) !== binaryPath ||
230
+ !sameDriverFileIdentity(driver.fileIdentity, currentFileIdentity) ||
231
+ !binaryStat.isFile() ||
232
+ (binaryStat.uid !== uid && binaryStat.uid !== 0) ||
233
+ (binaryStat.mode & 0o111) === 0 ||
234
+ (binaryStat.mode & 0o022) !== 0 ||
235
+ !socketStat.isSocket() ||
236
+ socketStat.isSymbolicLink() ||
237
+ !ownedPrivate(socketStat, uid) ||
238
+ !socketDirectoryStat.isDirectory() ||
239
+ socketDirectoryStat.isSymbolicLink() ||
240
+ !ownedPrivate(socketDirectoryStat, uid) ||
241
+ !isProcessAlive(raw.ownerPid) ||
242
+ !isProcessAlive(daemon.pid)) {
243
+ return false;
244
+ }
245
+ return true;
246
+ }
247
+ catch {
248
+ return false;
249
+ }
250
+ }
251
+ export function readCuaConnection({ platform = process.platform, userData = process.env.OMB_USER_DATA, home = homedir(), validateLinuxRuntime = validateLinuxDescriptorRuntime, } = {}) {
252
+ const candidates = userData ? [join(userData, "cua-connection.json")] : [];
253
+ if (platform === "darwin") {
254
+ // Legacy/dev fallback. Packaged Electron passes its exact userData path.
255
+ for (const directory of ["OpenMausBot", "openmausbot", "OpenGrokBot", "opengrokbot"]) {
256
+ candidates.push(join(home, "Library", "Application Support", directory, "cua-connection.json"));
257
+ }
258
+ }
259
+ for (const file of [...new Set(candidates)]) {
260
+ try {
261
+ const raw = JSON.parse(readFileSync(file, "utf8"));
262
+ if (platform === "linux") {
263
+ const decoded = decodeLinuxDescriptor(raw);
264
+ if (decoded && validateLinuxRuntime(file, raw))
265
+ return decoded;
266
+ }
267
+ else {
268
+ const decoded = decodeLegacyDescriptor(raw, platform);
269
+ if (decoded)
270
+ return decoded;
271
+ }
272
+ }
273
+ catch {
274
+ // Missing, invalid, tampered, or stale descriptors are unavailable.
275
+ }
276
+ }
277
+ return null;
278
+ }
@@ -0,0 +1,9 @@
1
+ export function shouldMountLocalComputer({ requested, hostPlatform = process.platform, providerSupportsLocal, }) {
2
+ if (!providerSupportsLocal)
3
+ return false;
4
+ if (requested === "local")
5
+ return hostPlatform === "darwin" || hostPlatform === "linux";
6
+ // Preserve the established macOS Auto behavior. Linux local control is a
7
+ // beta and can only be selected explicitly per bot.
8
+ return requested === undefined && hostPlatform === "darwin";
9
+ }
@@ -0,0 +1,44 @@
1
+ /** Renewable idle deadline for one Local VM.
2
+ *
3
+ * Activity resets the full window. The caller decides how to suspend or
4
+ * recycle the disposable VM, and an active turn or lifecycle operation defers
5
+ * that work for another full window instead of racing current work.
6
+ */
7
+ export class LocalVmIdleTimer {
8
+ timer = null;
9
+ idleMs;
10
+ isBusy;
11
+ suspend;
12
+ constructor(idleMs, isBusy, suspend) {
13
+ if (!Number.isFinite(idleMs) || idleMs <= 0)
14
+ throw new Error("Local VM idle timeout must be positive");
15
+ this.idleMs = idleMs;
16
+ this.isBusy = isBusy;
17
+ this.suspend = suspend;
18
+ }
19
+ touch() {
20
+ this.cancel();
21
+ this.timer = setTimeout(() => void this.expire(), this.idleMs);
22
+ this.timer.unref?.();
23
+ }
24
+ cancel() {
25
+ if (this.timer)
26
+ clearTimeout(this.timer);
27
+ this.timer = null;
28
+ }
29
+ async expire() {
30
+ this.timer = null;
31
+ if (this.isBusy()) {
32
+ this.touch();
33
+ return;
34
+ }
35
+ try {
36
+ await this.suspend();
37
+ }
38
+ catch {
39
+ // A transient runtime failure must not disable the cost/resource
40
+ // backstop forever. Retry after a fresh full idle window.
41
+ this.touch();
42
+ }
43
+ }
44
+ }
@@ -0,0 +1,34 @@
1
+ import { containerComputerExists, perBotLocalVmTarget, } from "./container-computer.js";
2
+ /** Idle cleanup is destructive. An exact derived name alone is not ownership:
3
+ * a pre-existing container must also carry OpenMausBot's verified labels. */
4
+ export function shouldArmLocalVmIdle(status) {
5
+ return status?.container === "running" && status.managed;
6
+ }
7
+ /** Discover only exact, bot-derived container identities. Bot destination is
8
+ * deliberately irrelevant: an existing VM must stay visible after its bot is
9
+ * moved to Cloud, Browser, This computer, Auto, or Off. */
10
+ export async function discoverExistingPerBotLocalVms(bots, runtime, exists = containerComputerExists) {
11
+ const candidates = [...new Map(bots.map((bot) => {
12
+ const target = perBotLocalVmTarget(bot.id);
13
+ return [target.key, { bot, target }];
14
+ })).values()];
15
+ const existing = await Promise.all(candidates.map(({ target }) => exists(runtime, target)));
16
+ return candidates.filter((_, index) => existing[index]);
17
+ }
18
+ /** The public inventory is an explicit allow-list. In particular, it cannot
19
+ * leak viewer passwords/URLs, host workspace paths, runtime commands, or
20
+ * target hashes from the full Local VM status object. */
21
+ export function localVmInventoryEntry(bot, status, inUse) {
22
+ if (status.container === "missing")
23
+ return null;
24
+ return {
25
+ botId: bot.id,
26
+ name: bot.name,
27
+ destination: bot.computer ?? "auto",
28
+ container: status.container,
29
+ managed: status.managed,
30
+ ready: status.ready,
31
+ problem: status.problem,
32
+ inUse,
33
+ };
34
+ }
@@ -0,0 +1,58 @@
1
+ /** A short, renewable ownership fence for one Local VM desktop.
2
+ * Runtime events keep an active turn's lease alive; a dead provider cannot
3
+ * pin the VM forever. All methods are synchronous so lifecycle routes and
4
+ * turn dispatch can claim their side of the race before either awaits. */
5
+ export class LocalVmLease {
6
+ record = null;
7
+ ttlMs;
8
+ constructor(ttlMs) {
9
+ if (!Number.isFinite(ttlMs) || ttlMs <= 0)
10
+ throw new Error("Local VM lease TTL must be positive");
11
+ this.ttlMs = ttlMs;
12
+ }
13
+ current(isBotBusy, now = Date.now()) {
14
+ if (this.record && (this.record.expiresAt <= now || !isBotBusy(this.record.botId)))
15
+ this.record = null;
16
+ return this.record ? { ...this.record } : null;
17
+ }
18
+ claim(threadId, botId, isBotBusy, now = Date.now()) {
19
+ const current = this.current(isBotBusy, now);
20
+ if (current && current.threadId !== threadId)
21
+ return false;
22
+ this.record = { threadId, botId, expiresAt: now + this.ttlMs };
23
+ return true;
24
+ }
25
+ touch(threadId, now = Date.now()) {
26
+ if (this.record && this.record.expiresAt <= now) {
27
+ this.record = null;
28
+ return;
29
+ }
30
+ if (this.record?.threadId === threadId)
31
+ this.record.expiresAt = now + this.ttlMs;
32
+ }
33
+ release(threadId) {
34
+ if (this.record?.threadId === threadId)
35
+ this.record = null;
36
+ }
37
+ }
38
+ /** Independent lease lanes keyed by an already-validated Local VM target.
39
+ * Shared mode uses one key; per-bot mode uses one digest-derived key per bot,
40
+ * so separate desktops never block each other while each desktop remains a
41
+ * strict singleton. */
42
+ export class LocalVmLeasePool {
43
+ leases = new Map();
44
+ ttlMs;
45
+ constructor(ttlMs) {
46
+ if (!Number.isFinite(ttlMs) || ttlMs <= 0)
47
+ throw new Error("Local VM lease TTL must be positive");
48
+ this.ttlMs = ttlMs;
49
+ }
50
+ forTarget(targetKey) {
51
+ let lease = this.leases.get(targetKey);
52
+ if (!lease) {
53
+ lease = new LocalVmLease(this.ttlMs);
54
+ this.leases.set(targetKey, lease);
55
+ }
56
+ return lease;
57
+ }
58
+ }