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,559 @@
1
+ // Kimi Code harness support — Moonshot's `kimi` CLI over ACP stdio
2
+ // (`kimi acp`), on the Kimi Code subscription login
3
+ // (~/.kimi-code/credentials/kimi-code.json), not a Moonshot API key.
4
+ // The generic protocol runtime lives in acp/core.ts; this file is only the
5
+ // per-harness quirks. Verified against kimi-code 0.29.1: initialize reports
6
+ // loadSession:true (session/load resume works), mcpCapabilities http+sse,
7
+ // and a full session/new → session/prompt roundtrip streams
8
+ // agent_thought_chunk + agent_message_chunk and settles with end_turn.
9
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
10
+ import { homedir } from "node:os";
11
+ import { join } from "node:path";
12
+ import { decodeInjectId, hostApiKey, LOCAL_HOSTS, localHost, mergeLocalInject } from "../local-inject.js";
13
+ import { createAcpDriver } from "./core.js";
14
+ const STATIC_KIMI_MODELS = {
15
+ default: "kimi-code/k3",
16
+ options: [
17
+ { id: "kimi-code/k3", label: "Kimi K3" },
18
+ { id: "kimi-code/k3-256k", label: "Kimi K3 256K" },
19
+ { id: "kimi-code/kimi-for-coding", label: "Kimi for Coding" },
20
+ { id: "kimi-code/kimi-for-coding-highspeed", label: "Kimi for Coding Highspeed" },
21
+ ],
22
+ };
23
+ const SLUG = /^[a-z0-9][a-z0-9._:/-]*$/i;
24
+ const LOCAL_PROVIDER_PREFIXES = LOCAL_HOSTS.map((host) => `${host.id}/`);
25
+ function isLocalInjectAlias(slug) {
26
+ return LOCAL_PROVIDER_PREFIXES.some((prefix) => slug.startsWith(prefix));
27
+ }
28
+ function kimiDataRoot(env) {
29
+ return env.KIMI_CODE_HOME || join(env.HOME || env.USERPROFILE || homedir(), ".kimi-code");
30
+ }
31
+ function credentialsPath(env) {
32
+ return join(kimiDataRoot(env), "credentials", "kimi-code.json");
33
+ }
34
+ /** Quote a TOML string value. */
35
+ function quoteToml(value) {
36
+ return `"${value.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`;
37
+ }
38
+ /** Quote a TOML key when it is not a bare identifier. */
39
+ function quoteTomlKey(key) {
40
+ if (/^[A-Za-z0-9_-]+$/.test(key))
41
+ return key;
42
+ return quoteToml(key);
43
+ }
44
+ /** Strip a `#` comment that is not inside a quoted string. */
45
+ function stripTomlLineComment(line) {
46
+ let quote = null;
47
+ for (let i = 0; i < line.length; i++) {
48
+ const c = line[i];
49
+ if (quote) {
50
+ if (quote === '"' && c === "\\") {
51
+ i += 1;
52
+ continue;
53
+ }
54
+ if (c === quote)
55
+ quote = null;
56
+ continue;
57
+ }
58
+ if (c === "#")
59
+ return line.slice(0, i);
60
+ if (c === '"' || c === "'")
61
+ quote = c;
62
+ }
63
+ return line;
64
+ }
65
+ /** Decode a TOML basic-string escape at `text[i]` (`i` points at the `\\`).
66
+ * Invalid / unknown / surrogate / out-of-range sequences return ok:false so
67
+ * the heading is not canonicalized to a colliding alias. */
68
+ function takeTomlBasicEscape(text, i) {
69
+ const code = text[i + 1];
70
+ if (code === undefined)
71
+ return { ok: false };
72
+ if (code === "u") {
73
+ const hex = text.slice(i + 2, i + 6);
74
+ if (!/^[0-9a-fA-F]{4}$/.test(hex))
75
+ return { ok: false };
76
+ const point = parseInt(hex, 16);
77
+ if (point >= 0xd800 && point <= 0xdfff)
78
+ return { ok: false };
79
+ return { ok: true, value: String.fromCharCode(point), next: i + 6 };
80
+ }
81
+ if (code === "U") {
82
+ const hex = text.slice(i + 2, i + 10);
83
+ if (!/^[0-9a-fA-F]{8}$/.test(hex))
84
+ return { ok: false };
85
+ const point = parseInt(hex, 16);
86
+ if (point > 0x10ffff || (point >= 0xd800 && point <= 0xdfff))
87
+ return { ok: false };
88
+ return { ok: true, value: String.fromCodePoint(point), next: i + 10 };
89
+ }
90
+ const named = {
91
+ b: "\b",
92
+ t: "\t",
93
+ n: "\n",
94
+ f: "\f",
95
+ r: "\r",
96
+ '"': '"',
97
+ "\\": "\\",
98
+ };
99
+ if (!(code in named))
100
+ return { ok: false };
101
+ return { ok: true, value: named[code], next: i + 2 };
102
+ }
103
+ /** Canonical `a.b.c` form of a `[table]` heading, quotes and comments removed. */
104
+ function canonicalizeTomlHeading(heading) {
105
+ const trimmed = stripTomlLineComment(heading).trim();
106
+ const match = trimmed.match(/^\[([^[\]]+)\]$/);
107
+ if (!match)
108
+ return null;
109
+ const parts = [];
110
+ const inner = match[1];
111
+ let i = 0;
112
+ const skipSep = () => {
113
+ while (i < inner.length && (inner[i] === "." || inner[i] === " " || inner[i] === "\t"))
114
+ i += 1;
115
+ };
116
+ skipSep();
117
+ while (i < inner.length) {
118
+ const q = inner[i];
119
+ if (q === '"' || q === "'") {
120
+ i += 1;
121
+ let value = "";
122
+ while (i < inner.length && inner[i] !== q) {
123
+ if (q === '"' && inner[i] === "\\") {
124
+ const taken = takeTomlBasicEscape(inner, i);
125
+ if (!taken.ok)
126
+ return null;
127
+ value += taken.value;
128
+ i = taken.next;
129
+ continue;
130
+ }
131
+ value += inner[i];
132
+ i += 1;
133
+ }
134
+ if (inner[i] === q)
135
+ i += 1;
136
+ parts.push(value);
137
+ skipSep();
138
+ continue;
139
+ }
140
+ let value = "";
141
+ while (i < inner.length && inner[i] !== ".") {
142
+ value += inner[i];
143
+ i += 1;
144
+ }
145
+ const part = value.trim();
146
+ if (part)
147
+ parts.push(part);
148
+ skipSep();
149
+ }
150
+ return parts.length ? parts.join(".") : null;
151
+ }
152
+ /** Unwrap `"key"` / `'key'` so a quoted assignment matches the bare name. */
153
+ function unquoteTomlKey(raw) {
154
+ const key = raw.trim();
155
+ if (key.length >= 2 && ((key.startsWith('"') && key.endsWith('"')) || (key.startsWith("'") && key.endsWith("'")))) {
156
+ return key.slice(1, -1);
157
+ }
158
+ return key;
159
+ }
160
+ /** Bare key on the left of `key = value`. */
161
+ function tomlRowKey(row) {
162
+ const eq = row.indexOf("=");
163
+ return unquoteTomlKey(eq < 0 ? row : row.slice(0, eq));
164
+ }
165
+ /** Walk `text` and yield `[table]` spans. `[[array]]` headings bound a table
166
+ * but are not themselves patchable. `#` comments in `out` mode are skipped
167
+ * so an apostrophe in a comment cannot open a phantom string. */
168
+ function tomlTables(text) {
169
+ const headings = [];
170
+ let mode = "out";
171
+ let i = 0;
172
+ const atLineStart = (idx) => idx === 0 || text[idx - 1] === "\n";
173
+ while (i < text.length) {
174
+ if (mode === "mlbasic") {
175
+ if (text.startsWith('"""', i)) {
176
+ mode = "out";
177
+ i += 3;
178
+ continue;
179
+ }
180
+ i += 1;
181
+ continue;
182
+ }
183
+ if (mode === "mllit") {
184
+ if (text.startsWith("'''", i)) {
185
+ mode = "out";
186
+ i += 3;
187
+ continue;
188
+ }
189
+ i += 1;
190
+ continue;
191
+ }
192
+ if (mode === "basic") {
193
+ if (text[i] === "\n") {
194
+ mode = "out";
195
+ i += 1;
196
+ continue;
197
+ }
198
+ if (text[i] === "\\") {
199
+ i += 2;
200
+ continue;
201
+ }
202
+ if (text[i] === '"')
203
+ mode = "out";
204
+ i += 1;
205
+ continue;
206
+ }
207
+ if (mode === "literal") {
208
+ if (text[i] === "\n") {
209
+ mode = "out";
210
+ i += 1;
211
+ continue;
212
+ }
213
+ if (text[i] === "'")
214
+ mode = "out";
215
+ i += 1;
216
+ continue;
217
+ }
218
+ if (text.startsWith('"""', i)) {
219
+ mode = "mlbasic";
220
+ i += 3;
221
+ continue;
222
+ }
223
+ if (text.startsWith("'''", i)) {
224
+ mode = "mllit";
225
+ i += 3;
226
+ continue;
227
+ }
228
+ if (text[i] === '"') {
229
+ mode = "basic";
230
+ i += 1;
231
+ continue;
232
+ }
233
+ if (text[i] === "'") {
234
+ mode = "literal";
235
+ i += 1;
236
+ continue;
237
+ }
238
+ if (text[i] === "#") {
239
+ const nl = text.indexOf("\n", i);
240
+ i = nl < 0 ? text.length : nl + 1;
241
+ continue;
242
+ }
243
+ if (atLineStart(i)) {
244
+ let j = i;
245
+ while (j < text.length && (text[j] === " " || text[j] === "\t"))
246
+ j += 1;
247
+ if (text[j] === "[") {
248
+ const nl = text.indexOf("\n", j);
249
+ const lineEnd = nl < 0 ? text.length : nl;
250
+ const raw = text.slice(j, lineEnd).replace(/\r$/, "");
251
+ const stripped = stripTomlLineComment(raw).trim();
252
+ const array = stripped.startsWith("[[");
253
+ const name = array
254
+ ? canonicalizeTomlHeading(`[${stripped.replace(/^\s*\[\[/, "").replace(/\]\]\s*$/, "")}]`)
255
+ : canonicalizeTomlHeading(raw);
256
+ headings.push({ name, patchable: !array && name !== null, lineStart: i, lineEnd });
257
+ i = lineEnd + (nl < 0 ? 0 : 1);
258
+ continue;
259
+ }
260
+ }
261
+ i += 1;
262
+ }
263
+ return headings
264
+ .map((heading, index) => ({
265
+ heading,
266
+ end: index + 1 < headings.length ? headings[index + 1].lineStart : text.length,
267
+ }))
268
+ .filter((entry) => entry.heading.patchable && entry.heading.name)
269
+ .map((entry) => ({
270
+ name: entry.heading.name,
271
+ headingStart: entry.heading.lineStart,
272
+ bodyStart: entry.heading.lineEnd + (text[entry.heading.lineEnd] === "\n" ? 1 : 0),
273
+ end: entry.end,
274
+ }));
275
+ }
276
+ /** Keys assigned at line start in a table body, including `"quoted"` keys. */
277
+ function tomlKeys(block) {
278
+ const keys = new Set();
279
+ let mode = "out";
280
+ let lineStart = 0;
281
+ let lineStartMode = "out";
282
+ const take = (end) => {
283
+ if (lineStartMode !== "out")
284
+ return;
285
+ const line = stripTomlLineComment(block.slice(lineStart, end));
286
+ const eq = line.indexOf("=");
287
+ if (eq > 0)
288
+ keys.add(unquoteTomlKey(line.slice(0, eq)));
289
+ };
290
+ for (let i = 0; i < block.length; i++) {
291
+ if (mode === "mlbasic") {
292
+ if (block.startsWith('"""', i)) {
293
+ mode = "out";
294
+ i += 2;
295
+ }
296
+ }
297
+ else if (mode === "mllit") {
298
+ if (block.startsWith("'''", i)) {
299
+ mode = "out";
300
+ i += 2;
301
+ }
302
+ }
303
+ else if (mode === "basic") {
304
+ if (block[i] === "\\")
305
+ i += 1;
306
+ else if (block[i] === '"')
307
+ mode = "out";
308
+ }
309
+ else if (mode === "literal") {
310
+ if (block[i] === "'")
311
+ mode = "out";
312
+ }
313
+ else if (block[i] === "#") {
314
+ const nl = block.indexOf("\n", i);
315
+ i = nl < 0 ? block.length : nl;
316
+ if (nl < 0)
317
+ break;
318
+ }
319
+ else if (block.startsWith('"""', i)) {
320
+ mode = "mlbasic";
321
+ i += 2;
322
+ }
323
+ else if (block.startsWith("'''", i)) {
324
+ mode = "mllit";
325
+ i += 2;
326
+ }
327
+ else if (block[i] === '"') {
328
+ mode = "basic";
329
+ }
330
+ else if (block[i] === "'") {
331
+ mode = "literal";
332
+ }
333
+ if (i < block.length && block[i] === "\n") {
334
+ take(i);
335
+ lineStart = i + 1;
336
+ if (mode === "basic" || mode === "literal")
337
+ mode = "out";
338
+ lineStartMode = mode;
339
+ }
340
+ }
341
+ take(block.length);
342
+ return keys;
343
+ }
344
+ /** Whether `text` already has this table, ignoring quotes and trailing comments. */
345
+ function hasTomlTable(text, heading) {
346
+ const name = canonicalizeTomlHeading(heading);
347
+ return name !== null && tomlTables(text).some((table) => table.name === name);
348
+ }
349
+ /** Insert missing keys into an existing table. Does not overwrite set values. */
350
+ function patchTomlTable(text, heading, rows) {
351
+ const name = canonicalizeTomlHeading(heading);
352
+ if (!name)
353
+ return text;
354
+ const table = tomlTables(text).find((entry) => entry.name === name);
355
+ if (!table)
356
+ return text;
357
+ const keys = tomlKeys(text.slice(table.bodyStart, table.end));
358
+ const missing = rows.filter((row) => !keys.has(tomlRowKey(row)));
359
+ if (!missing.length)
360
+ return text;
361
+ let insertAt = table.end;
362
+ while (insertAt > table.bodyStart && (text[insertAt - 1] === "\n" || text[insertAt - 1] === "\r"))
363
+ insertAt -= 1;
364
+ const before = text.slice(0, insertAt);
365
+ const after = text.slice(insertAt);
366
+ const pad = before.endsWith("\n") || before.length === 0 ? "" : "\n";
367
+ return `${before}${pad}${missing.join("\n")}${after.startsWith("\n") ? "" : "\n"}${after}`;
368
+ }
369
+ /** Write [providers.host] + [models."host/alias"] so `kimi -m` hits the local host. */
370
+ export function ensureKimiInjectAlias(modelId, env = process.env) {
371
+ const inject = decodeInjectId(modelId);
372
+ if (!inject)
373
+ return modelId;
374
+ const host = localHost(inject.host);
375
+ if (!host)
376
+ return modelId;
377
+ const alias = `${inject.host}/${inject.model.replace(/\//g, "-")}`;
378
+ const dataRoot = kimiDataRoot(env);
379
+ mkdirSync(dataRoot, { recursive: true });
380
+ const path = join(dataRoot, "config.toml");
381
+ let text = "";
382
+ try {
383
+ text = readFileSync(path, "utf8");
384
+ }
385
+ catch {
386
+ text = "";
387
+ }
388
+ const original = text;
389
+ const providerHeading = `[providers.${inject.host}]`;
390
+ const modelHeading = `[models.${quoteTomlKey(alias)}]`;
391
+ const blocks = [];
392
+ if (!hasTomlTable(text, providerHeading)) {
393
+ blocks.push([
394
+ providerHeading,
395
+ `type = "openai_legacy"`,
396
+ `base_url = ${quoteToml(host.baseUrl)}`,
397
+ `api_key = ${quoteToml(hostApiKey(host, env))}`,
398
+ "",
399
+ ].join("\n"));
400
+ }
401
+ // Kimi 0.36+ refuses openai_legacy as a wire protocol; ACP then
402
+ // skips default-model binding and falls through to OAuth. Patch
403
+ // aliases written before those keys existed; do not overwrite a
404
+ // user's protocol or context size.
405
+ if (hasTomlTable(text, modelHeading)) {
406
+ text = patchTomlTable(text, modelHeading, [`protocol = "openai"`, `max_context_size = 262144`]);
407
+ }
408
+ else {
409
+ blocks.push([
410
+ modelHeading,
411
+ `provider = ${quoteToml(inject.host)}`,
412
+ `model = ${quoteToml(inject.model)}`,
413
+ `protocol = "openai"`,
414
+ `max_context_size = 262144`,
415
+ "",
416
+ ].join("\n"));
417
+ }
418
+ if (blocks.length) {
419
+ const prefix = text && !text.endsWith("\n") ? `${text}\n\n` : text ? `${text}\n` : "";
420
+ writeFileSync(path, `${prefix}${blocks.join("\n")}`);
421
+ }
422
+ else if (text !== original) {
423
+ writeFileSync(path, text);
424
+ }
425
+ return alias;
426
+ }
427
+ /** Env keys Kimi 0.36+ reads to synthesize an in-memory default model.
428
+ * ACP `session/new` runs auth readiness against `default_model`, not `-m`.
429
+ * Without a default, a missing/expired `kimi login` becomes
430
+ * "Authentication required" even when the picker is a local host. */
431
+ const KIMI_MODEL_ENV = [
432
+ "KIMI_MODEL_NAME",
433
+ "KIMI_MODEL_API_KEY",
434
+ "KIMI_MODEL_BASE_URL",
435
+ "KIMI_MODEL_PROVIDER_TYPE",
436
+ "KIMI_MODEL_DISPLAY_NAME",
437
+ ];
438
+ /** Overlay a local inject as Kimi's in-memory default. Does not write
439
+ * config.toml — Kimi strips these reserved entries on persist. */
440
+ export function applyKimiLocalModelEnv(env, modelId) {
441
+ const inject = decodeInjectId(modelId);
442
+ if (!inject)
443
+ return;
444
+ const host = localHost(inject.host);
445
+ if (!host)
446
+ return;
447
+ env.KIMI_MODEL_NAME = inject.model;
448
+ env.KIMI_MODEL_API_KEY = hostApiKey(host, env);
449
+ env.KIMI_MODEL_BASE_URL = host.baseUrl;
450
+ // Env overlay accepts openai | anthropic | kimi — not the toml
451
+ // openai_legacy type we write for the on-disk provider row.
452
+ env.KIMI_MODEL_PROVIDER_TYPE = "openai";
453
+ env.KIMI_MODEL_DISPLAY_NAME = `${inject.model} (${host.label})`;
454
+ }
455
+ /** Drop leftover shell `KIMI_MODEL_*` so they cannot steal a cloud turn. */
456
+ function stripKimiModelEnv(env) {
457
+ for (const key of KIMI_MODEL_ENV)
458
+ delete env[key];
459
+ }
460
+ function readKimiModelCatalog(env) {
461
+ const dataRoot = kimiDataRoot(env);
462
+ let text = "";
463
+ try {
464
+ text = readFileSync(join(dataRoot, "config.toml"), "utf8");
465
+ }
466
+ catch {
467
+ return STATIC_KIMI_MODELS;
468
+ }
469
+ const options = STATIC_KIMI_MODELS.options.map((o) => ({ ...o }));
470
+ const seen = new Set(options.map((o) => o.id));
471
+ let current = null;
472
+ const flush = () => {
473
+ if (!current || !SLUG.test(current.slug) || seen.has(current.slug) || isLocalInjectAlias(current.slug)) {
474
+ current = null;
475
+ return;
476
+ }
477
+ seen.add(current.slug);
478
+ options.push({ id: current.slug, label: current.name || current.slug, custom: true });
479
+ current = null;
480
+ };
481
+ for (const line of text.split(/\r?\n/)) {
482
+ const stripped = line.trim();
483
+ if ((stripped.startsWith("[model.") || stripped.startsWith("[models.")) && stripped.endsWith("]")) {
484
+ flush();
485
+ let inner = stripped.replace(/^\[models?\./, "").slice(0, -1);
486
+ if (inner.startsWith('"') && inner.endsWith('"'))
487
+ inner = inner.slice(1, -1);
488
+ current = { slug: inner };
489
+ continue;
490
+ }
491
+ if (stripped.startsWith("[")) {
492
+ flush();
493
+ continue;
494
+ }
495
+ if (!stripped || stripped.startsWith("#") || !stripped.includes("="))
496
+ continue;
497
+ const eq = stripped.indexOf("=");
498
+ const key = stripped.slice(0, eq).trim();
499
+ let value = stripped.slice(eq + 1).trim();
500
+ if (value.length >= 2 && value.startsWith('"') && value.endsWith('"'))
501
+ value = value.slice(1, -1);
502
+ if (current && (key === "name" || key === "label") && value)
503
+ current.name = value;
504
+ }
505
+ flush();
506
+ return { default: STATIC_KIMI_MODELS.default, options };
507
+ }
508
+ const support = {
509
+ driverKind: "kimiAgent",
510
+ displayName: "Kimi",
511
+ // Aliases from the CLI's own catalog (~/.kimi-code/config.toml
512
+ // [models."kimi-code/…"] — `kimi provider list` reports the same four).
513
+ models: STATIC_KIMI_MODELS,
514
+ resolveModels: (env) => mergeLocalInject(readKimiModelCatalog(env), env),
515
+ defaultCli: "kimi",
516
+ nativeSource: "kimi.acp",
517
+ loginNote: "Kimi Code CLI is not signed in — run `kimi login` in a terminal",
518
+ // Official installers put the binary on PATH without requiring an existing
519
+ // Node install. Keep the commands platform-specific so Windows never gets a
520
+ // POSIX-only curl|bash instruction.
521
+ install: {
522
+ command: {
523
+ darwin: "curl -fsSL https://code.kimi.com/kimi-code/install.sh | bash",
524
+ linux: "curl -fsSL https://code.kimi.com/kimi-code/install.sh | bash",
525
+ win32: "irm https://code.kimi.com/kimi-code/install.ps1 | iex",
526
+ },
527
+ docsUrl: "https://moonshotai.github.io/kimi-code/en/guides/getting-started.html",
528
+ signInCommand: "kimi login",
529
+ },
530
+ // -m is a global commander option and must precede the `acp` subcommand
531
+ // (verified against 0.29.1).
532
+ resolveTurnModel: (model, env) => (model ? ensureKimiInjectAlias(model, env) : model),
533
+ spawnArgs: (_config, turn) => {
534
+ const model = turn.model;
535
+ return [...(model ? ["-m", model] : []), "acp"];
536
+ },
537
+ // Subscription CLI: a leaked Moonshot/Kimi API key must not flip billing
538
+ // to pay-as-you-go inside the spawned agent (mirrors claude/grok).
539
+ transformEnv: (env) => {
540
+ delete env.MOONSHOT_API_KEY;
541
+ delete env.KIMI_API_KEY;
542
+ // A leftover shell overlay would steal every Kimi turn, including
543
+ // subscription models. applyTurnEnv puts the inject back per turn.
544
+ stripKimiModelEnv(env);
545
+ },
546
+ applyTurnEnv: (env, { requestedModel }) => {
547
+ applyKimiLocalModelEnv(env, requestedModel);
548
+ },
549
+ // The only advertised authMethod is {id:"login", type:"terminal"} — a
550
+ // device-code flow that cannot be driven over ACP. Never pick it; ride
551
+ // the ambient login from a prior `kimi login` instead.
552
+ pickAuthMethod: () => null,
553
+ authFailure: "continue",
554
+ // Match the child CLI's own data-root precedence. A custom instance HOME or
555
+ // KIMI_CODE_HOME must not be checked against the server user's home instead.
556
+ isAuthenticated: (env) => existsSync(credentialsPath(env)),
557
+ buildPromptText: (turn) => (turn.system ? `${turn.system}\n\n${turn.text}` : turn.text),
558
+ };
559
+ export const KimiAgentDriver = createAcpDriver(support);