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,405 @@
1
+ // Per-turn workspace checkpoints: a shadow git repository per bot+folder.
2
+ //
3
+ // Before a turn's engine can touch files, the working folder is snapshotted
4
+ // into a shadow repo at DATA_DIR/checkpoints/<botId>/<sha256(cwd)[..16]>/.git.
5
+ // The user's own .git (if the folder is a repository) is never read, written,
6
+ // or locked: every git call runs with GIT_DIR pointing at the shadow repo and
7
+ // GIT_WORK_TREE pointing at the folder, so the shadow index is the only index
8
+ // involved — and git always skips directories named .git when walking a work
9
+ // tree, so the user's repository internals are invisible to the snapshot.
10
+ //
11
+ // Restore is redo-friendly on purpose: it commits a safety point, then moves
12
+ // the index and work tree back with `git restore --source` + `git clean -fd`
13
+ // while HEAD stays put — so the state that was just replaced is itself a
14
+ // checkpoint, and "undo the undo" is one more restore. Ignored/excluded files
15
+ // (node_modules, .env, media) are never snapshotted and never removed by one.
16
+ //
17
+ // Failure policy: checkpointing is best-effort convenience, never load-bearing.
18
+ // Any git failure disables the feature for that bot for the rest of the
19
+ // session and logs — nothing here ever throws into the turn path.
20
+ //
21
+ // Adapted from the checkpoint designs of Cline, Roo-Code, and Gemini CLI
22
+ // (all Apache-2.0): the per-call GIT_DIR/GIT_WORK_TREE/GIT_CONFIG_* env
23
+ // override and restore shape follow Gemini CLI's gitService, the sanitized
24
+ // GIT_* env list and the exclude categories follow Roo-Code's checkpoint
25
+ // service, and the snapshot-before-every-turn cadence follows Cline.
26
+ import { execFile } from "node:child_process";
27
+ import { createHash } from "node:crypto";
28
+ import { existsSync, mkdirSync, realpathSync, statSync, writeFileSync } from "node:fs";
29
+ import { homedir } from "node:os";
30
+ import { isAbsolute, join, parse, resolve } from "node:path";
31
+ import { DATA_DIR } from "./config.js";
32
+ export const CHECKPOINTS_DIR = join(DATA_DIR, "checkpoints");
33
+ /** Full sha1 hex only. The API hands out full hashes; accepting anything
34
+ * looser would let arbitrary revspecs ("HEAD~3", "main@{u}") reach git. */
35
+ const COMMIT_HASH = /^[0-9a-f]{40}$/;
36
+ // What a checkpoint deliberately does not carry. Restores must never delete
37
+ // these either: `git clean -fd` (without -x) leaves ignored files alone, so
38
+ // everything listed here survives a rollback untouched. Categories follow
39
+ // Roo-Code's checkpoint excludes: VCS internals, dependency trees, build
40
+ // output, caches, logs, secrets, media, archives, databases, model weights.
41
+ const EXCLUDES = `# OpenMausBot checkpoint excludes — never snapshotted, never removed by restore
42
+ .git/
43
+ .svn/
44
+ .hg/
45
+ node_modules/
46
+ bower_components/
47
+ .pnpm-store/
48
+ .venv/
49
+ venv/
50
+ .direnv/
51
+ __pycache__/
52
+ .pytest_cache/
53
+ .mypy_cache/
54
+ .ruff_cache/
55
+ .tox/
56
+ .gradle/
57
+ Pods/
58
+ dist/
59
+ build/
60
+ out/
61
+ .next/
62
+ .nuxt/
63
+ .output/
64
+ .svelte-kit/
65
+ target/
66
+ coverage/
67
+ .cache/
68
+ .parcel-cache/
69
+ .turbo/
70
+ .vite/
71
+ .terraform/
72
+ *.log
73
+ logs/
74
+ *.tmp
75
+ *.swp
76
+ .DS_Store
77
+ Thumbs.db
78
+ *.env*
79
+ .env
80
+ .env.*
81
+ *.pem
82
+ *.key
83
+ *.jpg
84
+ *.jpeg
85
+ *.png
86
+ *.gif
87
+ *.bmp
88
+ *.tiff
89
+ *.webp
90
+ *.ico
91
+ *.icns
92
+ *.psd
93
+ *.mp3
94
+ *.wav
95
+ *.flac
96
+ *.ogg
97
+ *.mp4
98
+ *.mov
99
+ *.avi
100
+ *.mkv
101
+ *.webm
102
+ *.zip
103
+ *.tar
104
+ *.gz
105
+ *.tgz
106
+ *.bz2
107
+ *.xz
108
+ *.7z
109
+ *.rar
110
+ *.jar
111
+ *.iso
112
+ *.dmg
113
+ *.sqlite
114
+ *.sqlite3
115
+ *.db
116
+ *.parquet
117
+ *.onnx
118
+ *.safetensors
119
+ *.gguf
120
+ `;
121
+ // gpgsign off: the user's global config may demand signing, and a shadow
122
+ // commit must never block on a passphrase prompt. gc off: background gc in
123
+ // a repo we treat as disposable only risks lock contention with snapshots.
124
+ const GITCONFIG = "[commit]\n\tgpgsign = false\n[core]\n\tautocrlf = false\n[gc]\n\tauto = 0\n";
125
+ /** One failed git call disables checkpoints for that bot until restart —
126
+ * a broken shadow repo must cost the user one log line, not a failed turn. */
127
+ const disabledBots = new Set();
128
+ function disable(botId, message) {
129
+ disabledBots.add(botId);
130
+ console.warn(`workspace checkpoints disabled for bot ${botId} this session: ${message}`);
131
+ }
132
+ // probed once: either the system has a usable git or checkpoints stay off
133
+ let gitProbe = null;
134
+ function gitAvailable() {
135
+ gitProbe ??= new Promise((resolveProbe) => {
136
+ execFile("git", ["--version"], { windowsHide: true }, (err) => resolveProbe(!err));
137
+ });
138
+ return gitProbe;
139
+ }
140
+ /** Folders a checkpoint must never be taken in: missing paths, the sprawling
141
+ * personal folders (home, Desktop, Documents, Downloads), and the filesystem
142
+ * root — snapshotting those would trawl unbounded personal data into a repo,
143
+ * and a restore's `git clean -fd` there would be an act of vandalism. */
144
+ export function refusalReason(cwd) {
145
+ if (!isAbsolute(cwd))
146
+ return "the working folder must be an absolute path";
147
+ const requested = resolve(cwd);
148
+ let stat;
149
+ let dir;
150
+ try {
151
+ stat = statSync(requested);
152
+ dir = realpathSync(requested);
153
+ }
154
+ catch {
155
+ return "the working folder does not exist";
156
+ }
157
+ if (!stat.isDirectory())
158
+ return "the working folder is not a folder";
159
+ // Compare canonical paths too: otherwise /tmp/home-link -> $HOME bypasses
160
+ // the refusal while git still follows the symlink into the protected tree.
161
+ if (dir === parse(dir).root)
162
+ return "checkpoints are not taken at the filesystem root";
163
+ const requestedHome = resolve(homedir());
164
+ const home = existsSync(requestedHome) ? realpathSync(requestedHome) : requestedHome;
165
+ if (requested === requestedHome || dir === home)
166
+ return "checkpoints are not taken in the home folder";
167
+ for (const name of ["Desktop", "Documents", "Downloads"]) {
168
+ const requestedProtected = join(requestedHome, name);
169
+ const protectedDir = existsSync(requestedProtected) ? realpathSync(requestedProtected) : requestedProtected;
170
+ if (requested === requestedProtected || dir === protectedDir) {
171
+ return `checkpoints are not taken in the ${name} folder`;
172
+ }
173
+ }
174
+ return null;
175
+ }
176
+ function shadowDir(botId, cwd) {
177
+ const key = createHash("sha256").update(resolve(cwd)).digest("hex").slice(0, 16);
178
+ return join(CHECKPOINTS_DIR, botId, key);
179
+ }
180
+ function gitEnv(shadow, cwd) {
181
+ const env = { ...process.env };
182
+ // Git has several redirection/config environment variables beyond the
183
+ // common GIT_DIR set (for example GIT_COMMON_DIR and GIT_CONFIG_KEY_*).
184
+ // None are needed by a local shadow repo, so clear the complete namespace
185
+ // before installing the small, explicit environment below.
186
+ for (const name of Object.keys(env)) {
187
+ if (name.startsWith("GIT_"))
188
+ delete env[name];
189
+ }
190
+ env.GIT_DIR = join(shadow, ".git");
191
+ env.GIT_WORK_TREE = resolve(cwd);
192
+ env.GIT_CONFIG_GLOBAL = join(shadow, "gitconfig");
193
+ env.GIT_CONFIG_SYSTEM = join(shadow, "gitconfig_empty");
194
+ env.GIT_AUTHOR_NAME = "OpenMausBot Checkpoint";
195
+ env.GIT_AUTHOR_EMAIL = "checkpoint@openmausbot.local";
196
+ env.GIT_COMMITTER_NAME = "OpenMausBot Checkpoint";
197
+ env.GIT_COMMITTER_EMAIL = "checkpoint@openmausbot.local";
198
+ return env;
199
+ }
200
+ /** Run one git command against the shadow repo. cwd is the WORK TREE — the
201
+ * "." pathspec in add/restore resolves relative to it. A hung git (index
202
+ * lock, dead network filesystem) would otherwise jam the per-repo queue for
203
+ * the whole session, so every call carries a hard timeout. */
204
+ function runGit(args, cwd, env) {
205
+ return new Promise((resolvePromise, rejectPromise) => {
206
+ execFile("git", args, { cwd, env, windowsHide: true, encoding: "utf8", timeout: 120_000, maxBuffer: 16 * 1024 * 1024 }, (err, stdout, stderr) => {
207
+ if (err)
208
+ rejectPromise(new Error(`git ${args[0]}: ${(stderr || err.message).trim().slice(0, 400)}`));
209
+ else
210
+ resolvePromise(stdout);
211
+ });
212
+ });
213
+ }
214
+ /** `git diff --cached --quiet`: is there anything staged beyond HEAD? Used
215
+ * instead of `status --porcelain` emptiness on purpose — a nested repo with
216
+ * a dirty work tree shows up in status forever while staging nothing, which
217
+ * would either commit empty churn every turn or fail the commit outright. */
218
+ function hasStagedChanges(cwd, env) {
219
+ return new Promise((resolvePromise, rejectPromise) => {
220
+ execFile("git", ["diff", "--cached", "--quiet", "--ignore-submodules=dirty"], { cwd, env, windowsHide: true, encoding: "utf8", timeout: 120_000, maxBuffer: 16 * 1024 * 1024 }, (err, _stdout, stderr) => {
221
+ if (err === null)
222
+ resolvePromise(false);
223
+ else if (err.code === 1)
224
+ resolvePromise(true);
225
+ else
226
+ rejectPromise(new Error(`git diff: ${(stderr || err.message).trim().slice(0, 400)}`));
227
+ });
228
+ });
229
+ }
230
+ // One operation at a time per shadow repo: snapshots and restores against the
231
+ // same folder queue behind each other (git's index lock would fail the loser
232
+ // anyway — this turns a crash into a wait). The stored tail never rejects, so
233
+ // one failed operation can't poison the queue.
234
+ const chains = new Map();
235
+ function serialize(key, fn) {
236
+ const tail = chains.get(key) ?? Promise.resolve();
237
+ const run = tail.then(fn);
238
+ chains.set(key, run.then(() => undefined, () => undefined));
239
+ return run;
240
+ }
241
+ /** Create the shadow repo on first use; self-heal its config files on every
242
+ * use (they are tiny, and rewriting them lets exclude-list updates reach
243
+ * shadows that already exist). The base commit is an EMPTY marker so HEAD
244
+ * always resolves — it is filtered from listings and refused as a restore
245
+ * target, because "restore to empty" on a user's own project folder would
246
+ * delete their files. */
247
+ async function ensureShadow(cwd, env, shadow) {
248
+ mkdirSync(shadow, { recursive: true, mode: 0o700 });
249
+ writeFileSync(join(shadow, "gitconfig"), GITCONFIG, { mode: 0o600 });
250
+ writeFileSync(join(shadow, "gitconfig_empty"), "", { mode: 0o600 });
251
+ if (!existsSync(join(shadow, ".git", "HEAD"))) {
252
+ // --template= keeps the user's init.templateDir hooks/config out
253
+ await runGit(["init", "--initial-branch=main", "--template="], cwd, env);
254
+ }
255
+ mkdirSync(join(shadow, ".git", "info"), { recursive: true });
256
+ writeFileSync(join(shadow, ".git", "info", "exclude"), EXCLUDES);
257
+ try {
258
+ await runGit(["rev-parse", "--verify", "HEAD"], cwd, env);
259
+ }
260
+ catch {
261
+ // brand-new repo (or a crash between init and first commit)
262
+ await runGit(["commit", "--no-verify", "--allow-empty", "-m", "checkpoint base"], cwd, env);
263
+ }
264
+ }
265
+ /** Stage everything and commit if anything actually changed. `complete`
266
+ * records whether every path was indexable: ordinary snapshots may keep the
267
+ * useful subset, but restore must not delete files its safety point missed. */
268
+ async function commitAll(cwd, env, label) {
269
+ // --ignore-errors skips files git cannot index (unreadable, FIFOs) instead
270
+ // of aborting — but still exits 1 when it skipped an unreadable file, so
271
+ // the exit code is retained even though a partial snapshot remains useful.
272
+ // Restore treats an incomplete safety point as a hard stop before touching
273
+ // the work tree.
274
+ let complete = true;
275
+ await runGit(["add", "-A", "--ignore-errors", "."], cwd, env).catch(() => {
276
+ complete = false;
277
+ });
278
+ if (await hasStagedChanges(cwd, env)) {
279
+ await runGit(["commit", "--no-verify", "-m", label], cwd, env);
280
+ }
281
+ return { hash: (await runGit(["rev-parse", "HEAD"], cwd, env)).trim(), complete };
282
+ }
283
+ /** Snapshot the folder. Returns the checkpoint hash, or null when the
284
+ * feature is off for this bot, git is missing, or the folder is refused.
285
+ * Never throws — this is called fire-and-forget on the turn path. */
286
+ export async function snapshot(botId, cwd, label) {
287
+ if (disabledBots.has(botId))
288
+ return null;
289
+ if (!(await gitAvailable()))
290
+ return null;
291
+ if (refusalReason(cwd) !== null)
292
+ return null;
293
+ try {
294
+ const worktree = realpathSync(resolve(cwd));
295
+ const shadow = shadowDir(botId, worktree);
296
+ return await serialize(shadow, async () => {
297
+ const env = gitEnv(shadow, worktree);
298
+ await ensureShadow(worktree, env, shadow);
299
+ return (await commitAll(worktree, env, label)).hash;
300
+ });
301
+ }
302
+ catch (e) {
303
+ disable(botId, e instanceof Error ? e.message : String(e));
304
+ return null;
305
+ }
306
+ }
307
+ /** Every checkpoint for this bot+folder, newest first. Empty when nothing
308
+ * was ever snapshotted (listing never creates the shadow repo). The empty
309
+ * base marker is omitted — it is not a state anyone should return to. */
310
+ export async function listCheckpoints(botId, cwd) {
311
+ if (disabledBots.has(botId))
312
+ return [];
313
+ if (!(await gitAvailable()))
314
+ return [];
315
+ if (refusalReason(cwd) !== null)
316
+ return [];
317
+ try {
318
+ const worktree = realpathSync(resolve(cwd));
319
+ const shadow = shadowDir(botId, worktree);
320
+ if (!existsSync(join(shadow, ".git", "HEAD")))
321
+ return [];
322
+ return await serialize(shadow, async () => {
323
+ const env = gitEnv(shadow, worktree);
324
+ const out = await runGit(["log", "--format=%H%x09%ct%x09%s"], worktree, env);
325
+ const lines = out.split("\n").filter((line) => line.trim() !== "");
326
+ lines.pop(); // the root of the log is always the empty base marker
327
+ return lines.flatMap((line) => {
328
+ const [hash, seconds, ...subject] = line.split("\t");
329
+ if (!hash || !COMMIT_HASH.test(hash))
330
+ return [];
331
+ return [{ hash, at: Number(seconds) * 1000, label: subject.join("\t") }];
332
+ });
333
+ });
334
+ }
335
+ catch (e) {
336
+ disable(botId, e instanceof Error ? e.message : String(e));
337
+ return [];
338
+ }
339
+ }
340
+ /** Can this bot take/restore checkpoints in this folder right now? */
341
+ export async function checkpointsEnabled(botId, cwd) {
342
+ return !disabledBots.has(botId) && (await gitAvailable()) && refusalReason(cwd) === null;
343
+ }
344
+ /** Move the folder's files back to a checkpoint. The current state is
345
+ * committed first ("before restore"), so the restore itself shows up as a
346
+ * checkpoint and can be undone; HEAD never moves backwards, only forward
347
+ * over the "restored" commit. Excluded and gitignored files are untouched. */
348
+ export async function restore(botId, cwd, hash) {
349
+ if (disabledBots.has(botId)) {
350
+ return { ok: false, error: "checkpoints are disabled for this bot until the app restarts (an earlier snapshot failed — see the server log)" };
351
+ }
352
+ if (!(await gitAvailable()))
353
+ return { ok: false, error: "git is not installed on this machine" };
354
+ const reason = refusalReason(cwd);
355
+ if (reason !== null)
356
+ return { ok: false, error: reason };
357
+ if (!COMMIT_HASH.test(hash))
358
+ return { ok: false, error: "hash must be a full 40-character checkpoint hash" };
359
+ try {
360
+ const worktree = realpathSync(resolve(cwd));
361
+ const shadow = shadowDir(botId, worktree);
362
+ if (!existsSync(join(shadow, ".git", "HEAD"))) {
363
+ return { ok: false, error: "no checkpoints exist for this folder" };
364
+ }
365
+ return await serialize(shadow, async () => {
366
+ const env = gitEnv(shadow, worktree);
367
+ try {
368
+ await runGit(["cat-file", "-e", `${hash}^{commit}`], worktree, env);
369
+ }
370
+ catch {
371
+ return { ok: false, error: "no such checkpoint" };
372
+ }
373
+ const base = (await runGit(["rev-list", "--max-parents=0", "HEAD"], worktree, env)).trim();
374
+ if (base === hash)
375
+ return { ok: false, error: "that is the empty base marker, not a checkpoint" };
376
+ // safety point: whatever is about to be overwritten becomes restorable
377
+ const safety = await commitAll(worktree, env, "before restore");
378
+ if (!safety.complete) {
379
+ return {
380
+ ok: false,
381
+ error: "restore stopped because some current files could not be added to the safety checkpoint",
382
+ };
383
+ }
384
+ // Index AND work tree move to the source; HEAD stays put. --staged
385
+ // matters: with a work-tree-only restore, a file that exists in the
386
+ // source but not in the index (deleted in a later checkpoint, now
387
+ // resurrected) would be untracked the moment restore recreates it —
388
+ // and the clean below would delete it right back. Restoring the index
389
+ // too makes clean blind to everything the checkpoint owns; what clean
390
+ // then sweeps is exactly the strays the safety commit could not stage
391
+ // (unreadable files, add races) — never ignored/excluded files (no -x).
392
+ await runGit(["restore", "--source", hash, "--staged", "--worktree", "--", "."], worktree, env);
393
+ await runGit(["clean", "-fd"], worktree, env);
394
+ // record the post-restore state (also re-syncs the index with the
395
+ // deletions restore made), so the timeline shows the rollback
396
+ await commitAll(worktree, env, `restored ${hash.slice(0, 8)}`);
397
+ return { ok: true };
398
+ });
399
+ }
400
+ catch (e) {
401
+ const message = e instanceof Error ? e.message : String(e);
402
+ disable(botId, message);
403
+ return { ok: false, error: `restore failed: ${message}` };
404
+ }
405
+ }
@@ -0,0 +1,49 @@
1
+ import { renderRoster, reachablePeers } from "./peer-roster.js";
2
+ // The Chief's roster stays wider than an ordinary bot's (peer-roster.ts caps
3
+ // that one at a dozen): staffing the section is this bot's whole job, so it
4
+ // reads the team as a directory rather than as a nudge. The field-level caps
5
+ // and the one-line flattening are shared, so the widest roster in the app is
6
+ // still the safest place for an imported persona to land.
7
+ const ROSTER_MAX_BOTS = 40;
8
+ const sectionKey = (section) => section?.trim() || "";
9
+ /** Dynamic system context for a section's Chief of Staff.
10
+ * It names the current team on every turn, while list_bots remains the
11
+ * authoritative tool for IDs and live availability at delegation time. */
12
+ export function chiefOfStaffSystemPrompt(chiefId, bots, canDelegate, trustedOpenMausStatus = "") {
13
+ const chief = bots.find((bot) => bot.id === chiefId);
14
+ const chiefSection = sectionKey(chief?.section);
15
+ const sectionName = chiefSection || "General";
16
+ // A Chief with its own allow-list is bound by it here too: the roster and
17
+ // the endpoints must agree, or the prompt names teammates the tools will
18
+ // then refuse to reach.
19
+ const team = reachablePeers(bots, chief ?? { id: chiefId, name: "" });
20
+ // `about: true` keeps the blurb the Chief staffs from — and keeps this
21
+ // prompt byte-identical to what Chiefs have always been given. The
22
+ // ordinary-bot roster drops it (peer-roster.ts); widening the Chief's
23
+ // existing exposure was never in scope, and narrowing it here would
24
+ // silently change how a Chief picks a specialist.
25
+ const roster = renderRoster(team, {
26
+ max: ROSTER_MAX_BOTS,
27
+ empty: "- No other visible bots are available yet.",
28
+ about: true,
29
+ });
30
+ const delegation = canDelegate
31
+ ? [
32
+ "Use list_bots to confirm the live roster and IDs. When assigning work to a teammate, use delegate_bot: it returns immediately, keeps you available to the user, and delivers the teammate's outcome back into this conversation automatically — success or failure. When the result arrives you are woken with it: report it to the user and act. If the teammate fails or stalls, tell the user plainly and decide the next step yourself.",
33
+ "After delegate_bot accepts the task, acknowledge the handoff and continue with any independent work or end your turn. Do not call wait_delegation or repeatedly poll check_delegation in the same turn.",
34
+ "Use ask_bot only for a brief consultation whose answer you must have before writing your current response. Never use ask_bot for an assigned task, background work, or anything potentially long-running.",
35
+ "When the user asks you to assemble a team, use create_bot for each genuinely useful specialist. Give each one a clear role and instructions, then use delegate_bot to assign its work. Do not create duplicate or unnecessary bots.",
36
+ "Delegate with a clear, self-contained brief. Say that the task is assigned, not completed; only claim completion after the teammate's result has actually arrived.",
37
+ "You may assign work to more than one teammate when the request genuinely benefits. Stay responsive while they work, then combine their returned results when the user asks for a synthesis.",
38
+ ].join(" ")
39
+ : "Your current engine cannot contact teammates. Be honest about that limitation and ask the user to choose a delegation-compatible engine before promising coordinated work.";
40
+ return [
41
+ `You are the Chief of Staff for the ${sectionName} section. You are the user's primary contact for this section's team of bots.`,
42
+ "Own the outcome: understand the request, decide what to handle yourself, coordinate the right specialists when useful, and return one concise consolidated answer.",
43
+ "Do not delegate trivial work merely to appear busy. Never invent a teammate's progress or result. Normal permission and approval rules still apply.",
44
+ delegation,
45
+ `Current ${sectionName} section team:`,
46
+ roster,
47
+ trustedOpenMausStatus,
48
+ ].filter(Boolean).join("\n");
49
+ }
@@ -0,0 +1,70 @@
1
+ import { describeSpawnFailure, execCli } from "./procs.js";
2
+ const FALLBACK = "Run `claude update` in Terminal, then refresh Engines.";
3
+ function stderrOf(error) {
4
+ const stderr = error.stderr;
5
+ return typeof stderr === "string"
6
+ ? stderr
7
+ : Buffer.isBuffer(stderr)
8
+ ? stderr.toString("utf8")
9
+ : "";
10
+ }
11
+ function run(execute, cli, args, options) {
12
+ return new Promise((resolve, reject) => {
13
+ execute(cli, args, options, (error, stdout, stderr) => {
14
+ if (error) {
15
+ if (error.stderr === undefined && stderr) {
16
+ Object.assign(error, { stderr });
17
+ }
18
+ reject(error);
19
+ }
20
+ else
21
+ resolve(stdout);
22
+ });
23
+ });
24
+ }
25
+ function updateFailure(error, cli) {
26
+ const err = error instanceof Error ? error : new Error(String(error));
27
+ const processError = err;
28
+ if (processError.code === "ERR_CHILD_PROCESS_STDIO_MAXBUFFER") {
29
+ return new Error(`Claude update produced too much output. ${FALLBACK}`);
30
+ }
31
+ if (typeof processError.code === "string") {
32
+ return new Error(`${describeSpawnFailure(processError, cli).message}. ${FALLBACK}`);
33
+ }
34
+ if (processError.killed) {
35
+ return new Error(`Claude update timed out after 3 minutes. ${FALLBACK}`);
36
+ }
37
+ const detail = (stderrOf(err).trim() || err.message).split("\n")[0].slice(0, 400);
38
+ return new Error(`Claude update failed${detail ? `: ${detail}` : ""}. ${FALLBACK}`);
39
+ }
40
+ /** Run Claude Code's own updater, then prove which version is now installed.
41
+ * The caller owns the environment so credentials can be stripped before the
42
+ * executable (including a configured wrapper) is launched. */
43
+ export async function updateClaudeCli(cli, env, execute = execCli) {
44
+ try {
45
+ await run(execute, cli, ["update"], {
46
+ env,
47
+ timeout: 180_000,
48
+ killSignal: "SIGKILL",
49
+ maxBuffer: 1024 * 1024,
50
+ });
51
+ }
52
+ catch (error) {
53
+ throw updateFailure(error, cli);
54
+ }
55
+ try {
56
+ const stdout = await run(execute, cli, ["--version"], {
57
+ env,
58
+ timeout: 10_000,
59
+ killSignal: "SIGKILL",
60
+ maxBuffer: 64 * 1024,
61
+ });
62
+ const version = stdout.trim().split("\n")[0];
63
+ if (!version)
64
+ throw new Error("Claude returned an empty version");
65
+ return { version };
66
+ }
67
+ catch {
68
+ throw new Error("Claude finished updating, but OpenMausBot could not verify the installed version. Refresh Engines to check it.");
69
+ }
70
+ }