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,429 @@
1
+ // Hermes Agent — Nous Research's `hermes acp` CLI. Custom-only: Hermes is
2
+ // a BYOK/local harness. ACP ignores `hermes -m` (cmd_acp does not forward
3
+ // it), and setting OPENAI_API_KEY makes provider:auto resolve to OpenRouter
4
+ // without an OpenRouter key — that is the "HTTP 401: Missing Authentication
5
+ // header" failure. Inject writes providers.<host> and session/set_model
6
+ // `custom:<host>:<model>` instead.
7
+ import { spawn } from "node:child_process";
8
+ import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
9
+ import { homedir } from "node:os";
10
+ import { join } from "node:path";
11
+ import { parse as parseYaml } from "yaml";
12
+ import { decodeInjectId, hostApiKey, INJECT_SEP, localHost, mergeLocalInject } from "../local-inject.js";
13
+ import { createAcpDriver } from "./core.js";
14
+ const EMPTY = { default: "", options: [] };
15
+ export const HERMES_OPENMAUS_SCREENSHOT_COMPAT = "HERMES_OPENMAUS_SCREENSHOT_COMPAT";
16
+ export const HERMES_OPENMAUS_SCREENSHOT_COMPAT_MODEL = "HERMES_OPENMAUS_SCREENSHOT_COMPAT_MODEL";
17
+ /** Bind screenshot pseudo-call compatibility to one exact injected model. */
18
+ export function bindHermesScreenshotCompat(env, modelId) {
19
+ delete env[HERMES_OPENMAUS_SCREENSHOT_COMPAT];
20
+ delete env[HERMES_OPENMAUS_SCREENSHOT_COMPAT_MODEL];
21
+ const inject = decodeInjectId(modelId);
22
+ if (!inject)
23
+ return;
24
+ env[HERMES_OPENMAUS_SCREENSHOT_COMPAT] = "1";
25
+ env[HERMES_OPENMAUS_SCREENSHOT_COMPAT_MODEL] = inject.model;
26
+ }
27
+ function hermesHome(env) {
28
+ return env.HERMES_HOME || join(env.HOME || env.USERPROFILE || homedir(), ".hermes");
29
+ }
30
+ function quoteYaml(value) {
31
+ if (/^[\w./:+-]+$/.test(value))
32
+ return value;
33
+ return JSON.stringify(value);
34
+ }
35
+ function upsertHermesProvider(text, hostId, baseUrl, apiKey) {
36
+ const block = [` ${hostId}:`, ` base_url: ${quoteYaml(baseUrl)}`, ` api_key: ${quoteYaml(apiKey)}`, ""].join("\n");
37
+ if (/^providers:\s*$/m.test(text)) {
38
+ const replaced = replaceHermesHostBlock(text, hostId, block);
39
+ if (replaced !== null)
40
+ return replaced;
41
+ return text.replace(/^providers:\s*$/m, `providers:\n${block.trimEnd()}`);
42
+ }
43
+ const prefix = text && !text.endsWith("\n") ? `${text}\n` : text;
44
+ return `${prefix}\nproviders:\n${block}`;
45
+ }
46
+ /** Replace ` hostId:` through the next sibling 2-space key or a top-level key. */
47
+ function replaceHermesHostBlock(text, hostId, block) {
48
+ const lines = text.split("\n");
49
+ const start = lines.findIndex((line) => line === ` ${hostId}:`);
50
+ if (start < 0)
51
+ return null;
52
+ let end = start + 1;
53
+ while (end < lines.length) {
54
+ const line = lines[end];
55
+ if (/^ \S/.test(line) || /^\S/.test(line))
56
+ break;
57
+ end++;
58
+ }
59
+ while (end > start + 1 && lines[end - 1] === "")
60
+ end--;
61
+ return [...lines.slice(0, start), ...block.replace(/\n$/, "").split("\n"), ...lines.slice(end)].join("\n");
62
+ }
63
+ /** Register an OpenAI-compatible host so ACP can `session/set_model custom:host:model`. */
64
+ export function ensureHermesInjectProvider(modelId, env = process.env) {
65
+ const inject = decodeInjectId(modelId);
66
+ if (!inject)
67
+ return modelId;
68
+ const host = localHost(inject.host);
69
+ if (!host)
70
+ return modelId;
71
+ const dir = hermesHome(env);
72
+ mkdirSync(dir, { recursive: true });
73
+ const path = join(dir, "config.yaml");
74
+ let text = "";
75
+ try {
76
+ text = readFileSync(path, "utf8");
77
+ }
78
+ catch {
79
+ text = "";
80
+ }
81
+ const next = upsertHermesProvider(text, inject.host, host.baseUrl, hostApiKey(host, env));
82
+ if (next !== text)
83
+ writeFileSync(path, next);
84
+ return hermesAcpModelId(modelId) ?? modelId;
85
+ }
86
+ /** ACP session/set_model id. Hermes parse_model_input treats `custom:name:model`. */
87
+ export function hermesAcpModelId(modelId) {
88
+ const inject = decodeInjectId(modelId);
89
+ if (inject)
90
+ return `custom:${inject.host}:${inject.model}`;
91
+ // Hermes' own ACP ids are `<provider>:<model>` (`openrouter:qwen/qwen3.8-max`).
92
+ // They are not inject ids and must be forwarded untouched; returning null here
93
+ // is what limited the picker to locally injected hosts.
94
+ const native = typeof modelId === "string" ? modelId.trim() : "";
95
+ if (native && !native.includes(INJECT_SEP) && /^[a-z0-9_-]+:[\w./:-]+$/i.test(native))
96
+ return native;
97
+ return null;
98
+ }
99
+ /** The id used when Hermes should run on the provider its own config names.
100
+ *
101
+ * Deliberately not an inject id: `hermesAcpModelId` returns null for it, so
102
+ * `configureSession` sends no `session/set_model` and Hermes falls through to
103
+ * the model in its own `config.yaml`. `spawnArgs` passes no `-m` either (ACP
104
+ * ignores it), so nothing overrides that choice.
105
+ */
106
+ export const HERMES_CONFIG_MODEL_ID = "hermes-default";
107
+ function nonEmptyDotenvValue(text, name) {
108
+ const match = new RegExp(`^[ \\t]*(?:export[ \\t]+)?${name}[ \\t]*=[ \\t]*([^\\r\\n]*)$`, "m").exec(text);
109
+ if (!match)
110
+ return null;
111
+ const raw = match[1].trim();
112
+ if (!raw || raw.startsWith("#"))
113
+ return null;
114
+ const quote = raw[0];
115
+ if (quote === '"' || quote === "'") {
116
+ const closing = raw.indexOf(quote, 1);
117
+ if (closing < 0)
118
+ return null;
119
+ const trailing = raw.slice(closing + 1).trim();
120
+ if (trailing && !trailing.startsWith("#"))
121
+ return null;
122
+ return raw.slice(1, closing).trim() || null;
123
+ }
124
+ return raw.replace(/[ \t]+#.*$/, "").trim() || null;
125
+ }
126
+ const HERMES_HOSTED_PROVIDER_KEYS = [
127
+ "OPENROUTER_API_KEY",
128
+ "GLM_API_KEY",
129
+ "ZAI_API_KEY",
130
+ "Z_AI_API_KEY",
131
+ ];
132
+ const HERMES_LOCAL_CONFIG_PROVIDERS = new Set(["custom", "lmstudio", "ollama", "vllm", "llamacpp"]);
133
+ function yamlString(value) {
134
+ return typeof value === "string" ? value.trim() : "";
135
+ }
136
+ /**
137
+ * Read the model/provider forms accepted by Hermes' `_normalize_root_model_keys`:
138
+ * a scalar `model`, or a mapping whose id is `default`, `model`, or `name`.
139
+ * Those id fields may themselves be `{ provider, model/default }` mappings.
140
+ * An explicit outer provider wins, except `auto`, where the nested provider is
141
+ * the more specific routing choice. Root-level `provider` is Hermes' legacy
142
+ * fallback. YAML parsing also handles quotes and trailing comments correctly.
143
+ */
144
+ function hermesConfigDefault(text) {
145
+ let raw;
146
+ try {
147
+ raw = parseYaml(text);
148
+ }
149
+ catch {
150
+ return null;
151
+ }
152
+ if (!raw || typeof raw !== "object" || Array.isArray(raw))
153
+ return null;
154
+ const config = raw;
155
+ const rootProvider = yamlString(config.provider);
156
+ if (typeof config.model === "string") {
157
+ const model = config.model.trim();
158
+ return model ? { model, provider: rootProvider } : null;
159
+ }
160
+ if (!config.model || typeof config.model !== "object" || Array.isArray(config.model))
161
+ return null;
162
+ const modelConfig = config.model;
163
+ const outerProvider = yamlString(modelConfig.provider) || rootProvider;
164
+ for (const key of ["default", "model", "name"]) {
165
+ const candidate = modelConfig[key];
166
+ const scalar = yamlString(candidate);
167
+ if (scalar)
168
+ return { model: scalar, provider: outerProvider };
169
+ if (!candidate || typeof candidate !== "object" || Array.isArray(candidate))
170
+ continue;
171
+ const nested = candidate;
172
+ const nestedModel = yamlString(nested.model) || yamlString(nested.default);
173
+ if (!nestedModel)
174
+ continue;
175
+ const nestedProvider = yamlString(nested.provider);
176
+ const provider = !outerProvider || outerProvider === "auto" ? nestedProvider || outerProvider : outerProvider;
177
+ return { model: nestedModel, provider };
178
+ }
179
+ return null;
180
+ }
181
+ /** Detect whether Hermes has a hosted provider configured.
182
+ *
183
+ * Hermes supports multiple auth methods:
184
+ * - OpenRouter API key in `~/.hermes/.env` (OPENROUTER_API_KEY)
185
+ * - Nous Portal OAuth (tokens stored in `~/.hermes/` — the default for
186
+ * `hermes setup` / `hermes login`)
187
+ * - Z.AI / GLM keys in `~/.hermes/.env`
188
+ *
189
+ * Previously only OPENROUTER_API_KEY was checked, so a Nous Portal user
190
+ * — logged in via OAuth, no OpenRouter key — saw "No local models found"
191
+ * despite Hermes being installed, authenticated, and serving 100+ models.
192
+ *
193
+ * Read-only on purpose. `ensureHermesInjectProvider` writes `config.yaml`,
194
+ * and doing that from a catalog probe would rewrite the user's real Hermes
195
+ * config as a side effect of opening a menu.
196
+ *
197
+ * Returns null when no hosted provider is configured, which leaves the
198
+ * catalog exactly as it was for local-only setups.
199
+ */
200
+ export function hermesConfiguredModel(env = process.env) {
201
+ const dir = hermesHome(env);
202
+ let secrets = "";
203
+ try {
204
+ secrets = readFileSync(join(dir, ".env"), "utf8");
205
+ }
206
+ catch {
207
+ /* .env may not exist — check OAuth below */
208
+ }
209
+ const hasHostedProviderKey = HERMES_HOSTED_PROVIDER_KEYS.some((name) => nonEmptyDotenvValue(secrets, name));
210
+ // `hermes login` / `hermes setup` records the selected default in
211
+ // config.yaml while the OAuth token lives in Hermes' auth store. An explicit
212
+ // local/custom provider must not trigger the hosted catalog probe.
213
+ let configuredDefault = null;
214
+ try {
215
+ configuredDefault = hermesConfigDefault(readFileSync(join(dir, "config.yaml"), "utf8"));
216
+ }
217
+ catch {
218
+ /* config may not exist or may be unreadable */
219
+ }
220
+ const configuredProvider = configuredDefault?.provider.toLowerCase() ?? "";
221
+ // The model/provider selected in config.yaml is the user's explicit routing
222
+ // choice. A stale hosted key must not override an explicitly local setup.
223
+ const configIsLocal = HERMES_LOCAL_CONFIG_PROVIDERS.has(configuredProvider) || configuredProvider.startsWith("custom:");
224
+ if (configuredDefault && configIsLocal)
225
+ return null;
226
+ const configIsHosted = configuredDefault !== null;
227
+ if (!hasHostedProviderKey && !configIsHosted)
228
+ return null;
229
+ const model = configuredDefault?.model ?? "";
230
+ // `custom: true` is not cosmetic. ModelPicker renders a custom-only agent's
231
+ // *custom* pane exclusively, and that pane lists only options carrying this
232
+ // flag; anything without it lands in the "official" bucket the pane never
233
+ // shows. Omitting it puts the option in the API response while leaving the
234
+ // picker saying "No local models found" — present, but unselectable.
235
+ return {
236
+ id: HERMES_CONFIG_MODEL_ID,
237
+ label: model ? `${model} (Hermes config)` : "Hermes default (config)",
238
+ custom: true,
239
+ };
240
+ }
241
+ /** Ask a short-lived `hermes acp` session what models it can actually run.
242
+ *
243
+ * Hermes advertises its full catalog on `session/new` — every model its
244
+ * configured providers expose, ids shaped `openrouter:qwen/qwen3.8-max`. There
245
+ * is no `hermes models` subcommand, so a throwaway session is the only way to
246
+ * read it, and it is worth the spawn: without it the picker can only offer
247
+ * locally injected hosts, which is a fraction of what the user is paying for.
248
+ *
249
+ * Failure is non-fatal and returns [] — a catalog probe must never be the
250
+ * reason an agent becomes unselectable.
251
+ */
252
+ async function fetchHermesAcpModels(cli, env) {
253
+ return await new Promise((resolve) => {
254
+ let child;
255
+ try {
256
+ child = spawn(cli, ["acp"], { stdio: ["pipe", "pipe", "ignore"], env: env });
257
+ }
258
+ catch {
259
+ return resolve([]);
260
+ }
261
+ let settled = false;
262
+ let timer;
263
+ let hardKillTimer;
264
+ const done = (out) => {
265
+ if (settled)
266
+ return;
267
+ settled = true;
268
+ if (timer)
269
+ clearTimeout(timer);
270
+ try {
271
+ if (child.kill()) {
272
+ hardKillTimer = setTimeout(() => {
273
+ try {
274
+ child.kill("SIGKILL");
275
+ }
276
+ catch {
277
+ /* already gone */
278
+ }
279
+ }, 1_000);
280
+ hardKillTimer.unref?.();
281
+ }
282
+ }
283
+ catch {
284
+ /* already gone */
285
+ }
286
+ resolve(out);
287
+ };
288
+ timer = setTimeout(() => done([]), 5_000);
289
+ child.once("error", () => done([]));
290
+ child.once("close", () => {
291
+ if (hardKillTimer)
292
+ clearTimeout(hardKillTimer);
293
+ done([]);
294
+ });
295
+ let buf = "";
296
+ let id = 0;
297
+ const send = (method, params) => {
298
+ id += 1;
299
+ try {
300
+ if (!child.stdin?.writable) {
301
+ done([]);
302
+ return 0;
303
+ }
304
+ child.stdin.write(`${JSON.stringify({ jsonrpc: "2.0", id, method, params })}\n`, (error) => {
305
+ if (error)
306
+ done([]);
307
+ });
308
+ }
309
+ catch {
310
+ done([]);
311
+ return 0;
312
+ }
313
+ return id;
314
+ };
315
+ let initId = 0;
316
+ let sessionId = 0;
317
+ child.stdout?.on("data", (chunk) => {
318
+ buf += String(chunk);
319
+ let nl;
320
+ while ((nl = buf.indexOf("\n")) >= 0) {
321
+ const line = buf.slice(0, nl);
322
+ buf = buf.slice(nl + 1);
323
+ let msg;
324
+ try {
325
+ msg = JSON.parse(line);
326
+ }
327
+ catch {
328
+ continue;
329
+ }
330
+ if (msg?.id === initId) {
331
+ if (!msg.result)
332
+ return done([]);
333
+ sessionId = send("session/new", { cwd: env.HOME || env.USERPROFILE || homedir(), mcpServers: [] });
334
+ }
335
+ else if (sessionId && msg?.id === sessionId) {
336
+ const list = Array.isArray(msg.result?.models?.availableModels)
337
+ ? msg.result.models.availableModels
338
+ : [];
339
+ done(list
340
+ .filter((m) => typeof m?.modelId === "string" && m.modelId)
341
+ .map((m) => ({
342
+ id: m.modelId,
343
+ // Hermes labels these "OpenRouter · <model>"; keep its wording.
344
+ label: (typeof m.name === "string" && m.name.trim()) || m.modelId,
345
+ custom: true,
346
+ })));
347
+ }
348
+ }
349
+ });
350
+ initId = send("initialize", {
351
+ protocolVersion: 1,
352
+ clientCapabilities: { fs: { readTextFile: false, writeTextFile: false } },
353
+ });
354
+ });
355
+ }
356
+ async function resolveModels(env, config) {
357
+ const catalog = await mergeLocalInject(EMPTY, env);
358
+ const configured = hermesConfiguredModel(env);
359
+ // Only probe when a hosted provider is configured; a local-only install has
360
+ // nothing to gain from the spawn.
361
+ const remote = configured ? await fetchHermesAcpModels(config?.cli || "hermes", env) : [];
362
+ const seen = new Set();
363
+ const options = [...(configured ? [configured] : []), ...remote, ...catalog.options].filter((o) => {
364
+ if (seen.has(o.id))
365
+ return false;
366
+ seen.add(o.id);
367
+ return true;
368
+ });
369
+ return { default: options[0]?.id ?? "", options };
370
+ }
371
+ async function applySetting(request, method, params, what) {
372
+ try {
373
+ await request(method, params);
374
+ }
375
+ catch (e) {
376
+ throw new Error(`Hermes rejected ${what} via ${method}: ${e.message}`);
377
+ }
378
+ }
379
+ const support = {
380
+ driverKind: "hermesAgent",
381
+ displayName: "Hermes",
382
+ access: "custom",
383
+ models: EMPTY,
384
+ resolveModels: (env, config) => resolveModels(env, config),
385
+ resolveTurnModel: (model, env) => {
386
+ // Never inherit a broad or stale compatibility grant from the parent.
387
+ // Only this OpenMaus driver binds one concrete local model; Hermes still
388
+ // requires the exact read-only screenshot MCP tool before activation.
389
+ bindHermesScreenshotCompat(env, model);
390
+ if (!model)
391
+ return model;
392
+ ensureHermesInjectProvider(model, env);
393
+ return model;
394
+ },
395
+ defaultCli: "hermes",
396
+ nativeSource: "hermes.acp",
397
+ loginNote: "Hermes CLI is not installed",
398
+ install: {
399
+ command: {
400
+ darwin: "curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash",
401
+ linux: "curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash",
402
+ win32: "iex (irm https://hermes-agent.nousresearch.com/install.ps1)",
403
+ },
404
+ docsUrl: "https://hermes-agent.nousresearch.com/docs/getting-started/quickstart",
405
+ signInCommand: "hermes setup",
406
+ },
407
+ spawnArgs: () => ["acp"],
408
+ transformEnv: (env) => {
409
+ // A leftover OPENAI_API_KEY makes Hermes auto-resolve to OpenRouter and
410
+ // send no Authorization header. ACP also reloads ~/.hermes/.env, so the
411
+ // named custom provider + session/set_model is the real route.
412
+ delete env.OPENAI_API_KEY;
413
+ delete env.OPENROUTER_API_KEY;
414
+ },
415
+ pickAuthMethod: () => null,
416
+ authFailure: "continue",
417
+ isAuthenticated: () => true,
418
+ async configureSession({ request, sessionId, turn }) {
419
+ // Decode only — resolveTurnModel already wrote the named provider using
420
+ // the instance HOME. Calling ensure* again here would hit process.env
421
+ // and rewrite the user's real ~/.hermes/config.yaml.
422
+ const native = hermesAcpModelId(turn.model);
423
+ if (!native)
424
+ return;
425
+ await applySetting(request, "session/set_model", { sessionId, modelId: native }, `model "${native}"`);
426
+ },
427
+ buildPromptText: (turn) => (turn.system ? `${turn.system}\n\n${turn.text}` : turn.text),
428
+ };
429
+ export const HermesAgentDriver = createAcpDriver(support);