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,329 @@
1
+ import { createHash } from "node:crypto";
2
+ import { closeSync, constants, fstatSync, lstatSync, openSync, readFileSync, } from "node:fs";
3
+ import { homedir } from "node:os";
4
+ import { dirname, join } from "node:path";
5
+ import { z } from "zod";
6
+ import { parseJson } from "./schema.js";
7
+ const SCHEMA = "aos.openmausbot_status.v1";
8
+ const TTL_SECONDS = 300;
9
+ const MAX_CACHE_BYTES = 16_384;
10
+ const DIGEST = /^sha256:[a-f0-9]{64}$/;
11
+ const UTC_TIMESTAMP = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$/;
12
+ const digestSchema = z.string().regex(DIGEST);
13
+ const slotSchema = z.object({
14
+ slot: z.string().regex(/^vm-[1-4]$/),
15
+ container: z.enum(["running", "stopped", "missing"]),
16
+ readiness: z.enum(["ready", "not_ready"]),
17
+ network: z.enum(["loopback", "unsafe", "unknown"]),
18
+ security: z.enum(["hardened", "unsafe", "unknown"]),
19
+ persistence: z.enum(["durable", "unsafe", "unknown"]),
20
+ }).strict();
21
+ const uiSchema = z.object({
22
+ two_up: z.boolean(),
23
+ max_visible: z.union([z.literal(1), z.literal(2)]),
24
+ max_interactive: z.literal(1),
25
+ default_watch_only: z.boolean(),
26
+ }).strict();
27
+ const capsuleSchema = z.object({
28
+ schema: z.literal(SCHEMA),
29
+ observed_at: z.string().regex(UTC_TIMESTAMP),
30
+ fresh_until: z.string().regex(UTC_TIMESTAMP),
31
+ ttl_seconds: z.literal(TTL_SECONDS),
32
+ source_sha256: digestSchema.nullable(),
33
+ dual_view_sha256: digestSchema.nullable(),
34
+ receipt_sha256: digestSchema,
35
+ refresh_status: z.enum(["success", "failed"]),
36
+ failure_reason: z.enum([
37
+ "config_unavailable",
38
+ "bots_unavailable",
39
+ "vm_status_unavailable",
40
+ "capacity_exceeded",
41
+ "source_hash_unavailable",
42
+ "source_hash_mismatch",
43
+ ]).optional(),
44
+ runtime_state: z.enum(["ready", "degraded", "unknown"]),
45
+ mode: z.enum(["shared", "per-bot", "unknown"]),
46
+ max_instances: z.number().int().min(1).max(4).nullable(),
47
+ ready_count: z.number().int().min(0).max(4),
48
+ slots: z.array(slotSchema).max(4),
49
+ ui: uiSchema,
50
+ }).strict();
51
+ const jsonObjectSchema = z.record(z.string(), z.custom());
52
+ export const OPENMAUS_STATUS_CACHE_PATH = join(homedir(), ".local/state/aos-session-bridge/openmausbot/latest.json");
53
+ function canonicalValue(value) {
54
+ if (Array.isArray(value))
55
+ return value.map(canonicalValue);
56
+ const parsedObject = jsonObjectSchema.safeParse(value);
57
+ if (!parsedObject.success)
58
+ return value;
59
+ const sorted = {};
60
+ for (const key of Object.keys(parsedObject.data).sort()) {
61
+ const child = parsedObject.data[key];
62
+ if (child !== undefined)
63
+ sorted[key] = canonicalValue(child);
64
+ }
65
+ return sorted;
66
+ }
67
+ function canonical(value) {
68
+ return JSON.stringify(canonicalValue(value));
69
+ }
70
+ function sha256(value) {
71
+ return `sha256:${createHash("sha256").update(value, "utf8").digest("hex")}`;
72
+ }
73
+ function timestamp(value) {
74
+ const parsed = Date.parse(value);
75
+ if (!Number.isFinite(parsed))
76
+ return null;
77
+ if (new Date(parsed).toISOString().replace(".000Z", "Z") !== value)
78
+ return null;
79
+ return parsed;
80
+ }
81
+ function expectedUi(twoUp) {
82
+ return {
83
+ two_up: twoUp,
84
+ max_visible: twoUp ? 2 : 1,
85
+ max_interactive: 1,
86
+ default_watch_only: twoUp,
87
+ };
88
+ }
89
+ function sameUi(left, right) {
90
+ return (left.two_up === right.two_up &&
91
+ left.max_visible === right.max_visible &&
92
+ left.max_interactive === right.max_interactive &&
93
+ left.default_watch_only === right.default_watch_only);
94
+ }
95
+ function unsignedDocument(capsule) {
96
+ const document = {
97
+ schema: capsule.schema,
98
+ observed_at: capsule.observed_at,
99
+ fresh_until: capsule.fresh_until,
100
+ ttl_seconds: capsule.ttl_seconds,
101
+ source_sha256: capsule.source_sha256,
102
+ dual_view_sha256: capsule.dual_view_sha256,
103
+ refresh_status: capsule.refresh_status,
104
+ runtime_state: capsule.runtime_state,
105
+ mode: capsule.mode,
106
+ max_instances: capsule.max_instances,
107
+ ready_count: capsule.ready_count,
108
+ slots: capsule.slots.map((slot) => ({
109
+ slot: slot.slot,
110
+ container: slot.container,
111
+ readiness: slot.readiness,
112
+ network: slot.network,
113
+ security: slot.security,
114
+ persistence: slot.persistence,
115
+ })),
116
+ ui: {
117
+ two_up: capsule.ui.two_up,
118
+ max_visible: capsule.ui.max_visible,
119
+ max_interactive: capsule.ui.max_interactive,
120
+ default_watch_only: capsule.ui.default_watch_only,
121
+ },
122
+ };
123
+ if (capsule.failure_reason !== undefined)
124
+ document.failure_reason = capsule.failure_reason;
125
+ return document;
126
+ }
127
+ function validSlotState(slot) {
128
+ return (slot.readiness !== "ready" ||
129
+ (slot.container === "running" &&
130
+ slot.network === "loopback" &&
131
+ slot.security === "hardened" &&
132
+ slot.persistence === "durable"));
133
+ }
134
+ function validateCapsule(value) {
135
+ const parsed = capsuleSchema.safeParse(value);
136
+ if (!parsed.success)
137
+ return null;
138
+ const capsule = parsed.data;
139
+ const observed = timestamp(capsule.observed_at);
140
+ const freshUntil = timestamp(capsule.fresh_until);
141
+ if (observed === null || freshUntil === null || freshUntil - observed !== TTL_SECONDS * 1000)
142
+ return null;
143
+ if (capsule.receipt_sha256 !== sha256(canonical(unsignedDocument(capsule))))
144
+ return null;
145
+ if (!capsule.slots.every((slot, index) => slot.slot === `vm-${index + 1}` && validSlotState(slot))) {
146
+ return null;
147
+ }
148
+ const readyCount = capsule.slots.filter((slot) => slot.readiness === "ready").length;
149
+ if (capsule.ready_count !== readyCount)
150
+ return null;
151
+ const twoUp = Boolean(capsule.refresh_status === "success" &&
152
+ capsule.mode === "per-bot" &&
153
+ capsule.max_instances !== null &&
154
+ capsule.max_instances >= 2 &&
155
+ capsule.source_sha256 !== null &&
156
+ capsule.dual_view_sha256 !== null &&
157
+ capsule.source_sha256 === capsule.dual_view_sha256);
158
+ if (!sameUi(capsule.ui, expectedUi(twoUp)))
159
+ return null;
160
+ if (capsule.refresh_status === "failed") {
161
+ if (capsule.failure_reason === undefined ||
162
+ capsule.runtime_state !== "unknown" ||
163
+ capsule.mode !== "unknown" ||
164
+ capsule.max_instances !== null ||
165
+ capsule.ready_count !== 0 ||
166
+ capsule.slots.length !== 0 ||
167
+ !sameUi(capsule.ui, expectedUi(false)))
168
+ return null;
169
+ }
170
+ else {
171
+ const expectedRuntime = capsule.slots.length > 0 && readyCount === capsule.slots.length ? "ready" : "degraded";
172
+ if (capsule.failure_reason !== undefined ||
173
+ capsule.runtime_state !== expectedRuntime ||
174
+ (capsule.mode !== "shared" && capsule.mode !== "per-bot") ||
175
+ capsule.max_instances === null ||
176
+ readyCount > capsule.max_instances ||
177
+ capsule.source_sha256 === null ||
178
+ capsule.dual_view_sha256 === null ||
179
+ capsule.source_sha256 !== capsule.dual_view_sha256)
180
+ return null;
181
+ }
182
+ return capsule;
183
+ }
184
+ function privateCache(path) {
185
+ const uid = process.getuid?.();
186
+ if (uid === undefined)
187
+ return null;
188
+ let descriptor = null;
189
+ try {
190
+ const parentStatus = lstatSync(dirname(path));
191
+ const fileStatus = lstatSync(path);
192
+ if (parentStatus.isSymbolicLink() ||
193
+ !parentStatus.isDirectory() ||
194
+ parentStatus.uid !== uid ||
195
+ (parentStatus.mode & 0o777) !== 0o700)
196
+ return null;
197
+ if (fileStatus.isSymbolicLink() ||
198
+ !fileStatus.isFile() ||
199
+ fileStatus.uid !== uid ||
200
+ (fileStatus.mode & 0o777) !== 0o600 ||
201
+ fileStatus.size > MAX_CACHE_BYTES)
202
+ return null;
203
+ descriptor = openSync(path, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0));
204
+ const openedStatus = fstatSync(descriptor);
205
+ if (!openedStatus.isFile() ||
206
+ openedStatus.uid !== uid ||
207
+ (openedStatus.mode & 0o777) !== 0o600 ||
208
+ openedStatus.dev !== fileStatus.dev ||
209
+ openedStatus.ino !== fileStatus.ino ||
210
+ openedStatus.size > MAX_CACHE_BYTES)
211
+ return null;
212
+ const contents = readFileSync(descriptor);
213
+ return contents.length <= MAX_CACHE_BYTES ? contents : null;
214
+ }
215
+ catch {
216
+ return null;
217
+ }
218
+ finally {
219
+ if (descriptor !== null) {
220
+ try {
221
+ closeSync(descriptor);
222
+ }
223
+ catch {
224
+ // Cleanup failures must not escape the fail-closed cache read.
225
+ }
226
+ }
227
+ }
228
+ }
229
+ function unknownDigest(reason, freshness = "unknown", receipt) {
230
+ return {
231
+ schema: SCHEMA,
232
+ freshness,
233
+ reason,
234
+ ...receipt,
235
+ runtimeState: "unknown",
236
+ mode: "unknown",
237
+ maxInstances: null,
238
+ readyCount: 0,
239
+ slots: [],
240
+ ui: {
241
+ twoUp: false,
242
+ maxVisible: 1,
243
+ maxInteractive: 1,
244
+ defaultWatchOnly: false,
245
+ oneActiveController: true,
246
+ },
247
+ };
248
+ }
249
+ export function readOpenMausStatus(options = {}) {
250
+ const raw = privateCache(options.cachePath ?? OPENMAUS_STATUS_CACHE_PATH);
251
+ if (raw === null)
252
+ return unknownDigest("missing_or_insecure");
253
+ let capsule;
254
+ try {
255
+ capsule = validateCapsule(parseJson(raw.toString("utf8")));
256
+ }
257
+ catch {
258
+ capsule = null;
259
+ }
260
+ if (capsule === null)
261
+ return unknownDigest("invalid");
262
+ const observed = timestamp(capsule.observed_at);
263
+ const freshUntil = timestamp(capsule.fresh_until);
264
+ const now = (options.now ?? new Date()).getTime();
265
+ const receipt = { observedAt: capsule.observed_at, receiptSha256: capsule.receipt_sha256 };
266
+ if (!Number.isFinite(now) || now < observed)
267
+ return unknownDigest("clock_skew");
268
+ if (now >= freshUntil)
269
+ return unknownDigest("stale", "stale", receipt);
270
+ if (capsule.refresh_status === "failed")
271
+ return unknownDigest("refresh_failed", "fresh", receipt);
272
+ const result = {
273
+ schema: SCHEMA,
274
+ freshness: "fresh",
275
+ ...receipt,
276
+ runtimeState: capsule.runtime_state,
277
+ mode: capsule.mode,
278
+ maxInstances: capsule.max_instances,
279
+ readyCount: capsule.ready_count,
280
+ slots: capsule.slots,
281
+ ui: {
282
+ twoUp: capsule.ui.two_up,
283
+ maxVisible: capsule.ui.max_visible,
284
+ maxInteractive: 1,
285
+ defaultWatchOnly: capsule.ui.default_watch_only,
286
+ oneActiveController: true,
287
+ },
288
+ };
289
+ if (capsule.source_sha256 !== null)
290
+ result.sourceSha256 = capsule.source_sha256;
291
+ if (capsule.dual_view_sha256 !== null)
292
+ result.dualViewSha256 = capsule.dual_view_sha256;
293
+ return result;
294
+ }
295
+ export function openMausStatusSystemPrompt(options = {}) {
296
+ const status = readOpenMausStatus(options);
297
+ const receipt = [
298
+ status.observedAt ? `observed_at=${status.observedAt}` : null,
299
+ status.receiptSha256 ? `receipt_sha256=${status.receiptSha256}` : null,
300
+ status.sourceSha256 ? `source_sha256=${status.sourceSha256}` : null,
301
+ status.dualViewSha256 ? `accepted_dual_view_sha256=${status.dualViewSha256}` : null,
302
+ status.sourceSha256 && status.dualViewSha256
303
+ ? `source_match=${status.sourceSha256 === status.dualViewSha256}`
304
+ : null,
305
+ ].filter(Boolean).join("; ");
306
+ const runtime = status.freshness === "fresh" && status.reason === undefined
307
+ ? [
308
+ `runtime_state=${status.runtimeState}`,
309
+ `mode=${status.mode}`,
310
+ `maximum_instances=${status.maxInstances}`,
311
+ `ready_count=${status.readyCount}`,
312
+ ].join("; ")
313
+ : "runtime_state=unknown; mode=unknown; maximum_instances=unknown; ready_count=0";
314
+ const slots = status.slots.length
315
+ ? status.slots
316
+ .map((slot) => `${slot.slot}(container=${slot.container},readiness=${slot.readiness},network=${slot.network},security=${slot.security},persistence=${slot.persistence})`)
317
+ .join(",")
318
+ : "none";
319
+ return [
320
+ "TRUSTED OPENMAUSBOT STATUS (read-only, validated, no transcript or credential data):",
321
+ `schema=${status.schema}; freshness=${status.freshness}${status.reason ? `; reason=${status.reason}` : ""}`,
322
+ receipt || "receipt=unavailable",
323
+ runtime,
324
+ `anonymous_slots=${slots}`,
325
+ `ui.two_up=${status.ui.twoUp}; ui.max_visible=${status.ui.maxVisible}; ui.max_interactive=1; ui.default_watch_only=${status.ui.defaultWatchOnly}; one_active_controller=true`,
326
+ "Opening a viewer or two-up workspace never starts or provisions a VM. Only one pane may be interactive at a time; switching control must release the previous pane before activating the next.",
327
+ "Treat missing, stale, failed, clock-skewed, malformed, or receipt-hash-mismatched runtime data as unknown. Do not infer bot identities, viewer URLs, paths, messages, models, accounts, or credentials from this block.",
328
+ ].join("\n");
329
+ }
@@ -0,0 +1,6 @@
1
+ // Entry point for the `openmausbot` command (see cli.ts).
2
+ import { main } from "./cli.js";
3
+ main().then((code) => process.exit(code), (error) => {
4
+ console.error(error instanceof Error ? error.message : String(error));
5
+ process.exit(1);
6
+ });
@@ -0,0 +1,157 @@
1
+ import { parseBotPackage } from "./bot-package.js";
2
+ function portableKey(value, fallback, used) {
3
+ const stem = value
4
+ .normalize("NFKD")
5
+ .replace(/[\u0300-\u036f]/g, "")
6
+ .toLowerCase()
7
+ .replace(/[^a-z0-9]+/g, "-")
8
+ .replace(/^-|-$/g, "")
9
+ .slice(0, 48) || fallback;
10
+ let key = stem;
11
+ for (let suffix = 2; used.has(key); suffix++)
12
+ key = `${stem}-${suffix}`;
13
+ used.add(key);
14
+ return key;
15
+ }
16
+ function samePlaybook(a, b) {
17
+ return a.name === b.name && a.summary === b.summary && a.instructions === b.instructions &&
18
+ a.triggers.join("\n") === b.triggers.join("\n");
19
+ }
20
+ /** Export a workspace definition, never its runtime state. Connected-app
21
+ * labels are retained as setup intent, but grants, credentials, approvals,
22
+ * transcripts, memory, paths, engines, and schedules' active state are not. */
23
+ export function createBotPackageExport(input) {
24
+ const bots = input.bots.filter((bot) => !bot.hidden);
25
+ if (!bots.length)
26
+ throw new Error("Create a bot before exporting your package");
27
+ const packageKeys = new Set();
28
+ const idToKey = new Map();
29
+ for (const [index, bot] of bots.entries()) {
30
+ idToKey.set(bot.id, portableKey(bot.name, `bot-${index + 1}`, packageKeys));
31
+ }
32
+ const playbooks = [];
33
+ const playbookKeys = new Set();
34
+ const agentPlaybooks = new Map();
35
+ for (const bot of bots) {
36
+ const agentKey = idToKey.get(bot.id);
37
+ const assigned = [];
38
+ for (const playbook of bot.playbooks ?? []) {
39
+ const existing = playbooks.find((candidate) => candidate.key === playbook.key);
40
+ if (existing && samePlaybook(playbook, existing)) {
41
+ assigned.push(existing.key);
42
+ continue;
43
+ }
44
+ let key = playbook.key;
45
+ if (existing)
46
+ key = `${agentKey}-${playbook.key}`;
47
+ key = portableKey(key, `${agentKey}-playbook`, playbookKeys);
48
+ if (!playbooks.some((candidate) => candidate.key === key))
49
+ playbooks.push({ ...playbook, key });
50
+ assigned.push(key);
51
+ }
52
+ agentPlaybooks.set(bot.id, assigned);
53
+ }
54
+ const requirements = new Map();
55
+ for (const bot of bots) {
56
+ for (const app of bot.installedPackage?.requiredApps ?? []) {
57
+ if (!requirements.has(app.slug))
58
+ requirements.set(app.slug, { ...app });
59
+ }
60
+ }
61
+ const roomKeys = new Set();
62
+ const rooms = [];
63
+ for (const [index, group] of input.groups.filter((group) => !group.dm).entries()) {
64
+ const members = group.memberIds.flatMap((id) => idToKey.has(id) ? [idToKey.get(id)] : []);
65
+ if (!members.length)
66
+ continue;
67
+ const defaultResponder = group.defaultResponder.kind === "member" && idToKey.has(group.defaultResponder.botId)
68
+ ? { kind: "agent", agent: idToKey.get(group.defaultResponder.botId) }
69
+ : group.defaultResponder.kind === "everyone"
70
+ ? { kind: "everyone" }
71
+ : { kind: "mentions" };
72
+ rooms.push({
73
+ key: portableKey(group.name, `room-${index + 1}`, roomKeys),
74
+ name: group.name,
75
+ members,
76
+ bulletin: group.bulletin,
77
+ defaultResponder,
78
+ });
79
+ }
80
+ const routineKeys = new Set();
81
+ const routines = input.routines.flatMap((routine, index) => {
82
+ // Package v1 only has a single-agent routine shape. Silently exporting a
83
+ // room goal as a bot task would change what it does after import, so keep
84
+ // it out until the portable format can name a package-local room.
85
+ if (routine.target === "room-goal")
86
+ return [];
87
+ const agent = idToKey.get(routine.botId);
88
+ if (!agent)
89
+ return [];
90
+ return [{
91
+ key: portableKey(routine.name, `routine-${index + 1}`, routineKeys),
92
+ name: routine.name,
93
+ agent,
94
+ prompt: routine.prompt,
95
+ runOn: routine.runOn,
96
+ schedule: routine.schedule.type === "once"
97
+ ? { type: "once", at: routine.schedule.at }
98
+ : routine.schedule.type === "interval"
99
+ ? {
100
+ type: "interval",
101
+ everyMinutes: routine.schedule.everyMinutes,
102
+ anchorAt: routine.schedule.anchorAt,
103
+ }
104
+ : { type: "daily", time: routine.schedule.time, weekdays: [...routine.schedule.weekdays] },
105
+ durationMinutes: routine.durationMinutes,
106
+ ...(routine.timeoutMinutes === undefined ? {} : { timeoutMinutes: routine.timeoutMinutes }),
107
+ enabledAfterInstall: false,
108
+ }];
109
+ });
110
+ const id = portableKey(input.name, "openmaus-package", new Set());
111
+ const agents = bots.map((bot) => {
112
+ const appearance = { color: bot.color };
113
+ if (bot.mascotExpression)
114
+ appearance.mascotExpression = bot.mascotExpression;
115
+ if (bot.mascotBody)
116
+ appearance.mascotBody = bot.mascotBody;
117
+ const agent = {
118
+ key: idToKey.get(bot.id),
119
+ name: bot.name,
120
+ title: bot.title,
121
+ description: bot.description,
122
+ appearance,
123
+ };
124
+ const assigned = agentPlaybooks.get(bot.id);
125
+ if (assigned?.length)
126
+ agent.playbooks = assigned;
127
+ return agent;
128
+ });
129
+ const definition = {
130
+ id,
131
+ release: "1.0.0",
132
+ name: input.name,
133
+ tagline: `A portable OpenMausBot setup with ${bots.length} ${bots.length === 1 ? "bot" : "bots"}.`,
134
+ summary: "Exported from OpenMausBot. Review the roles, rooms, playbooks, connector requirements, and paused routines before sharing or publishing.",
135
+ category: "Community",
136
+ author: { name: input.authorName?.trim() || "OpenMausBot user" },
137
+ license: "Unspecified",
138
+ outcomes: ["Recreate this bot setup without copying private runtime state."],
139
+ setupMinutes: Math.min(240, Math.max(2, bots.length + requirements.size * 2)),
140
+ requirements: { apps: [...requirements.values()], capabilities: [] },
141
+ agents,
142
+ };
143
+ const chief = bots.find((bot) => bot.chiefOfStaff);
144
+ if (chief)
145
+ definition.chiefOfStaff = idToKey.get(chief.id);
146
+ if (rooms.length)
147
+ definition.rooms = rooms;
148
+ if (routines.length)
149
+ definition.routines = routines;
150
+ if (playbooks.length)
151
+ definition.playbooks = playbooks;
152
+ return parseBotPackage({
153
+ format: "openmaus.package",
154
+ version: 1,
155
+ package: definition,
156
+ });
157
+ }
@@ -0,0 +1,7 @@
1
+ // Compatibility alias: `openmausbot pair` lives in cli.ts now. Kept because
2
+ // docs and images reference dist-server/pair-cli.js.
3
+ import { main } from "./cli.js";
4
+ main(["pair", ...process.argv.slice(2)]).then((code) => process.exit(code), (error) => {
5
+ console.error(error instanceof Error ? error.message : String(error));
6
+ process.exit(1);
7
+ });
@@ -0,0 +1,5 @@
1
+ /** Stable persisted grant for one peer action and one target — a bot for
2
+ * the two peer actions, the room for post_to_room. */
3
+ export function peerAllowKey(action, targetId) {
4
+ return `${action}:${targetId}`;
5
+ }
@@ -0,0 +1,182 @@
1
+ // Harness-native peer-comm approval gate.
2
+ //
3
+ // A bot with `approvePeerComms = true` may not call ask_bot or
4
+ // delegate_bot without a human approving the specific contact. The
5
+ // approval rides on the same options-card flow provider permissions
6
+ // already use: a card pushed into the SOURCE bot's thread with a
7
+ // `requestId`, answered by the user via /api/bots/:id/respond (or
8
+ // /api/threads/:id/respond) which the harness intercepts via
9
+ // `resolvePeerComms` BEFORE forwarding to the provider adapter. That
10
+ // way nothing front-end has to learn about peer comms.
11
+ //
12
+ // "Always allow" rides on the existing per-bot `alwaysAllow` list. The
13
+ // card carries an ID-based `allowKey` and
14
+ // the user-facing Always-allow flow already mirrors that key back into
15
+ // `alwaysAllow`, so the two sides never disagree about what was granted.
16
+ import { newId } from "./contracts.js";
17
+ import { peerAllowKey } from "./peer-approval-key.js";
18
+ export { peerAllowKey } from "./peer-approval-key.js";
19
+ /** Mark the card answered so the UI stops treating it as pending. Mirrors
20
+ * what the `request.resolved` fold does for provider cards; a harness-native
21
+ * card never emits that event, so it has to settle itself. */
22
+ function settleCard(pending, behavior, source) {
23
+ const existing = pending.bus.store
24
+ .messagesFor(pending.threadId)
25
+ .find((m) => m.id === pending.messageId);
26
+ if (!existing?.card || existing.card.answered)
27
+ return;
28
+ pending.bus.store.patchMessage(pending.threadId, pending.messageId, {
29
+ card: { ...existing.card, answered: behavior, dismissed: source !== "user" },
30
+ });
31
+ }
32
+ /** requestId → pending ask. Lives only in memory — restarting the
33
+ * server cancels every in-flight approval, like provider permissions do. */
34
+ const pendingComms = new Map();
35
+ const APPROVAL_TIMEOUT_MS = 15 * 60_000;
36
+ /** The narrow grant "always allow" remembers for a peer comm. Mirrored
37
+ * back into `bot.alwaysAllow` when the user picks "Always allow" on the
38
+ * card. */
39
+ function allowKeyAllowed(from, allowKey) {
40
+ return from.alwaysAllow?.includes(allowKey) ?? false;
41
+ }
42
+ /** How the card names what is about to happen. */
43
+ const ACTION_VERB = {
44
+ ask_bot: "contact",
45
+ delegate_bot: "delegate to",
46
+ post_to_room: "post in",
47
+ };
48
+ function pushApprovalCard(bus, from, target, message, action, requestId, sourceThreadId) {
49
+ const subtitle = message.length > 200 ? `${message.slice(0, 200)}…` : message;
50
+ const note = bus.store.appendMessage(sourceThreadId, {
51
+ role: "bot",
52
+ kind: "options",
53
+ card: {
54
+ // a room is named as a room; only a bot gets an @
55
+ title: `@${from.name} wants to ${ACTION_VERB[action]} ${action === "post_to_room" ? `“${target.name}”` : `@${target.name}`}`,
56
+ subtitle,
57
+ options: ["Allow", "Deny", "Always allow"],
58
+ requestId,
59
+ tool: action,
60
+ allowKey: peerAllowKey(action, target.id),
61
+ },
62
+ });
63
+ return note;
64
+ }
65
+ /** Ask the user (in the source task thread) whether `from` may `action` `target`.
66
+ * Resolves with `"allow"` or `"deny"`. If `from.alwaysAllow` already
67
+ * covers the (action, target) pair, returns `"allow"` immediately
68
+ * without a card. */
69
+ export function requestPeerApproval(bus, from, target, message, action, sourceThreadId = from.threadId) {
70
+ if (allowKeyAllowed(from, peerAllowKey(action, target.id))) {
71
+ return Promise.resolve("allow");
72
+ }
73
+ return new Promise((resolve) => {
74
+ const requestId = newId();
75
+ // the card has to exist before the entry, so a timeout or an answer can
76
+ // always find it to settle
77
+ const card = pushApprovalCard(bus, from, target, message, action, requestId, sourceThreadId);
78
+ const timer = setTimeout(() => {
79
+ // 15 minutes without an answer → deny. Keeps an unattended bot from
80
+ // stalling its own turn forever (matches the Claude broker timeout).
81
+ const pending = pendingComms.get(requestId);
82
+ if (!pending)
83
+ return;
84
+ pendingComms.delete(requestId);
85
+ settleCard(pending, "deny", "system");
86
+ resolve("deny");
87
+ }, APPROVAL_TIMEOUT_MS);
88
+ timer.unref?.(); // a waiting card must never hold the process open
89
+ pendingComms.set(requestId, {
90
+ resolve,
91
+ timer,
92
+ fromBotId: from.id,
93
+ toBotId: target.id,
94
+ message,
95
+ threadId: sourceThreadId,
96
+ messageId: card.id,
97
+ bus,
98
+ });
99
+ });
100
+ }
101
+ /** Called by the respond endpoints BEFORE forwarding to the provider
102
+ * adapter. Returns true if the requestId belonged to a pending peer
103
+ * approval (and resolves it); false if it was a provider request and
104
+ * the endpoint should keep going. */
105
+ export function resolvePeerComms(_bus, requestId, behavior) {
106
+ const pending = pendingComms.get(requestId);
107
+ if (!pending)
108
+ return false;
109
+ pendingComms.delete(requestId);
110
+ clearTimeout(pending.timer);
111
+ const allow = behavior === "allow";
112
+ settleCard(pending, allow ? "allow" : "deny", "user");
113
+ pending.resolve(allow ? "allow" : "deny");
114
+ return true;
115
+ }
116
+ /** Drop every approval waiting on a bot that no longer exists (or is being
117
+ * deleted), denying it so the caller's turn doesn't wait out the timeout. */
118
+ export function cancelPeerApprovalsFor(botId) {
119
+ for (const [requestId, pending] of [...pendingComms]) {
120
+ if (pending.fromBotId !== botId && pending.toBotId !== botId)
121
+ continue;
122
+ pendingComms.delete(requestId);
123
+ clearTimeout(pending.timer);
124
+ settleCard(pending, "deny", "system");
125
+ pending.resolve("deny");
126
+ }
127
+ }
128
+ /** Deny every peer-communication approval owned by a thread whose turn was
129
+ * interrupted. Patching the card alone is not enough: the in-memory promise
130
+ * must resolve too, or the delegation queue waits until its 15-minute timer. */
131
+ export function cancelPeerApprovalsForThread(threadId) {
132
+ for (const [requestId, pending] of pendingComms) {
133
+ if (pending.threadId !== threadId)
134
+ continue;
135
+ pendingComms.delete(requestId);
136
+ clearTimeout(pending.timer);
137
+ settleCard(pending, "deny", "system");
138
+ pending.resolve("deny");
139
+ }
140
+ }
141
+ /** Every thread a peer card can be raised in. A card lands in the thread
142
+ * the CALLER is speaking from, and since a bot's turn can now run in a room
143
+ * — ask_bot and post_to_room are both callable from there — that thread is
144
+ * as often a room's as a bot's. A walk that knew only about bot threads
145
+ * would leave a room's composer blocked behind a card nothing can answer. */
146
+ function peerCardThreads(bus) {
147
+ const threadIds = new Set();
148
+ for (const bot of bus.store.bots) {
149
+ threadIds.add(bot.threadId);
150
+ for (const task of bot.tasks ?? [])
151
+ threadIds.add(task.threadId);
152
+ }
153
+ for (const group of bus.store.groups) {
154
+ threadIds.add(group.threadId);
155
+ for (const task of group.tasks ?? [])
156
+ threadIds.add(task.threadId);
157
+ }
158
+ return threadIds;
159
+ }
160
+ /** Cards left on disk by a previous run can never be answered — their
161
+ * in-memory approval died with the process. Settle them at boot so a
162
+ * crashed run doesn't leave a thread with a permanently blocked composer. */
163
+ export function dismissStalePeerCards(bus) {
164
+ let dismissed = 0;
165
+ for (const threadId of peerCardThreads(bus)) {
166
+ for (const message of bus.store.messagesFor(threadId)) {
167
+ const card = message.card;
168
+ if (!card?.requestId || card.answered || card.dismissed)
169
+ continue;
170
+ if (card.tool !== "ask_bot" && card.tool !== "delegate_bot" && card.tool !== "post_to_room")
171
+ continue;
172
+ if (pendingComms.has(card.requestId))
173
+ continue;
174
+ const patched = bus.store.patchMessage(threadId, message.id, {
175
+ card: { ...card, answered: "deny", dismissed: true },
176
+ });
177
+ if (patched)
178
+ dismissed += 1;
179
+ }
180
+ }
181
+ return dismissed;
182
+ }