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,193 @@
1
+ // dweb MCP proxy — spawned as an MCP server inside a bot's agent process.
2
+ // Exposes dweb's HTTP API (the local OpenMaus network daemon) as tools an
3
+ // agent can call to inspect the network and run model requests:
4
+ //
5
+ // dweb_status → ping dweb, summarize server + peer state
6
+ // dweb_repo_status → the OpenMausBot repo the daemon is tracking
7
+ // dweb_opencode_models → models available on the opencode integration
8
+ // dweb_opencode_run → run a model command, wait up to 5 min for output
9
+ //
10
+ // Speaks raw JSON-RPC 2.0 over stdio (no MCP SDK — house style, matches
11
+ // agents-proxy / computer-proxy / permission-proxy). Config comes from env:
12
+ // DWEB_URL base URL of the local dweb daemon (http://127.0.0.1:49737)
13
+ import readline from "node:readline";
14
+ const DWEB = (process.env.DWEB_URL ?? "http://127.0.0.1:49737").replace(/\/+$/, "");
15
+ const DWEB_DISPLAY = (() => {
16
+ try {
17
+ const url = new URL(DWEB);
18
+ url.username = "";
19
+ url.password = "";
20
+ return url.toString().replace(/\/+$/, "");
21
+ }
22
+ catch {
23
+ return "(invalid DWEB_URL)";
24
+ }
25
+ })();
26
+ const TOOLS = [
27
+ {
28
+ name: "dweb_status",
29
+ description: "Ping the local dweb daemon and report its status: server id, hostname, platform, version, uptime, peer count, and the services it runs. Call this first to confirm the network is reachable and see what's available.",
30
+ inputSchema: { type: "object", properties: {} },
31
+ },
32
+ {
33
+ name: "dweb_repo_status",
34
+ description: "Report the state of the OpenMausBot repository the dweb daemon is tracking: repo name, checked-out branch, last commit, file count, and checkout path.",
35
+ inputSchema: { type: "object", properties: {} },
36
+ },
37
+ {
38
+ name: "dweb_opencode_models",
39
+ description: "List the models available on dweb's opencode integration. Each has an id you can pass to dweb_opencode_run. Returns a note if no models are available.",
40
+ inputSchema: { type: "object", properties: {} },
41
+ },
42
+ {
43
+ name: "dweb_opencode_run",
44
+ description: "Run a model on dweb's opencode integration and wait for the result. Give a command for the model to process; optionally pick a model with the 'model' arg (defaults to dweb's choice). Can take several minutes — use this for long-running model work and report the output back verbatim.",
45
+ inputSchema: {
46
+ type: "object",
47
+ properties: {
48
+ command: { type: "string", description: "The command/prompt to run on the model." },
49
+ model: { type: "string", description: "Optional model id (from dweb_opencode_models)." },
50
+ },
51
+ required: ["command"],
52
+ },
53
+ },
54
+ ];
55
+ const send = (msg) => process.stdout.write(JSON.stringify(msg) + "\n");
56
+ const ok = (id, result) => send({ jsonrpc: "2.0", id, result });
57
+ const rpcErr = (id, code, message) => send({ jsonrpc: "2.0", id, error: { code, message } });
58
+ const textResult = (id, text, isError = false) => ok(id, { content: [{ type: "text", text }], isError });
59
+ async function api(path, init) {
60
+ const res = await fetch(DWEB + path, {
61
+ signal: AbortSignal.timeout(30_000),
62
+ ...init,
63
+ headers: { "content-type": "application/json", ...init?.headers },
64
+ });
65
+ const body = (await res.json().catch(() => ({})));
66
+ if (!res.ok)
67
+ throw new Error(String(body.error ?? `HTTP ${res.status}`));
68
+ return body;
69
+ }
70
+ async function callTool(name, args) {
71
+ if (name === "dweb_status") {
72
+ const r = await api("/ping");
73
+ const lines = [
74
+ `status: ${String(r.status ?? "unknown")}`,
75
+ `server: ${String(r.server ?? "unknown")}`,
76
+ `id: ${String(r.id ?? "unknown")}`,
77
+ `hostname: ${String(r.hostname ?? "unknown")}`,
78
+ `platform: ${String(r.platform ?? "unknown")}`,
79
+ `version: ${String(r.version ?? "unknown")}`,
80
+ `uptime: ${String(r.uptime ?? "unknown")}`,
81
+ `peers: ${String(r.peers ?? "unknown")}`,
82
+ `services: ${String(r.services ?? "unknown")}`,
83
+ ];
84
+ return { text: `dweb status:\n${lines.join("\n")}` };
85
+ }
86
+ if (name === "dweb_repo_status") {
87
+ const r = await api("/api/repo/status");
88
+ const lines = [
89
+ `repo: ${String(r.repo ?? "unknown")}`,
90
+ `branch: ${String(r.branch ?? "unknown")}`,
91
+ `commit: ${String(r.commit ?? "unknown")}`,
92
+ `files: ${String(r.files ?? "unknown")}`,
93
+ `path: ${String(r.path ?? "unknown")}`,
94
+ ];
95
+ return { text: `dweb repo status:\n${lines.join("\n")}` };
96
+ }
97
+ if (name === "dweb_opencode_models") {
98
+ const r = await api("/api/opencode/models");
99
+ const models = Array.isArray(r.models) ? r.models : [];
100
+ if (!models.length)
101
+ return { text: "No models available on dweb's opencode integration." };
102
+ const lines = models.map((model) => {
103
+ const id = typeof model === "object" && model !== null && "id" in model ? model.id : model;
104
+ return `- ${String(id)}`;
105
+ });
106
+ return { text: `Models available on dweb's opencode integration:\n${lines.join("\n")}` };
107
+ }
108
+ if (name === "dweb_opencode_run") {
109
+ if (typeof args.command !== "string" || !args.command.trim()) {
110
+ return { text: "dweb_opencode_run needs a string command.", isError: true };
111
+ }
112
+ if (args.model !== undefined && typeof args.model !== "string") {
113
+ return { text: "dweb_opencode_run model must be a string.", isError: true };
114
+ }
115
+ const command = args.command.trim();
116
+ const model = args.model?.trim() || undefined;
117
+ const r = await api("/api/opencode/run", {
118
+ method: "POST",
119
+ body: JSON.stringify({ command, ...(model !== undefined ? { model } : {}) }),
120
+ signal: AbortSignal.timeout(300000),
121
+ });
122
+ if (r.status === "error") {
123
+ return {
124
+ text: `dweb request failed at ${DWEB_DISPLAY}: ${String(r.error ?? r.output ?? "opencode run failed")}`,
125
+ isError: true,
126
+ };
127
+ }
128
+ return { text: String(r.output ?? "(no output)") };
129
+ }
130
+ return { text: `Unknown tool: ${name}`, isError: true };
131
+ }
132
+ async function handle(msg) {
133
+ const id = msg.id;
134
+ const method = msg.method;
135
+ if (!method)
136
+ return;
137
+ const params = (msg.params ?? {});
138
+ switch (method) {
139
+ case "initialize":
140
+ ok(id, {
141
+ protocolVersion: params.protocolVersion ?? "2024-11-05",
142
+ capabilities: { tools: {} },
143
+ serverInfo: { name: "dweb-proxy", version: "0.1.0" },
144
+ });
145
+ return;
146
+ case "notifications/initialized":
147
+ case "notifications/cancelled":
148
+ return;
149
+ case "ping":
150
+ ok(id, {});
151
+ return;
152
+ case "tools/list":
153
+ ok(id, { tools: TOOLS });
154
+ return;
155
+ case "tools/call": {
156
+ const name = params.name;
157
+ if (!TOOLS.some((t) => t.name === name))
158
+ return rpcErr(id, -32602, `Unknown tool: ${name}`);
159
+ try {
160
+ const rawArgs = params.arguments;
161
+ const args = typeof rawArgs === "object" && rawArgs !== null && !Array.isArray(rawArgs) ? rawArgs : {};
162
+ const { text, isError } = await callTool(name, args);
163
+ textResult(id, text, isError);
164
+ }
165
+ catch (e) {
166
+ const message = e instanceof Error ? e.message : String(e);
167
+ textResult(id, `dweb request failed at ${DWEB_DISPLAY}: ${message}`, true);
168
+ }
169
+ return;
170
+ }
171
+ default:
172
+ if (id !== undefined)
173
+ rpcErr(id, -32601, `Method not found: ${method}`);
174
+ }
175
+ }
176
+ const rl = readline.createInterface({ input: process.stdin, terminal: false });
177
+ rl.on("line", (line) => {
178
+ const t = line.trim();
179
+ if (!t)
180
+ return;
181
+ let msg;
182
+ try {
183
+ msg = JSON.parse(t);
184
+ }
185
+ catch {
186
+ return;
187
+ }
188
+ void handle(msg).catch((e) => {
189
+ if (msg.id !== undefined)
190
+ rpcErr(msg.id, -32603, e.message);
191
+ });
192
+ });
193
+ rl.on("close", () => process.exit(0));
@@ -0,0 +1,48 @@
1
+ import { createOpenAIChatRuntime } from "./openai-chat.js";
2
+ const DRIVER_KIND = "grok";
3
+ const DEFAULT_URL = "https://api.x.ai/v1";
4
+ const MODELS = {
5
+ default: "grok-4",
6
+ options: [
7
+ { id: "grok-4", label: "Grok 4" },
8
+ { id: "grok-4-fast", label: "Grok 4 Fast" },
9
+ { id: "grok-3-mini", label: "Grok 3 Mini" },
10
+ ],
11
+ };
12
+ function decodeConfig(raw) {
13
+ const config = (raw ?? {});
14
+ return {
15
+ url: typeof config.url === "string" ? config.url : DEFAULT_URL,
16
+ apiKeyEnv: typeof config.apiKeyEnv === "string" ? config.apiKeyEnv : "XAI_API_KEY",
17
+ };
18
+ }
19
+ export const GrokDriver = {
20
+ driverKind: DRIVER_KIND,
21
+ metadata: { displayName: "Grok (API)", supportsMultipleInstances: true },
22
+ models: MODELS,
23
+ decodeConfig,
24
+ defaultConfig: () => decodeConfig({}),
25
+ async create(input) {
26
+ const { config } = input;
27
+ const apiKey = input.environment[config.apiKeyEnv] ?? process.env[config.apiKeyEnv] ?? "";
28
+ return createOpenAIChatRuntime({
29
+ input,
30
+ driverKind: DRIVER_KIND,
31
+ apiKey,
32
+ apiUrl: config.url,
33
+ models: () => MODELS,
34
+ requestBody: (model, messages, stream) => ({ model, messages, stream }),
35
+ httpErrorLabel: "xAI",
36
+ missingKeyError: `no xAI key — set ${config.apiKeyEnv} or config.json xai.key`,
37
+ unavailableReason: `no xAI API key — add {"xai":{"key":"xai-…"}} to ~/.openmausbot/config.json or set ${config.apiKeyEnv}`,
38
+ timeoutMs: 120_000,
39
+ retryScale: Number(process.env.FAKE_GROK_RETRY_SCALE ?? "1"),
40
+ generateModel: () => "grok-3-mini",
41
+ nativeLog: {
42
+ source: "xai.chat.completions",
43
+ outgoing: (_turn, messages, model) => ({ model, messages }),
44
+ incoming: ({ text, usage }) => ({ text, usage }),
45
+ },
46
+ });
47
+ },
48
+ };
@@ -0,0 +1,4 @@
1
+ // Back-compat re-export: the Grok Build ACP driver moved to acp/grok.ts,
2
+ // riding the shared acp/core.ts runtime. Kept here so existing imports and
3
+ // dist-server references keep resolving.
4
+ export { GrokAgentDriver } from "./acp/grok.js";
@@ -0,0 +1,388 @@
1
+ // Shared local-host inject — the sidecar workflow, inside the picker.
2
+ // Probe oMLX / Ollama / EXO / LM Studio / Unsloth, list whatever they
3
+ // serve under Custom on every agent, and decode a pick back into a host
4
+ // + API id the selected driver can inject.
5
+ import { readFileSync } from "node:fs";
6
+ import { homedir } from "node:os";
7
+ import { join } from "node:path";
8
+ export const LOCAL_HOSTS = [
9
+ { id: "omlx", label: "oMLX", baseUrl: "http://127.0.0.1:8080/v1", apiKey: "omlx" },
10
+ { id: "ollama", label: "Ollama", baseUrl: "http://127.0.0.1:11434/v1", apiKey: "ollama" },
11
+ { id: "local_ollama", label: "Ollama", baseUrl: "http://127.0.0.1:11434/v1", apiKey: "ollama" },
12
+ { id: "exo", label: "EXO", baseUrl: "http://127.0.0.1:52415/v1", apiKey: "exo" },
13
+ { id: "lmstudio", label: "LM Studio", baseUrl: "http://127.0.0.1:1234/v1", apiKey: "lm-studio" },
14
+ { id: "unsloth", label: "Unsloth", baseUrl: "http://127.0.0.1:8888/v1", apiKeyEnv: "UNSLOTH_STUDIO_AUTH_TOKEN" },
15
+ { id: "unsloth_api", label: "Unsloth", baseUrl: "http://127.0.0.1:8888/v1", apiKeyEnv: "UNSLOTH_STUDIO_AUTH_TOKEN" },
16
+ ];
17
+ export const INJECT_SEP = "::";
18
+ const HOST_BY_ID = new Map(LOCAL_HOSTS.map((host) => [host.id, host]));
19
+ const MODEL_ID = /^[\w][\w./:+-]*$/;
20
+ /** Ollama's /api/ps lists running models with their context_length; a
21
+ * small model's real window matters more than a big one's — an 8k model
22
+ * guessed at 32k gets a rebuild it cannot hold. */
23
+ export function contextWindowsFromPs(extra) {
24
+ const out = new Map();
25
+ const rec = extra && typeof extra === "object" ? extra : null;
26
+ if (!rec || !Array.isArray(rec.models))
27
+ return out;
28
+ for (const m of rec.models) {
29
+ if (!m || typeof m !== "object")
30
+ continue;
31
+ const row = m;
32
+ const id = typeof row.model === "string" ? row.model : typeof row.name === "string" ? row.name : null;
33
+ const ctx = typeof row.context_length === "number" && Number.isFinite(row.context_length) && row.context_length > 0 ? row.context_length : null;
34
+ if (id && ctx) {
35
+ out.set(id, ctx);
36
+ const baseId = id.split(":")[0];
37
+ const current = out.get(baseId);
38
+ out.set(baseId, current === undefined ? ctx : Math.min(current, ctx));
39
+ }
40
+ }
41
+ return out;
42
+ }
43
+ export function encodeInjectId(host, model) {
44
+ return `${host}${INJECT_SEP}${model}`;
45
+ }
46
+ export function decodeInjectId(id) {
47
+ if (!id)
48
+ return null;
49
+ const sep = id.indexOf(INJECT_SEP);
50
+ if (sep <= 0)
51
+ return null;
52
+ const host = id.slice(0, sep);
53
+ const model = id.slice(sep + INJECT_SEP.length);
54
+ if (!HOST_BY_ID.has(host) || !MODEL_ID.test(model))
55
+ return null;
56
+ return { host, model };
57
+ }
58
+ export function localHost(id) {
59
+ return HOST_BY_ID.get(id);
60
+ }
61
+ export function injectedApiModel(id) {
62
+ return decodeInjectId(id)?.model ?? null;
63
+ }
64
+ /**
65
+ * Map a picker / leftover API id onto a live `host::model` inject id.
66
+ * Claude Code's settings.model is the last slug it used (e.g.
67
+ * `orcarouter/Qwen3.8-27B-Uncensored-GGUF`) and is not host-encoded, so a
68
+ * Custom pick of that leftover would otherwise skip inject and demand /login.
69
+ */
70
+ export function resolveInjectId(modelId, extras) {
71
+ if (!modelId)
72
+ return modelId;
73
+ if (decodeInjectId(modelId))
74
+ return modelId;
75
+ const matches = extras.filter((row) => row.id === modelId || row.model === modelId);
76
+ const match = matches.find((row) => row.loaded) ?? matches[0];
77
+ return match?.id ?? modelId;
78
+ }
79
+ /** Anthropic-compatible base (Claude Code wants this without a trailing /v1). */
80
+ export function anthropicBaseUrl(host) {
81
+ return host.baseUrl.replace(/\/v1\/?$/, "");
82
+ }
83
+ export function hostApiKey(host, env = process.env) {
84
+ if (host.apiKeyEnv && env[host.apiKeyEnv])
85
+ return env[host.apiKeyEnv];
86
+ if (host.apiKey)
87
+ return host.apiKey;
88
+ if (host.id === "unsloth" || host.id === "unsloth_api") {
89
+ const fromFile = readUnslothKey(env);
90
+ if (fromFile)
91
+ return fromFile;
92
+ }
93
+ return "local";
94
+ }
95
+ const CODEX_RESERVED_PROVIDERS = new Set(["openai", "ollama", "lmstudio"]);
96
+ /**
97
+ * Configure the custom local providers on the Codex app-server without
98
+ * rewriting the user's config.toml. Provider secrets ride in the child
99
+ * environment; argv only contains the corresponding environment key name.
100
+ */
101
+ export function codexLocalProviderArgs(env, modelId) {
102
+ const inject = decodeInjectId(modelId);
103
+ if (!inject || CODEX_RESERVED_PROVIDERS.has(inject.host))
104
+ return [];
105
+ const host = localHost(inject.host);
106
+ if (!host)
107
+ return [];
108
+ const envKey = `OPENMAUSBOT_LOCAL_${host.id.toUpperCase().replace(/[^A-Z0-9]+/g, "_")}_API_KEY`;
109
+ env[envKey] = hostApiKey(host, env);
110
+ return [
111
+ "-c",
112
+ `model_providers.${host.id}.name=${JSON.stringify(host.label)}`,
113
+ "-c",
114
+ `model_providers.${host.id}.base_url=${JSON.stringify(host.baseUrl)}`,
115
+ "-c",
116
+ `model_providers.${host.id}.env_key=${JSON.stringify(envKey)}`,
117
+ ];
118
+ }
119
+ function firstUnslothToken(row) {
120
+ if (!row || typeof row !== "object")
121
+ return null;
122
+ const rec = row;
123
+ for (const bucket of [rec.minted, rec.saved]) {
124
+ if (typeof bucket === "string" && bucket)
125
+ return bucket;
126
+ if (Array.isArray(bucket)) {
127
+ const token = bucket.find((value) => typeof value === "string" && value);
128
+ if (typeof token === "string")
129
+ return token;
130
+ }
131
+ }
132
+ if (typeof rec.api_key === "string" && rec.api_key)
133
+ return rec.api_key;
134
+ return null;
135
+ }
136
+ function readUnslothKey(env) {
137
+ const home = env.HOME || env.USERPROFILE || homedir();
138
+ try {
139
+ const raw = JSON.parse(readFileSync(join(home, ".unsloth", "studio", "auth", "agent_api_key.json"), "utf8"));
140
+ // Older Studio wrote `{ api_key }`. Current Studio writes
141
+ // `{ servers: { "http://127.0.0.1:8888": { minted: ["sk-unsloth-…"] } } }`.
142
+ // Prefer the localhost minted token so a stale mixed-format file cannot
143
+ // win; keep the top-level key as fallback.
144
+ if (raw.servers && typeof raw.servers === "object") {
145
+ const servers = raw.servers;
146
+ for (const url of ["http://127.0.0.1:8888", "http://localhost:8888"]) {
147
+ const token = firstUnslothToken(servers[url]);
148
+ if (token)
149
+ return token;
150
+ }
151
+ for (const row of Object.values(servers)) {
152
+ const token = firstUnslothToken(row);
153
+ if (token)
154
+ return token;
155
+ }
156
+ }
157
+ if (typeof raw.api_key === "string" && raw.api_key)
158
+ return raw.api_key;
159
+ return null;
160
+ }
161
+ catch {
162
+ return null;
163
+ }
164
+ }
165
+ function idsFromModelsPayload(payload) {
166
+ const records = Array.isArray(payload)
167
+ ? payload
168
+ : payload && typeof payload === "object" && Array.isArray(payload.data)
169
+ ? payload.data
170
+ : payload && typeof payload === "object" && Array.isArray(payload.models)
171
+ ? payload.models
172
+ : [];
173
+ return records.flatMap((record) => {
174
+ if (typeof record === "string")
175
+ return MODEL_ID.test(record) ? [record] : [];
176
+ if (!record || typeof record !== "object")
177
+ return [];
178
+ const id = record.id ?? record.name;
179
+ if (typeof id !== "string" || !MODEL_ID.test(id))
180
+ return [];
181
+ const low = id.toLowerCase();
182
+ if (low.includes("embed") || low.includes("bge-") || low.includes("nomic"))
183
+ return [];
184
+ return [id];
185
+ });
186
+ }
187
+ async function timedJson(url, env, host, fetchImpl) {
188
+ const controller = new AbortController();
189
+ const timer = setTimeout(() => controller.abort(), 1200);
190
+ timer.unref?.();
191
+ try {
192
+ const response = await fetchImpl(url, {
193
+ signal: controller.signal,
194
+ headers: { Authorization: `Bearer ${hostApiKey(host, env)}` },
195
+ });
196
+ if (!response.ok)
197
+ return null;
198
+ return await response.json();
199
+ }
200
+ catch {
201
+ return null;
202
+ }
203
+ finally {
204
+ clearTimeout(timer);
205
+ }
206
+ }
207
+ /** Which of this host's models are actually in memory / running. */
208
+ export function loadedIdsFromPayloads(_host, catalog, extra) {
209
+ const loaded = new Set();
210
+ const catalogIds = new Set(idsFromModelsPayload(catalog));
211
+ const add = (id) => {
212
+ const base = id.split(":")[0];
213
+ if (catalogIds.size && !catalogIds.has(id) && !catalogIds.has(base))
214
+ return;
215
+ if (!MODEL_ID.test(id))
216
+ return;
217
+ loaded.add(id);
218
+ if (catalogIds.has(base))
219
+ loaded.add(base);
220
+ };
221
+ if (extra && typeof extra === "object") {
222
+ const rec = extra;
223
+ const running = Array.isArray(rec.models)
224
+ ? rec.models
225
+ : Array.isArray(rec.data)
226
+ ? rec.data
227
+ : [];
228
+ // oMLX /v1/models/status lists every model with loaded:true/false.
229
+ // /health only has default_model, which is the configured default — not
230
+ // necessarily what is in memory. Prefer explicit flags when present.
231
+ const hasLoadedFlags = running.some((row) => row && typeof row === "object" && ("loaded" in row || "state" in row));
232
+ if (!hasLoadedFlags && typeof rec.default_model === "string")
233
+ add(rec.default_model);
234
+ for (const row of running) {
235
+ if (typeof row === "string") {
236
+ if (!hasLoadedFlags)
237
+ add(row);
238
+ continue;
239
+ }
240
+ if (!row || typeof row !== "object")
241
+ continue;
242
+ const item = row;
243
+ const id = (typeof item.name === "string" && item.name) ||
244
+ (typeof item.model === "string" && item.model) ||
245
+ (typeof item.id === "string" && item.id) ||
246
+ "";
247
+ if (!id)
248
+ continue;
249
+ const state = typeof item.state === "string" ? item.state.toLowerCase() : "";
250
+ if (item.loaded === false || state === "not-loaded" || state === "unloaded")
251
+ continue;
252
+ if (item.loaded === true || state === "loaded" || state === "idle" || !hasLoadedFlags) {
253
+ add(id);
254
+ }
255
+ }
256
+ }
257
+ if (!loaded.size && catalog && typeof catalog === "object") {
258
+ const rec = catalog;
259
+ if (typeof rec.default_model === "string")
260
+ add(rec.default_model);
261
+ const records = Array.isArray(rec.data) ? rec.data : [];
262
+ for (const row of records) {
263
+ if (!row || typeof row !== "object")
264
+ continue;
265
+ const item = row;
266
+ if (typeof item.id !== "string")
267
+ continue;
268
+ const state = typeof item.state === "string" ? item.state.toLowerCase() : "";
269
+ if (item.loaded === true || state === "loaded")
270
+ add(item.id);
271
+ }
272
+ }
273
+ return loaded;
274
+ }
275
+ function loadedProbeUrl(host) {
276
+ const origin = anthropicBaseUrl(host);
277
+ if (host.id === "omlx")
278
+ return `${origin}/v1/models/status`;
279
+ if (host.id === "ollama" || host.id === "local_ollama")
280
+ return `${origin}/api/ps`;
281
+ if (host.id === "lmstudio")
282
+ return `${origin}/api/v0/models`;
283
+ return null;
284
+ }
285
+ /** Live models from the same local hosts the sidecar probed. */
286
+ export async function probeLocalInjects(env = process.env, fetchImpl = fetch) {
287
+ const seenHosts = new Set();
288
+ const hosts = LOCAL_HOSTS.filter((host) => {
289
+ const key = host.baseUrl.replace(/\/$/, "");
290
+ if (seenHosts.has(key))
291
+ return false;
292
+ seenHosts.add(key);
293
+ return true;
294
+ });
295
+ const found = [];
296
+ const pages = await Promise.all(hosts.map(async (host) => {
297
+ const catalogUrl = `${host.baseUrl.replace(/\/$/, "")}/models`;
298
+ const extraUrl = loadedProbeUrl(host);
299
+ const [catalog, extra] = await Promise.all([
300
+ timedJson(catalogUrl, env, host, fetchImpl),
301
+ extraUrl ? timedJson(extraUrl, env, host, fetchImpl) : Promise.resolve(null),
302
+ ]);
303
+ const catalogIds = catalog ? idsFromModelsPayload(catalog) : [];
304
+ const extraIds = extra ? idsFromModelsPayload(extra) : [];
305
+ const loaded = loadedIdsFromPayloads(host, catalog ?? extra, extra);
306
+ const ids = [...new Set([...catalogIds, ...extraIds, ...loaded])];
307
+ const windows = contextWindowsFromPs(extra);
308
+ return { host, ids, loaded, windows };
309
+ }));
310
+ for (const { host, ids, loaded, windows } of pages) {
311
+ for (const model of ids) {
312
+ const contextWindow = windows.get(model);
313
+ found.push({
314
+ id: encodeInjectId(host.id, model),
315
+ host: host.id,
316
+ model,
317
+ label: `${model} (${host.label})`,
318
+ loaded: loaded.has(model),
319
+ ...(contextWindow ? { contextWindow } : {}),
320
+ });
321
+ }
322
+ }
323
+ return found;
324
+ }
325
+ /** Append live local models as custom rows. Official rows stay first. */
326
+ export async function mergeLocalInject(catalog, env = process.env, fetchImpl = fetch) {
327
+ const vitest = env.VITEST ?? process.env.VITEST;
328
+ const probe = env.OPENMAUSBOT_PROBE_LOCAL_INJECT ?? process.env.OPENMAUSBOT_PROBE_LOCAL_INJECT;
329
+ if (vitest === "true" && probe !== "1")
330
+ return catalog;
331
+ const extras = await probeLocalInjects(env, fetchImpl);
332
+ if (!extras.length)
333
+ return catalog;
334
+ const liveApiIds = new Set(extras.map((extra) => extra.model));
335
+ // A settings leftover that is just the API id of a live inject is not a
336
+ // second model — Custom should only offer the host:: row.
337
+ const options = catalog.options
338
+ .filter((option) => decodeInjectId(option.id) || !option.custom || !liveApiIds.has(option.id))
339
+ .map((option) => ({ ...option }));
340
+ const seen = new Set(options.map((option) => option.id));
341
+ for (const extra of extras) {
342
+ const existing = options.find((option) => option.id === extra.id);
343
+ if (existing) {
344
+ if (extra.loaded)
345
+ existing.loaded = true;
346
+ if (extra.contextWindow)
347
+ existing.contextWindow = extra.contextWindow;
348
+ continue;
349
+ }
350
+ seen.add(extra.id);
351
+ options.push({
352
+ id: extra.id,
353
+ label: extra.label,
354
+ custom: true,
355
+ ...(extra.loaded ? { loaded: true } : {}),
356
+ ...(extra.contextWindow ? { contextWindow: extra.contextWindow } : {}),
357
+ });
358
+ }
359
+ return { default: catalog.default, options };
360
+ }
361
+ /** Point an OpenAI-compatible CLI at the injected host. */
362
+ export function applyOpenAIInject(env, modelId) {
363
+ const inject = decodeInjectId(modelId);
364
+ if (!inject)
365
+ return { model: modelId ?? null, injected: false };
366
+ const host = localHost(inject.host);
367
+ if (!host)
368
+ return { model: modelId ?? null, injected: false };
369
+ const key = hostApiKey(host, env);
370
+ env.OPENAI_BASE_URL = host.baseUrl;
371
+ env.OPENAI_API_KEY = key;
372
+ return { model: inject.model, injected: true };
373
+ }
374
+ /** Point Claude Code at the injected host instead of Anthropic cloud. */
375
+ export function applyClaudeInject(env, modelId) {
376
+ const inject = decodeInjectId(modelId);
377
+ if (!inject)
378
+ return { model: modelId ?? null, injected: false };
379
+ const host = localHost(inject.host);
380
+ if (!host)
381
+ return { model: modelId ?? null, injected: false };
382
+ const key = hostApiKey(host, env);
383
+ env.ANTHROPIC_BASE_URL = anthropicBaseUrl(host);
384
+ env.ANTHROPIC_AUTH_TOKEN = key;
385
+ env.ANTHROPIC_API_KEY = key;
386
+ env.ANTHROPIC_MODEL = inject.model;
387
+ return { model: inject.model, injected: true };
388
+ }