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,370 @@
1
+ // The maintained OpenCode CLI through its ACP stdio interface. OpenCode is
2
+ // the harness; Zen, Go, OpenRouter, and user-configured/local providers are
3
+ // models discovered from that harness rather than separate OpenMaus drivers.
4
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
5
+ import { homedir } from "node:os";
6
+ import { join } from "node:path";
7
+ import { decodeInjectId, hostApiKey, localHost, mergeLocalInject } from "../local-inject.js";
8
+ import { createAcpDriver } from "./core.js";
9
+ import { execCli } from "../../procs.js";
10
+ const STATIC_MODELS = {
11
+ default: "opencode/x-preview-f-free",
12
+ options: [
13
+ {
14
+ id: "opencode/x-preview-f-free",
15
+ label: "Zen · Ox Alpha Free",
16
+ contextWindow: 1_000_000,
17
+ },
18
+ ],
19
+ };
20
+ let lastSuccessfulCatalog = null;
21
+ const MODEL_PROBE_TTL_MS = 30_000;
22
+ const modelProbeCache = new Map();
23
+ function labelForModel(id) {
24
+ return id
25
+ .split(/[-_.]+/g)
26
+ .filter(Boolean)
27
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
28
+ .join(" ");
29
+ }
30
+ function providerLabel(id) {
31
+ if (id === "opencode")
32
+ return "Zen";
33
+ if (id === "opencode-go")
34
+ return "Go";
35
+ if (id === "openrouter")
36
+ return "OpenRouter";
37
+ return labelForModel(id);
38
+ }
39
+ function validModelSlug(value) {
40
+ const separator = value.indexOf("/");
41
+ if (separator <= 0 || separator >= value.length - 1 || /\s/u.test(value))
42
+ return false;
43
+ return [...value].every((character) => (character.codePointAt(0) ?? 0) > 0x1f);
44
+ }
45
+ function localModelRecord(record) {
46
+ const api = record.api && typeof record.api === "object" && !Array.isArray(record.api)
47
+ ? record.api
48
+ : {};
49
+ if (typeof api.url !== "string")
50
+ return false;
51
+ try {
52
+ const host = new URL(api.url).hostname.replace(/^\[|\]$/gu, "");
53
+ return host === "localhost" || host === "127.0.0.1" || host === "::1";
54
+ }
55
+ catch {
56
+ return false;
57
+ }
58
+ }
59
+ /** Parse the authoritative inventory printed by the installed OpenCode CLI.
60
+ *
61
+ * `models --verbose` is a sequence of `provider/model` header lines followed
62
+ * by one JSON object. Model IDs can themselves contain `/` (OpenRouter), so
63
+ * only the first separator identifies the provider. Older CLIs may print just
64
+ * the headers; those still produce a usable catalog without metadata. */
65
+ export function parseOpenCodeModelsOutput(stdout) {
66
+ const options = [];
67
+ const seen = new Set();
68
+ let slug = null;
69
+ let jsonLines = [];
70
+ const flush = () => {
71
+ if (!slug || seen.has(slug))
72
+ return;
73
+ const separator = slug.indexOf("/");
74
+ const provider = slug.slice(0, separator);
75
+ const model = slug.slice(separator + 1);
76
+ let record = {};
77
+ const raw = jsonLines.join("\n").trim();
78
+ if (raw) {
79
+ try {
80
+ const parsed = JSON.parse(raw);
81
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
82
+ record = parsed;
83
+ }
84
+ }
85
+ catch {
86
+ // A header-only/older CLI remains useful; fall back to the model id.
87
+ }
88
+ }
89
+ if (record.status === "deprecated")
90
+ return;
91
+ const name = typeof record.name === "string" && record.name.trim()
92
+ ? record.name.trim()
93
+ : labelForModel(model);
94
+ const limit = record.limit && typeof record.limit === "object" && !Array.isArray(record.limit)
95
+ ? record.limit
96
+ : {};
97
+ const contextWindow = typeof limit.context === "number" && Number.isFinite(limit.context) && limit.context > 0
98
+ ? Math.floor(limit.context)
99
+ : undefined;
100
+ seen.add(slug);
101
+ options.push({
102
+ id: slug,
103
+ label: `${providerLabel(provider)} · ${name}`,
104
+ ...(localModelRecord(record) ? { custom: true, loaded: true } : {}),
105
+ ...(contextWindow ? { contextWindow } : {}),
106
+ });
107
+ };
108
+ for (const line of stdout.split(/\r?\n/u)) {
109
+ const trimmed = line.trim();
110
+ if (line === trimmed && validModelSlug(trimmed)) {
111
+ flush();
112
+ slug = trimmed;
113
+ jsonLines = [];
114
+ continue;
115
+ }
116
+ if (slug)
117
+ jsonLines.push(line);
118
+ }
119
+ flush();
120
+ if (!options.length)
121
+ return null;
122
+ const preferred = options.find((option) => option.id === STATIC_MODELS.default);
123
+ return { default: (preferred ?? options[0]).id, options };
124
+ }
125
+ function runOpenCodeModels(cli, environment, verbose) {
126
+ return new Promise((resolve, reject) => {
127
+ execCli(cli, ["models", ...(verbose ? ["--verbose"] : [])], { timeout: 20_000, maxBuffer: 8 * 1024 * 1024, env: environment }, (error, stdout, stderr) => {
128
+ if (error) {
129
+ reject(new Error(stderr?.trim() || error.message, { cause: error }));
130
+ return;
131
+ }
132
+ resolve(stdout);
133
+ });
134
+ });
135
+ }
136
+ /** Ask the same OpenCode binary that will run ACP for its effective catalog.
137
+ * This automatically includes Zen, Go, other connected providers, custom
138
+ * config, and anonymous free models with the exact IDs the session accepts. */
139
+ export async function discoverOpenCodeModels(environment, cli = "opencode") {
140
+ try {
141
+ const catalog = parseOpenCodeModelsOutput(await runOpenCodeModels(cli, environment, true));
142
+ if (!catalog)
143
+ throw new Error("OpenCode returned no usable models");
144
+ lastSuccessfulCatalog = catalog;
145
+ return catalog;
146
+ }
147
+ catch {
148
+ return lastSuccessfulCatalog ?? STATIC_MODELS;
149
+ }
150
+ }
151
+ export function resetOpenCodeModelCache() {
152
+ lastSuccessfulCatalog = null;
153
+ modelProbeCache.clear();
154
+ }
155
+ /** Compatibility export for older tests/imports while the product migrates
156
+ * from the Go-only name. */
157
+ export const resetOpenCodeGoModelCache = resetOpenCodeModelCache;
158
+ const stripForeignProviderKeys = (env) => {
159
+ for (const key of [
160
+ "OPENAI_API_KEY",
161
+ "ANTHROPIC_API_KEY",
162
+ "GEMINI_API_KEY",
163
+ "GOOGLE_API_KEY",
164
+ "XAI_API_KEY",
165
+ "KIMI_API_KEY",
166
+ "MOONSHOT_API_KEY",
167
+ ])
168
+ delete env[key];
169
+ };
170
+ function opencodeConfigDir(env) {
171
+ const home = env.HOME || env.USERPROFILE || homedir();
172
+ return join(env.XDG_CONFIG_HOME || join(home, ".config"), "opencode");
173
+ }
174
+ /** Upsert an openai-compatible provider so OpenCode can select host/model. */
175
+ export function ensureOpenCodeInjectModel(modelId, env = process.env) {
176
+ const inject = decodeInjectId(modelId);
177
+ if (!inject)
178
+ return modelId;
179
+ const host = localHost(inject.host);
180
+ if (!host)
181
+ return modelId;
182
+ const native = `${inject.host}/${inject.model}`;
183
+ const dir = opencodeConfigDir(env);
184
+ mkdirSync(dir, { recursive: true });
185
+ const path = join(dir, "opencode.json");
186
+ let config = { $schema: "https://opencode.ai/config.json" };
187
+ if (existsSync(path)) {
188
+ try {
189
+ config = JSON.parse(readFileSync(path, "utf8"));
190
+ }
191
+ catch {
192
+ // Malformed user config — inject into a fresh object rather than fail the turn.
193
+ }
194
+ }
195
+ const providers = config.provider && typeof config.provider === "object" && !Array.isArray(config.provider)
196
+ ? { ...config.provider }
197
+ : {};
198
+ const previous = providers[inject.host];
199
+ const existing = previous && typeof previous === "object" && !Array.isArray(previous)
200
+ ? { ...previous }
201
+ : {
202
+ npm: "@ai-sdk/openai-compatible",
203
+ name: host.label,
204
+ options: {},
205
+ models: {},
206
+ };
207
+ const options = existing.options && typeof existing.options === "object" && !Array.isArray(existing.options)
208
+ ? { ...existing.options }
209
+ : {};
210
+ options.baseURL = host.baseUrl;
211
+ if (!options.apiKey)
212
+ options.apiKey = hostApiKey(host, env);
213
+ const models = existing.models && typeof existing.models === "object" && !Array.isArray(existing.models)
214
+ ? { ...existing.models }
215
+ : {};
216
+ if (!models[inject.model]) {
217
+ models[inject.model] = { name: `${inject.model} (${host.label})` };
218
+ }
219
+ providers[inject.host] = {
220
+ ...existing,
221
+ npm: existing.npm || "@ai-sdk/openai-compatible",
222
+ name: existing.name || host.label,
223
+ options,
224
+ models,
225
+ };
226
+ config.provider = providers;
227
+ writeFileSync(path, `${JSON.stringify(config, null, 2)}\n`);
228
+ return native;
229
+ }
230
+ /** Every path the OpenCode CLI may keep auth.json at.
231
+ *
232
+ * The CLI is xdg-flavoured on EVERY platform — `opencode auth list` on macOS
233
+ * prints `~/.local/share/opencode/auth.json`, and that is where real logins
234
+ * land. The platform-conventional locations are kept as fallbacks in case a
235
+ * future CLI moves there, but the xdg path must come first: checking only
236
+ * Library/Application Support on macOS is exactly the bug that made the app
237
+ * demand a sign-in from users who were already signed in. */
238
+ function storedAuthPaths(env) {
239
+ const home = env.HOME || env.USERPROFILE || homedir();
240
+ const roots = [
241
+ env.XDG_DATA_HOME || join(home, ".local", "share"),
242
+ process.platform === "darwin"
243
+ ? join(home, "Library", "Application Support")
244
+ : process.platform === "win32"
245
+ ? env.LOCALAPPDATA || join(home, "AppData", "Local")
246
+ : "",
247
+ ].filter(Boolean);
248
+ return [...new Set(roots)].map((root) => join(root, "opencode", "auth.json"));
249
+ }
250
+ /** True when auth.json contains any usable provider login managed by
251
+ * OpenCode. The generic harness can run all of them, including `opencode`
252
+ * (Zen), `opencode-go`, and third-party providers such as OpenRouter. */
253
+ function usableAuthEntry(parsed) {
254
+ return Object.values(parsed).some((auth) => {
255
+ if (!auth || typeof auth !== "object" || Array.isArray(auth))
256
+ return false;
257
+ const entry = auth;
258
+ return Boolean(entry.key || entry.access || entry.refresh);
259
+ });
260
+ }
261
+ function hasStoredOpenCodeAuth(env) {
262
+ const candidates = [];
263
+ if (env.OPENCODE_AUTH_CONTENT)
264
+ candidates.push(env.OPENCODE_AUTH_CONTENT);
265
+ for (const path of storedAuthPaths(env)) {
266
+ try {
267
+ candidates.push(readFileSync(path, "utf8"));
268
+ }
269
+ catch {
270
+ // A missing or unreadable file simply means there is no ambient login.
271
+ }
272
+ }
273
+ return candidates.some((raw) => {
274
+ try {
275
+ return usableAuthEntry(JSON.parse(raw));
276
+ }
277
+ catch {
278
+ return false;
279
+ }
280
+ });
281
+ }
282
+ export async function canListOpenCodeModels(env, cli, runModels = runOpenCodeModels) {
283
+ const cached = modelProbeCache.get(cli);
284
+ if (cached && cached.expiresAt > Date.now())
285
+ return cached.result;
286
+ const entry = {
287
+ expiresAt: Number.POSITIVE_INFINITY,
288
+ result: Promise.resolve(false),
289
+ };
290
+ entry.result = runModels(cli, env, false)
291
+ .then((stdout) => stdout
292
+ .split(/\r?\n/u)
293
+ .some((line) => validModelSlug(line.trim())))
294
+ .catch(() => false)
295
+ .finally(() => {
296
+ entry.expiresAt = Date.now() + MODEL_PROBE_TTL_MS;
297
+ });
298
+ modelProbeCache.set(cli, entry);
299
+ return entry.result;
300
+ }
301
+ /** Migrate the model name published during Ox Alpha's first preview. The
302
+ * current CLI calls the same model `x-preview-f-free`; prefer Go for an old
303
+ * Go bot with an explicit key, otherwise use Zen's anonymous/free route. */
304
+ export function normalizeLegacyOpenCodeModel(model, env) {
305
+ if (model !== "opencode-go/ox-alpha-free")
306
+ return model;
307
+ return env.OPENCODE_API_KEY
308
+ ? "opencode-go/x-preview-f-free"
309
+ : "opencode/x-preview-f-free";
310
+ }
311
+ const support = (loadCatalog) => ({
312
+ driverKind: "opencodeGo",
313
+ // Keep the historical driver kind so existing bots and instance config do
314
+ // not break; only the product name/catalog expand from Go to OpenCode.
315
+ displayName: "OpenCode",
316
+ models: STATIC_MODELS,
317
+ defaultCli: "opencode",
318
+ nativeSource: "opencode.acp",
319
+ loginNote: "OpenCode has no usable models — run `opencode auth login` or connect a provider in the OpenCode app",
320
+ install: {
321
+ command: {
322
+ darwin: "npm install -g opencode-ai",
323
+ linux: "npm install -g opencode-ai",
324
+ win32: "npm install -g opencode-ai",
325
+ },
326
+ docsUrl: "https://opencode.ai/docs/",
327
+ signInCommand: "opencode auth login",
328
+ needsNode: true,
329
+ },
330
+ spawnArgs: () => ["acp"],
331
+ credentialEnv: ["OPENCODE_API_KEY"],
332
+ selectModel: { configId: "model" },
333
+ resolveTurnModel: (model, env) => model
334
+ ? ensureOpenCodeInjectModel(normalizeLegacyOpenCodeModel(model, env), env)
335
+ : model,
336
+ transformEnv: stripForeignProviderKeys,
337
+ pickAuthMethod: () => null,
338
+ authFailure: "continue",
339
+ isAuthenticated: async (env, config) => (Boolean(env.OPENCODE_API_KEY)
340
+ || hasStoredOpenCodeAuth(env)
341
+ || await canListOpenCodeModels(env, config.cli)),
342
+ requireAuthenticationBeforeSpawn: true,
343
+ classifyError: classifyOpenCodeError,
344
+ resolveModels: async (environment, config) => mergeLocalInject(await loadCatalog(environment, config.cli), environment),
345
+ buildPromptText: (turn) => turn.system ? `${turn.system}\n\n${turn.text}` : turn.text,
346
+ });
347
+ export function classifyOpenCodeError(error) {
348
+ const value = error && typeof error === "object" ? error : {};
349
+ const code = value.code;
350
+ if (code === -32000)
351
+ return "invalid_credentials";
352
+ if (code === "AUTH_REQUIRED" || code === "INVALID_API_KEY" || code === "UNAUTHORIZED")
353
+ return "invalid_credentials";
354
+ if (code === "SUBSCRIPTION_INACTIVE")
355
+ return "inactive_subscription";
356
+ if (code === "QUOTA_EXCEEDED" || code === "REGION_RESTRICTED")
357
+ return "quota_or_region_restriction";
358
+ if (code === "UPSTREAM_UNAVAILABLE" || code === "SERVICE_UNAVAILABLE")
359
+ return "upstream_outage";
360
+ if (code === "MODEL_CATALOG_UNAVAILABLE")
361
+ return "model_catalog_outage";
362
+ return undefined;
363
+ }
364
+ export const classifyOpenCodeGoError = classifyOpenCodeError;
365
+ export function createOpenCodeDriver(loadCatalog = discoverOpenCodeModels) {
366
+ return createAcpDriver(support(loadCatalog));
367
+ }
368
+ export const createOpenCodeGoDriver = createOpenCodeDriver;
369
+ export const OpenCodeDriver = createOpenCodeDriver();
370
+ export const OpenCodeGoDriver = OpenCodeDriver;
@@ -0,0 +1,98 @@
1
+ // Qwen Code — Alibaba's `qwen --acp` CLI. Custom-only in OpenMausBot:
2
+ // the official pane has no Qwen Cloud catalog; live local hosts land in
3
+ // Custom and are written into ~/.qwen/settings.json modelProviders.
4
+ import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
5
+ import { homedir } from "node:os";
6
+ import { join } from "node:path";
7
+ import { decodeInjectId, hostApiKey, localHost, mergeLocalInject } from "../local-inject.js";
8
+ import { createAcpDriver } from "./core.js";
9
+ const EMPTY = { default: "", options: [] };
10
+ function qwenHome(env) {
11
+ return join(env.HOME || env.USERPROFILE || homedir(), ".qwen");
12
+ }
13
+ function envKeyFor(hostId) {
14
+ return `OPENMAUSBOT_QWEN_${hostId.toUpperCase().replace(/[^A-Z0-9]+/g, "_")}_API_KEY`;
15
+ }
16
+ /** Upsert an OpenAI-compatible provider row so `qwen -m` can reach the host. */
17
+ export function ensureQwenInjectModel(modelId, env = process.env) {
18
+ const inject = decodeInjectId(modelId);
19
+ if (!inject)
20
+ return modelId;
21
+ const host = localHost(inject.host);
22
+ if (!host)
23
+ return modelId;
24
+ const dir = qwenHome(env);
25
+ mkdirSync(dir, { recursive: true });
26
+ const path = join(dir, "settings.json");
27
+ let settings = {};
28
+ if (existsSync(path)) {
29
+ try {
30
+ settings = JSON.parse(readFileSync(path, "utf8"));
31
+ }
32
+ catch {
33
+ // Malformed user config — inject into a fresh object rather than fail the turn.
34
+ }
35
+ }
36
+ const keyName = envKeyFor(inject.host);
37
+ const key = hostApiKey(host, env);
38
+ const envMap = settings.env && typeof settings.env === "object" && !Array.isArray(settings.env)
39
+ ? { ...settings.env }
40
+ : {};
41
+ envMap[keyName] = key;
42
+ settings.env = envMap;
43
+ const providers = settings.modelProviders && typeof settings.modelProviders === "object" && !Array.isArray(settings.modelProviders)
44
+ ? { ...settings.modelProviders }
45
+ : {};
46
+ const openai = Array.isArray(providers.openai) ? [...providers.openai] : [];
47
+ const match = openai.find((row) => row &&
48
+ typeof row === "object" &&
49
+ row.id === inject.model &&
50
+ row.baseUrl === host.baseUrl);
51
+ if (!match) {
52
+ openai.push({
53
+ id: inject.model,
54
+ name: `${inject.model} (${host.label})`,
55
+ baseUrl: host.baseUrl,
56
+ envKey: keyName,
57
+ });
58
+ providers.openai = openai;
59
+ settings.modelProviders = providers;
60
+ }
61
+ writeFileSync(path, `${JSON.stringify(settings, null, 2)}\n`, { mode: 0o600 });
62
+ try {
63
+ chmodSync(path, 0o600);
64
+ }
65
+ catch {
66
+ // Windows ignores POSIX modes; keep the inject even if chmod is unsupported.
67
+ }
68
+ return inject.model;
69
+ }
70
+ async function resolveModels(env) {
71
+ const catalog = await mergeLocalInject(EMPTY, env);
72
+ return { default: catalog.options[0]?.id ?? "", options: catalog.options };
73
+ }
74
+ const support = {
75
+ driverKind: "qwenAgent",
76
+ displayName: "Qwen",
77
+ access: "custom",
78
+ models: EMPTY,
79
+ resolveModels,
80
+ resolveTurnModel: (model, env) => (model ? ensureQwenInjectModel(model, env) : model),
81
+ defaultCli: "qwen",
82
+ nativeSource: "qwen.acp",
83
+ loginNote: "Qwen Code CLI is not installed",
84
+ install: {
85
+ command: {
86
+ darwin: "curl -fsSL https://qwen-code-assets.oss-cn-hangzhou.aliyuncs.com/installation/install-qwen-standalone.sh | bash",
87
+ linux: "curl -fsSL https://qwen-code-assets.oss-cn-hangzhou.aliyuncs.com/installation/install-qwen-standalone.sh | bash",
88
+ win32: "irm https://qwen-code-assets.oss-cn-hangzhou.aliyuncs.com/installation/install-qwen-standalone.ps1 | iex",
89
+ },
90
+ docsUrl: "https://qwenlm.github.io/qwen-code-docs/en/users/overview/",
91
+ },
92
+ spawnArgs: (_config, turn) => ["--acp", ...(turn.model ? ["-m", turn.model] : [])],
93
+ pickAuthMethod: () => null,
94
+ authFailure: "continue",
95
+ isAuthenticated: () => true,
96
+ buildPromptText: (turn) => (turn.system ? `${turn.system}\n\n${turn.text}` : turn.text),
97
+ };
98
+ export const QwenAgentDriver = createAcpDriver(support);