miko-code 0.1.0

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 (379) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +179 -0
  3. package/bin/miko +10 -0
  4. package/dist/client/antigravity.webp +0 -0
  5. package/dist/client/assets/abap-BdImnpbu.js +1 -0
  6. package/dist/client/assets/actionscript-3-CoDkCxhg.js +1 -0
  7. package/dist/client/assets/ada-bCR0ucgS.js +1 -0
  8. package/dist/client/assets/andromeeda-C4gqWexZ.js +1 -0
  9. package/dist/client/assets/angular-html-CU67Zn6k.js +1 -0
  10. package/dist/client/assets/angular-ts-BwZT4LLn.js +1 -0
  11. package/dist/client/assets/apache-Pmp26Uib.js +1 -0
  12. package/dist/client/assets/apex-D8_7TLub.js +1 -0
  13. package/dist/client/assets/apl-dKokRX4l.js +1 -0
  14. package/dist/client/assets/applescript-Co6uUVPk.js +1 -0
  15. package/dist/client/assets/ara-BRHolxvo.js +1 -0
  16. package/dist/client/assets/asciidoc-Ve4PFQV2.js +1 -0
  17. package/dist/client/assets/asm-D_Q5rh1f.js +1 -0
  18. package/dist/client/assets/astro-CbQHKStN.js +1 -0
  19. package/dist/client/assets/aurora-x-D-2ljcwZ.js +1 -0
  20. package/dist/client/assets/awk-DMzUqQB5.js +1 -0
  21. package/dist/client/assets/ayu-dark-DYE7WIF3.js +1 -0
  22. package/dist/client/assets/ayu-light-BA47KaF1.js +1 -0
  23. package/dist/client/assets/ayu-mirage-32ctXXKs.js +1 -0
  24. package/dist/client/assets/ballerina-BFfxhgS-.js +1 -0
  25. package/dist/client/assets/bat-BkioyH1T.js +1 -0
  26. package/dist/client/assets/beancount-k_qm7-4y.js +1 -0
  27. package/dist/client/assets/berry-uYugtg8r.js +1 -0
  28. package/dist/client/assets/bibtex-CHM0blh-.js +1 -0
  29. package/dist/client/assets/bicep-Bmn6On1c.js +1 -0
  30. package/dist/client/assets/bird2-DPOp833l.js +1 -0
  31. package/dist/client/assets/blade-D4QpJJKB.js +1 -0
  32. package/dist/client/assets/bsl-BO_Y6i37.js +1 -0
  33. package/dist/client/assets/c-BIGW1oBm.js +1 -0
  34. package/dist/client/assets/c3-eo99z4R2.js +1 -0
  35. package/dist/client/assets/cadence-Bv_4Rxtq.js +1 -0
  36. package/dist/client/assets/cairo-KRGpt6FW.js +1 -0
  37. package/dist/client/assets/catppuccin-frappe-DFWUc33u.js +1 -0
  38. package/dist/client/assets/catppuccin-latte-C9dUb6Cb.js +1 -0
  39. package/dist/client/assets/catppuccin-macchiato-DQyhUUbL.js +1 -0
  40. package/dist/client/assets/catppuccin-mocha-D87Tk5Gz.js +1 -0
  41. package/dist/client/assets/clarity-D53aC0YG.js +1 -0
  42. package/dist/client/assets/clojure-P80f7IUj.js +1 -0
  43. package/dist/client/assets/cmake-D1j8_8rp.js +1 -0
  44. package/dist/client/assets/cobol-nwyudZeR.js +1 -0
  45. package/dist/client/assets/codeowners-Bp6g37R7.js +1 -0
  46. package/dist/client/assets/codeql-DsOJ9woJ.js +1 -0
  47. package/dist/client/assets/coffee-Ch7k5sss.js +1 -0
  48. package/dist/client/assets/common-lisp-Cg-RD9OK.js +1 -0
  49. package/dist/client/assets/coq-DkFqJrB1.js +1 -0
  50. package/dist/client/assets/cpp-CofmeUqb.js +1 -0
  51. package/dist/client/assets/crystal-tKQVLTB8.js +1 -0
  52. package/dist/client/assets/csharp-COcwbKMJ.js +1 -0
  53. package/dist/client/assets/css-DPfMkruS.js +1 -0
  54. package/dist/client/assets/csv-fuZLfV_i.js +1 -0
  55. package/dist/client/assets/cue-D82EKSYY.js +1 -0
  56. package/dist/client/assets/cypher-COkxafJQ.js +1 -0
  57. package/dist/client/assets/d-85-TOEBH.js +1 -0
  58. package/dist/client/assets/dark-plus-C3mMm8J8.js +1 -0
  59. package/dist/client/assets/dart-CF10PKvl.js +1 -0
  60. package/dist/client/assets/dax-CEL-wOlO.js +1 -0
  61. package/dist/client/assets/desktop-BmXAJ9_W.js +1 -0
  62. package/dist/client/assets/diff-D97Zzqfu.js +1 -0
  63. package/dist/client/assets/docker-BcOcwvcX.js +1 -0
  64. package/dist/client/assets/dotenv-Da5cRb03.js +1 -0
  65. package/dist/client/assets/dracula-BzJJZx-M.js +1 -0
  66. package/dist/client/assets/dracula-soft-BXkSAIEj.js +1 -0
  67. package/dist/client/assets/dream-maker-BtqSS_iP.js +1 -0
  68. package/dist/client/assets/edge-BkV0erSs.js +1 -0
  69. package/dist/client/assets/elixir-CDX3lj18.js +1 -0
  70. package/dist/client/assets/elm-DbKCFpqz.js +1 -0
  71. package/dist/client/assets/emacs-lisp-C9XAeP06.js +1 -0
  72. package/dist/client/assets/erb-B12qg9BL.js +1 -0
  73. package/dist/client/assets/erlang-DsQrWhSR.js +1 -0
  74. package/dist/client/assets/everforest-dark-BgDCqdQA.js +1 -0
  75. package/dist/client/assets/everforest-light-C8M2exoo.js +1 -0
  76. package/dist/client/assets/fennel-BYunw83y.js +1 -0
  77. package/dist/client/assets/fish-BvzEVeQv.js +1 -0
  78. package/dist/client/assets/fluent-C4IJs8-o.js +1 -0
  79. package/dist/client/assets/fortran-fixed-form-CkoXwp7k.js +1 -0
  80. package/dist/client/assets/fortran-free-form-BxgE0vQu.js +1 -0
  81. package/dist/client/assets/fsharp-CXgrBDvD.js +1 -0
  82. package/dist/client/assets/gdresource-BOOCDP_w.js +1 -0
  83. package/dist/client/assets/gdscript-C5YyOfLZ.js +1 -0
  84. package/dist/client/assets/gdshader-DkwncUOv.js +1 -0
  85. package/dist/client/assets/genie-D0YGMca9.js +1 -0
  86. package/dist/client/assets/gherkin-DyxjwDmM.js +1 -0
  87. package/dist/client/assets/git-commit-F4YmCXRG.js +1 -0
  88. package/dist/client/assets/git-rebase-r7XF79zn.js +1 -0
  89. package/dist/client/assets/github-dark-DHJKELXO.js +1 -0
  90. package/dist/client/assets/github-dark-default-Cuk6v7N8.js +1 -0
  91. package/dist/client/assets/github-dark-dimmed-DH5Ifo-i.js +1 -0
  92. package/dist/client/assets/github-dark-high-contrast-E3gJ1_iC.js +1 -0
  93. package/dist/client/assets/github-light-DAi9KRSo.js +1 -0
  94. package/dist/client/assets/github-light-default-D7oLnXFd.js +1 -0
  95. package/dist/client/assets/github-light-high-contrast-BfjtVDDH.js +1 -0
  96. package/dist/client/assets/gleam-BspZqrRM.js +1 -0
  97. package/dist/client/assets/glimmer-js-Rg0-pVw9.js +1 -0
  98. package/dist/client/assets/glimmer-ts-U6CK756n.js +1 -0
  99. package/dist/client/assets/glsl-DplSGwfg.js +1 -0
  100. package/dist/client/assets/gn-n2N0HUVH.js +1 -0
  101. package/dist/client/assets/gnuplot-DdkO51Og.js +1 -0
  102. package/dist/client/assets/go-CxLEBnE3.js +1 -0
  103. package/dist/client/assets/graphql-ChdNCCLP.js +1 -0
  104. package/dist/client/assets/groovy-gcz8RCvz.js +1 -0
  105. package/dist/client/assets/gruvbox-dark-hard-CFHQjOhq.js +1 -0
  106. package/dist/client/assets/gruvbox-dark-medium-GsRaNv29.js +1 -0
  107. package/dist/client/assets/gruvbox-dark-soft-CVdnzihN.js +1 -0
  108. package/dist/client/assets/gruvbox-light-hard-CH1njM8p.js +1 -0
  109. package/dist/client/assets/gruvbox-light-medium-DRw_LuNl.js +1 -0
  110. package/dist/client/assets/gruvbox-light-soft-hJgmCMqR.js +1 -0
  111. package/dist/client/assets/hack-CaT9iCJl.js +1 -0
  112. package/dist/client/assets/haml-B8DHNrY2.js +1 -0
  113. package/dist/client/assets/handlebars-BL8al0AC.js +1 -0
  114. package/dist/client/assets/haskell-Df6bDoY_.js +1 -0
  115. package/dist/client/assets/haxe-CzTSHFRz.js +1 -0
  116. package/dist/client/assets/hcl-BWvSN4gD.js +1 -0
  117. package/dist/client/assets/hjson-D5-asLiD.js +1 -0
  118. package/dist/client/assets/hlsl-D3lLCCz7.js +1 -0
  119. package/dist/client/assets/horizon-BUw7H-hv.js +1 -0
  120. package/dist/client/assets/horizon-bright-Cn-bp-IR.js +1 -0
  121. package/dist/client/assets/houston-DnULxvSX.js +1 -0
  122. package/dist/client/assets/html-GMplVEZG.js +1 -0
  123. package/dist/client/assets/html-derivative-BFtXZ54Q.js +1 -0
  124. package/dist/client/assets/http-jrhK8wxY.js +1 -0
  125. package/dist/client/assets/hurl-irOxFIW8.js +1 -0
  126. package/dist/client/assets/hxml-Bvhsp5Yf.js +1 -0
  127. package/dist/client/assets/hy-DFXneXwc.js +1 -0
  128. package/dist/client/assets/imba-DGztddWO.js +1 -0
  129. package/dist/client/assets/index-C07zYq_-.css +32 -0
  130. package/dist/client/assets/index-Ce3hNHfL.js +2351 -0
  131. package/dist/client/assets/ini-BEwlwnbL.js +1 -0
  132. package/dist/client/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  133. package/dist/client/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  134. package/dist/client/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  135. package/dist/client/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  136. package/dist/client/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  137. package/dist/client/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  138. package/dist/client/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  139. package/dist/client/assets/java-CylS5w8V.js +1 -0
  140. package/dist/client/assets/javascript-wDzz0qaB.js +1 -0
  141. package/dist/client/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
  142. package/dist/client/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
  143. package/dist/client/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
  144. package/dist/client/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
  145. package/dist/client/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
  146. package/dist/client/assets/jinja-4LBKfQ-Z.js +1 -0
  147. package/dist/client/assets/jison-wvAkD_A8.js +1 -0
  148. package/dist/client/assets/json-Cp-IABpG.js +1 -0
  149. package/dist/client/assets/json5-C9tS-k6U.js +1 -0
  150. package/dist/client/assets/jsonc-Des-eS-w.js +1 -0
  151. package/dist/client/assets/jsonl-DcaNXYhu.js +1 -0
  152. package/dist/client/assets/jsonnet-DFQXde-d.js +1 -0
  153. package/dist/client/assets/jssm-C2t-YnRu.js +1 -0
  154. package/dist/client/assets/jsx-g9-lgVsj.js +1 -0
  155. package/dist/client/assets/julia-CxzCAyBv.js +1 -0
  156. package/dist/client/assets/just-Cw27pwNe.js +1 -0
  157. package/dist/client/assets/kanagawa-dragon-CkXjmgJE.js +1 -0
  158. package/dist/client/assets/kanagawa-lotus-CfQXZHmo.js +1 -0
  159. package/dist/client/assets/kanagawa-wave-DWedfzmr.js +1 -0
  160. package/dist/client/assets/kdl-DV7GczEv.js +1 -0
  161. package/dist/client/assets/kotlin-BdnUsdx6.js +1 -0
  162. package/dist/client/assets/kusto-DZf3V79B.js +1 -0
  163. package/dist/client/assets/laserwave-DUszq2jm.js +1 -0
  164. package/dist/client/assets/latex-CWtU0Tv5.js +1 -0
  165. package/dist/client/assets/lean-BZvkOJ9d.js +1 -0
  166. package/dist/client/assets/less-B1dDrJ26.js +1 -0
  167. package/dist/client/assets/light-plus-B7mTdjB0.js +1 -0
  168. package/dist/client/assets/liquid-DYVedYrR.js +1 -0
  169. package/dist/client/assets/llvm-DjAJT7YJ.js +1 -0
  170. package/dist/client/assets/log-2UxHyX5q.js +1 -0
  171. package/dist/client/assets/logo-BtOb2qkB.js +1 -0
  172. package/dist/client/assets/lua-BaeVxFsk.js +1 -0
  173. package/dist/client/assets/luau-C-HG3fhB.js +1 -0
  174. package/dist/client/assets/make-CHLpvVh8.js +1 -0
  175. package/dist/client/assets/markdown-Cvjx9yec.js +1 -0
  176. package/dist/client/assets/marko-CnJfTvn9.js +1 -0
  177. package/dist/client/assets/material-theme-D5KoaKCx.js +1 -0
  178. package/dist/client/assets/material-theme-darker-BfHTSMKl.js +1 -0
  179. package/dist/client/assets/material-theme-lighter-B0m2ddpp.js +1 -0
  180. package/dist/client/assets/material-theme-ocean-CyktbL80.js +1 -0
  181. package/dist/client/assets/material-theme-palenight-Csfq5Kiy.js +1 -0
  182. package/dist/client/assets/matlab-D7o27uSR.js +1 -0
  183. package/dist/client/assets/mdc-BMNejdWA.js +1 -0
  184. package/dist/client/assets/mdx-Cmh6b_Ma.js +1 -0
  185. package/dist/client/assets/mermaid-mWjccvbQ.js +1 -0
  186. package/dist/client/assets/min-dark-CafNBF8u.js +1 -0
  187. package/dist/client/assets/min-light-CTRr51gU.js +1 -0
  188. package/dist/client/assets/mipsasm-CKIfxQSi.js +1 -0
  189. package/dist/client/assets/mojo-rZm6bMo-.js +1 -0
  190. package/dist/client/assets/monokai-D4h5O-jR.js +1 -0
  191. package/dist/client/assets/moonbit-_H4v1dQx.js +1 -0
  192. package/dist/client/assets/move-IF9eRakj.js +1 -0
  193. package/dist/client/assets/narrat-DRg8JJMk.js +1 -0
  194. package/dist/client/assets/nextflow-Zz6hmt5N.js +1 -0
  195. package/dist/client/assets/nextflow-groovy-BeH2EWoN.js +1 -0
  196. package/dist/client/assets/nginx-BpAMiNFr.js +1 -0
  197. package/dist/client/assets/night-owl-C39BiMTA.js +1 -0
  198. package/dist/client/assets/night-owl-light-CMTm3GFP.js +1 -0
  199. package/dist/client/assets/nim-CVrawwO9.js +1 -0
  200. package/dist/client/assets/nix-CwoSXNpI.js +1 -0
  201. package/dist/client/assets/nord-Ddv68eIx.js +1 -0
  202. package/dist/client/assets/nushell-Cz2AlsmD.js +1 -0
  203. package/dist/client/assets/objective-c-DXmwc3jG.js +1 -0
  204. package/dist/client/assets/objective-cpp-CLxacb5B.js +1 -0
  205. package/dist/client/assets/ocaml-C0hk2d4L.js +1 -0
  206. package/dist/client/assets/odin-BBf5iR-q.js +1 -0
  207. package/dist/client/assets/one-dark-pro-DVMEJ2y_.js +1 -0
  208. package/dist/client/assets/one-light-C3Wv6jpd.js +1 -0
  209. package/dist/client/assets/openscad-C4EeE6gA.js +1 -0
  210. package/dist/client/assets/pascal-D93ZcfNL.js +1 -0
  211. package/dist/client/assets/perl-C0TMdlhV.js +1 -0
  212. package/dist/client/assets/php-Dhbhpdrm.js +1 -0
  213. package/dist/client/assets/pierre-dark-DF2SEV7i.js +1 -0
  214. package/dist/client/assets/pierre-light-DOlZxES8.js +1 -0
  215. package/dist/client/assets/pkl-u5AG7uiY.js +1 -0
  216. package/dist/client/assets/plastic-3e1v2bzS.js +1 -0
  217. package/dist/client/assets/plsql-ChMvpjG-.js +1 -0
  218. package/dist/client/assets/po-BTJTHyun.js +1 -0
  219. package/dist/client/assets/poimandres-CS3Unz2-.js +1 -0
  220. package/dist/client/assets/polar-C0HS_06l.js +1 -0
  221. package/dist/client/assets/postcss-CXtECtnM.js +1 -0
  222. package/dist/client/assets/powerquery-CEu0bR-o.js +1 -0
  223. package/dist/client/assets/powershell-Dpen1YoG.js +1 -0
  224. package/dist/client/assets/prisma-Dd19v3D-.js +1 -0
  225. package/dist/client/assets/prolog-CbFg5uaA.js +1 -0
  226. package/dist/client/assets/proto-C7zT0LnQ.js +1 -0
  227. package/dist/client/assets/pug-CGlum2m_.js +1 -0
  228. package/dist/client/assets/puppet-BMWR74SV.js +1 -0
  229. package/dist/client/assets/purescript-CklMAg4u.js +1 -0
  230. package/dist/client/assets/python-B6aJPvgy.js +1 -0
  231. package/dist/client/assets/qml-3beO22l8.js +1 -0
  232. package/dist/client/assets/qmldir-C8lEn-DE.js +1 -0
  233. package/dist/client/assets/qss-IeuSbFQv.js +1 -0
  234. package/dist/client/assets/r-Dspwwk_N.js +1 -0
  235. package/dist/client/assets/racket-BqYA7rlc.js +1 -0
  236. package/dist/client/assets/raku-DXvB9xmW.js +1 -0
  237. package/dist/client/assets/razor-Uh8Bk_45.js +1 -0
  238. package/dist/client/assets/red-bN70gL4F.js +1 -0
  239. package/dist/client/assets/reg-C-SQnVFl.js +1 -0
  240. package/dist/client/assets/regexp-CDVJQ6XC.js +1 -0
  241. package/dist/client/assets/rel-C3B-1QV4.js +1 -0
  242. package/dist/client/assets/riscv-BM1_JUlF.js +1 -0
  243. package/dist/client/assets/ron-D8l8udqQ.js +1 -0
  244. package/dist/client/assets/rose-pine-dawn-DHQR4-dF.js +1 -0
  245. package/dist/client/assets/rose-pine-moon-D4_iv3hh.js +1 -0
  246. package/dist/client/assets/rose-pine-qdsjHGoJ.js +1 -0
  247. package/dist/client/assets/rosmsg-BJDFO7_C.js +1 -0
  248. package/dist/client/assets/rst-BrH8l1NY.js +1 -0
  249. package/dist/client/assets/ruby-Dw2BHqvy.js +1 -0
  250. package/dist/client/assets/rust-B1yitclQ.js +1 -0
  251. package/dist/client/assets/sas-cz2c8ADy.js +1 -0
  252. package/dist/client/assets/sass-Cj5Yp3dK.js +1 -0
  253. package/dist/client/assets/scala-C151Ov-r.js +1 -0
  254. package/dist/client/assets/scheme-C98Dy4si.js +1 -0
  255. package/dist/client/assets/scratchpad-page-DcMny6uZ.js +1 -0
  256. package/dist/client/assets/scss-OYdSNvt2.js +1 -0
  257. package/dist/client/assets/sdbl-DVxCFoDh.js +1 -0
  258. package/dist/client/assets/shaderlab-Dg9Lc6iA.js +1 -0
  259. package/dist/client/assets/shellscript-Yzrsuije.js +1 -0
  260. package/dist/client/assets/shellsession-BADoaaVG.js +1 -0
  261. package/dist/client/assets/slack-dark-BthQWCQV.js +1 -0
  262. package/dist/client/assets/slack-ochin-DqwNpetd.js +1 -0
  263. package/dist/client/assets/smalltalk-BERRCDM3.js +1 -0
  264. package/dist/client/assets/snazzy-light-Bw305WKR.js +1 -0
  265. package/dist/client/assets/solarized-dark-DXbdFlpD.js +1 -0
  266. package/dist/client/assets/solarized-light-L9t79GZl.js +1 -0
  267. package/dist/client/assets/solidity-rGO070M0.js +1 -0
  268. package/dist/client/assets/soy-Brmx7dQM.js +1 -0
  269. package/dist/client/assets/sparql-rVzFXLq3.js +1 -0
  270. package/dist/client/assets/splunk-BtCnVYZw.js +1 -0
  271. package/dist/client/assets/sql-BLtJtn59.js +1 -0
  272. package/dist/client/assets/ssh-config-_ykCGR6B.js +1 -0
  273. package/dist/client/assets/stata-BH5u7GGu.js +1 -0
  274. package/dist/client/assets/stylus-BEDo0Tqx.js +1 -0
  275. package/dist/client/assets/surrealql-Bq5Q-fJD.js +1 -0
  276. package/dist/client/assets/svelte-C_ipcX3V.js +1 -0
  277. package/dist/client/assets/swift-D82vCrfD.js +1 -0
  278. package/dist/client/assets/synthwave-84-CbfX1IO0.js +1 -0
  279. package/dist/client/assets/system-verilog-CnnmHF94.js +1 -0
  280. package/dist/client/assets/systemd-4A_iFExJ.js +1 -0
  281. package/dist/client/assets/talonscript-CkByrt1z.js +1 -0
  282. package/dist/client/assets/tasl-QIJgUcNo.js +1 -0
  283. package/dist/client/assets/tcl-dwOrl1Do.js +1 -0
  284. package/dist/client/assets/templ-P3uqSqPl.js +1 -0
  285. package/dist/client/assets/terraform-BETggiCN.js +1 -0
  286. package/dist/client/assets/tex-idrVyKtj.js +1 -0
  287. package/dist/client/assets/tokyo-night-hegEt444.js +1 -0
  288. package/dist/client/assets/toml-vGWfd6FD.js +1 -0
  289. package/dist/client/assets/ts-tags-zn1MmPIZ.js +1 -0
  290. package/dist/client/assets/tsv-B_m7g4N7.js +1 -0
  291. package/dist/client/assets/tsx-COt5Ahok.js +1 -0
  292. package/dist/client/assets/turtle-BsS91CYL.js +1 -0
  293. package/dist/client/assets/twig-DNn4PbVi.js +1 -0
  294. package/dist/client/assets/typescript-BPQ3VLAy.js +1 -0
  295. package/dist/client/assets/typespec-BGHnOYBU.js +1 -0
  296. package/dist/client/assets/typst-DHCkPAjA.js +1 -0
  297. package/dist/client/assets/v-BcVCzyr7.js +1 -0
  298. package/dist/client/assets/vala-CsfeWuGM.js +1 -0
  299. package/dist/client/assets/vb-D17OF-Vu.js +1 -0
  300. package/dist/client/assets/verilog-BQ8w6xss.js +1 -0
  301. package/dist/client/assets/vesper-DU1UobuO.js +1 -0
  302. package/dist/client/assets/vhdl-CeAyd5Ju.js +1 -0
  303. package/dist/client/assets/viml-CJc9bBzg.js +1 -0
  304. package/dist/client/assets/vitesse-black-Bkuqu6BP.js +1 -0
  305. package/dist/client/assets/vitesse-dark-D0r3Knsf.js +1 -0
  306. package/dist/client/assets/vitesse-light-CVO1_9PV.js +1 -0
  307. package/dist/client/assets/vue-DN_0RTcg.js +1 -0
  308. package/dist/client/assets/vue-html-AaS7Mt5G.js +1 -0
  309. package/dist/client/assets/vue-vine-CQOfvN7w.js +1 -0
  310. package/dist/client/assets/vyper-CDx5xZoG.js +1 -0
  311. package/dist/client/assets/wasm-CG6Dc4jp.js +1 -0
  312. package/dist/client/assets/wasm-MzD3tlZU.js +1 -0
  313. package/dist/client/assets/wenyan-BV7otONQ.js +1 -0
  314. package/dist/client/assets/wgsl-Dx-B1_4e.js +1 -0
  315. package/dist/client/assets/wikitext-BhOHFoWU.js +1 -0
  316. package/dist/client/assets/wit-5i3qLPDT.js +1 -0
  317. package/dist/client/assets/wolfram-lXgVvXCa.js +1 -0
  318. package/dist/client/assets/xml-sdJ4AIDG.js +1 -0
  319. package/dist/client/assets/xsl-CtQFsRM5.js +1 -0
  320. package/dist/client/assets/yaml-Buea-lGh.js +1 -0
  321. package/dist/client/assets/zenscript-DVFEvuxE.js +1 -0
  322. package/dist/client/assets/zig-VOosw3JB.js +1 -0
  323. package/dist/client/cursor.png +0 -0
  324. package/dist/client/favicon.svg +17 -0
  325. package/dist/client/finder.png +0 -0
  326. package/dist/client/icons/claude.svg +1 -0
  327. package/dist/client/icons/openai.svg +1 -0
  328. package/dist/client/images/github.png +0 -0
  329. package/dist/client/index.html +15 -0
  330. package/dist/client/logo.svg +17 -0
  331. package/dist/client/terminal.png +0 -0
  332. package/dist/client/vscode.png +0 -0
  333. package/dist/client/warp.png +0 -0
  334. package/package.json +107 -0
  335. package/src/server/agent-instruction-attachments.ts +458 -0
  336. package/src/server/agent.ts +1879 -0
  337. package/src/server/cli-runtime.ts +418 -0
  338. package/src/server/cli-supervisor.ts +90 -0
  339. package/src/server/cli.ts +102 -0
  340. package/src/server/codex-app-server-protocol.ts +478 -0
  341. package/src/server/codex-app-server.ts +1645 -0
  342. package/src/server/data-dir-lock.ts +128 -0
  343. package/src/server/diff-store.ts +1587 -0
  344. package/src/server/durable-file.ts +74 -0
  345. package/src/server/event-store.ts +1448 -0
  346. package/src/server/event.ts +249 -0
  347. package/src/server/external-file-access.ts +48 -0
  348. package/src/server/external-open.ts +259 -0
  349. package/src/server/generate-title.ts +75 -0
  350. package/src/server/git-refresh-poller.ts +92 -0
  351. package/src/server/github-rest-client.ts +176 -0
  352. package/src/server/harness-types.ts +24 -0
  353. package/src/server/keybindings.ts +203 -0
  354. package/src/server/machine-name.ts +22 -0
  355. package/src/server/paths.ts +51 -0
  356. package/src/server/pr-manager.ts +1204 -0
  357. package/src/server/pr-refresh-poller.ts +126 -0
  358. package/src/server/process-utils.ts +18 -0
  359. package/src/server/provider-catalog.ts +90 -0
  360. package/src/server/quick-response.ts +274 -0
  361. package/src/server/read-models.ts +311 -0
  362. package/src/server/restart.ts +33 -0
  363. package/src/server/scratchpad-manager.ts +87 -0
  364. package/src/server/server.ts +759 -0
  365. package/src/server/share.ts +126 -0
  366. package/src/server/terminal-manager.ts +371 -0
  367. package/src/server/update-manager.ts +250 -0
  368. package/src/server/uploads.ts +191 -0
  369. package/src/server/workspace-file-search.ts +191 -0
  370. package/src/server/workspace-manager.ts +627 -0
  371. package/src/server/workspace-polling.ts +10 -0
  372. package/src/server/ws-router.ts +1039 -0
  373. package/src/shared/branding.ts +69 -0
  374. package/src/shared/dev-ports.ts +100 -0
  375. package/src/shared/ports.ts +2 -0
  376. package/src/shared/protocol.ts +217 -0
  377. package/src/shared/tools.ts +324 -0
  378. package/src/shared/types.ts +1220 -0
  379. package/tsconfig.json +35 -0
@@ -0,0 +1,418 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ import process from 'node:process';
3
+ import {
4
+ APP_NAME,
5
+ CLI_COMMAND,
6
+ getDataDirDisplay,
7
+ LOG_PREFIX,
8
+ PACKAGE_NAME,
9
+ } from '../shared/branding';
10
+ import { PROD_SERVER_PORT } from '../shared/ports';
11
+ import type { UpdateInstallErrorCode } from '../shared/types';
12
+ import { hasCommand, spawnDetached } from './process-utils';
13
+ import { CLI_SUPPRESS_OPEN_ONCE_ENV_VAR } from './restart';
14
+ import {
15
+ logShareDetails,
16
+ renderTerminalQr,
17
+ type StartedShareTunnel,
18
+ startShareTunnel,
19
+ } from './share';
20
+
21
+ export interface CliOptions {
22
+ port: number;
23
+ host: string;
24
+ openBrowser: boolean;
25
+ share: boolean;
26
+ strictPort: boolean;
27
+ }
28
+
29
+ export interface CliUpdateOptions {
30
+ version: string;
31
+ fetchLatestVersion: (packageName: string) => Promise<string>;
32
+ installVersion: (packageName: string, version: string) => UpdateInstallAttemptResult;
33
+ argv: string[];
34
+ command: string;
35
+ }
36
+
37
+ export interface StartedCli {
38
+ kind: 'started';
39
+ stop: () => Promise<void>;
40
+ }
41
+
42
+ export interface RestartingCli {
43
+ kind: 'restarting';
44
+ reason: 'startup_update' | 'ui_update';
45
+ }
46
+
47
+ export interface ExitedCli {
48
+ kind: 'exited';
49
+ code: number;
50
+ }
51
+
52
+ export type CliRunResult = StartedCli | RestartingCli | ExitedCli;
53
+
54
+ export interface CliRuntimeDeps {
55
+ version: string;
56
+ bunVersion: string;
57
+ startServer: (
58
+ options: CliOptions & {
59
+ update: CliUpdateOptions;
60
+ onMigrationProgress?: (message: string) => void;
61
+ },
62
+ ) => Promise<{ port: number; stop: () => Promise<void> }>;
63
+ fetchLatestVersion: (packageName: string) => Promise<string>;
64
+ installVersion: (packageName: string, version: string) => UpdateInstallAttemptResult;
65
+ openUrl: (url: string) => void;
66
+ log: (message: string) => void;
67
+ warn: (message: string) => void;
68
+ renderShareQr?: (url: string) => Promise<string>;
69
+ startShareTunnel?: (localUrl: string) => Promise<StartedShareTunnel>;
70
+ }
71
+
72
+ export interface UpdateInstallAttemptResult {
73
+ ok: boolean;
74
+ errorCode: UpdateInstallErrorCode | null;
75
+ userTitle: string | null;
76
+ userMessage: string | null;
77
+ }
78
+
79
+ type ParsedArgs = { kind: 'run'; options: CliOptions } | { kind: 'help' } | { kind: 'version' };
80
+
81
+ const MINIMUM_BUN_VERSION = '1.3.5';
82
+
83
+ function printHelp() {
84
+ console.log(`${APP_NAME} — local-only project chat UI
85
+
86
+ Usage:
87
+ ${CLI_COMMAND} [options]
88
+
89
+ Options:
90
+ --port <number> Port to listen on (default: ${PROD_SERVER_PORT})
91
+ --host <host> Bind to a specific host or IP
92
+ --remote Shortcut for --host 0.0.0.0
93
+ --share Create a public Cloudflare share URL with terminal QR
94
+ --strict-port Fail instead of trying another port
95
+ --no-open Don't open browser automatically
96
+ --version Print version and exit
97
+ --help Show this help message`);
98
+ }
99
+
100
+ export function parseArgs(argv: string[]): ParsedArgs {
101
+ let port = PROD_SERVER_PORT;
102
+ let host = '127.0.0.1';
103
+ let openBrowser = true;
104
+ let share = false;
105
+ let sawHost = false;
106
+ let sawRemote = false;
107
+ let strictPort = false;
108
+
109
+ for (let index = 0; index < argv.length; index += 1) {
110
+ const arg = argv[index];
111
+ if (arg === '--version' || arg === '-v') {
112
+ return { kind: 'version' };
113
+ }
114
+
115
+ if (arg === '--help' || arg === '-h') {
116
+ return { kind: 'help' };
117
+ }
118
+
119
+ if (arg === '--port') {
120
+ const next = argv[index + 1];
121
+ if (!next) throw new Error('Missing value for --port');
122
+
123
+ const parsedPort = Number(next);
124
+ if (!Number.isInteger(parsedPort) || parsedPort < 1 || parsedPort > 65_535) {
125
+ throw new Error(
126
+ `Invalid value for --port: ${next}. Expected an integer between 1 and 65535.`,
127
+ );
128
+ }
129
+
130
+ port = parsedPort;
131
+ index += 1;
132
+ continue;
133
+ }
134
+
135
+ if (arg === '--host') {
136
+ const next = argv[index + 1];
137
+ if (!next || next.startsWith('-')) throw new Error('Missing value for --host');
138
+ if (share) throw new Error('--share cannot be used with --host');
139
+
140
+ host = next;
141
+ sawHost = true;
142
+ index += 1;
143
+ continue;
144
+ }
145
+
146
+ if (arg === '--remote') {
147
+ if (share) throw new Error('--share cannot be used with --remote');
148
+ host = '0.0.0.0';
149
+ sawRemote = true;
150
+ continue;
151
+ }
152
+
153
+ if (arg === '--share') {
154
+ if (sawHost) throw new Error('--share cannot be used with --host');
155
+ if (sawRemote) throw new Error('--share cannot be used with --remote');
156
+
157
+ share = true;
158
+ continue;
159
+ }
160
+
161
+ if (arg === '--no-open') {
162
+ openBrowser = false;
163
+ continue;
164
+ }
165
+
166
+ if (arg === '--strict-port') {
167
+ strictPort = true;
168
+ continue;
169
+ }
170
+
171
+ if (arg.startsWith('-')) throw new Error(`Unknown option: ${arg}`);
172
+ throw new Error(`Unexpected positional argument: ${arg}`);
173
+ }
174
+
175
+ return {
176
+ kind: 'run',
177
+ options: {
178
+ port,
179
+ host,
180
+ openBrowser,
181
+ share,
182
+ strictPort,
183
+ },
184
+ };
185
+ }
186
+
187
+ export function compareVersions(currentVersion: string, latestVersion: string) {
188
+ const currentParts = normalizeVersion(currentVersion);
189
+ const latestParts = normalizeVersion(latestVersion);
190
+ const length = Math.max(currentParts.length, latestParts.length);
191
+
192
+ for (let index = 0; index < length; index += 1) {
193
+ const current = currentParts[index] ?? 0;
194
+ const latest = latestParts[index] ?? 0;
195
+
196
+ if (current === latest) continue;
197
+ return current < latest ? -1 : 1;
198
+ }
199
+
200
+ return 0;
201
+ }
202
+
203
+ function normalizeVersion(version: string) {
204
+ return version
205
+ .trim()
206
+ .replace(/^v/i, '')
207
+ .split('-')[0]
208
+ .split('.')
209
+ .map((part) => Number.parseInt(part, 10))
210
+ .filter((part) => Number.isFinite(part));
211
+ }
212
+
213
+ async function maybeSelfUpdate(_argv: string[], deps: CliRuntimeDeps) {
214
+ if (process.env.MIKO_DISABLE_SELF_UPDATE === '1') {
215
+ return null;
216
+ }
217
+
218
+ deps.log(`${LOG_PREFIX} checking for updates`);
219
+
220
+ let latestVersion: string;
221
+ try {
222
+ latestVersion = await deps.fetchLatestVersion(PACKAGE_NAME);
223
+ } catch (error) {
224
+ deps.warn(`${LOG_PREFIX} update check failed, continuing current version`);
225
+ if (error instanceof Error && error.message) {
226
+ deps.warn(`${LOG_PREFIX} ${error.message}`);
227
+ }
228
+ return null;
229
+ }
230
+
231
+ if (!latestVersion || compareVersions(deps.version, latestVersion) >= 0) {
232
+ return null;
233
+ }
234
+
235
+ deps.log(`${LOG_PREFIX} installing ${PACKAGE_NAME}@${latestVersion}`);
236
+ const installResult = deps.installVersion(PACKAGE_NAME, latestVersion);
237
+ if (!installResult.ok) {
238
+ deps.warn(`${LOG_PREFIX} update failed, continuing current version`);
239
+ if (installResult.userMessage) {
240
+ deps.warn(`${LOG_PREFIX} ${installResult.userMessage}`);
241
+ }
242
+ return null;
243
+ }
244
+
245
+ deps.log(`${LOG_PREFIX} restarting into updated version`);
246
+ return 'startup_update';
247
+ }
248
+
249
+ export async function runCli(argv: string[], deps: CliRuntimeDeps): Promise<CliRunResult> {
250
+ const parsedArgs = parseArgs(argv);
251
+ if (parsedArgs.kind === 'version') {
252
+ deps.log(deps.version);
253
+ return { kind: 'exited', code: 0 };
254
+ }
255
+
256
+ if (parsedArgs.kind === 'help') {
257
+ printHelp();
258
+ return { kind: 'exited', code: 0 };
259
+ }
260
+
261
+ if (compareVersions(deps.bunVersion, MINIMUM_BUN_VERSION) < 0) {
262
+ deps.warn(
263
+ `${LOG_PREFIX} Bun ${MINIMUM_BUN_VERSION}+ is required for the embedded terminal. Current Bun: ${deps.bunVersion}`,
264
+ );
265
+ return { kind: 'exited', code: 1 };
266
+ }
267
+
268
+ const shouldRestart = await maybeSelfUpdate(argv, deps);
269
+ if (shouldRestart !== null) {
270
+ return { kind: 'restarting', reason: shouldRestart };
271
+ }
272
+
273
+ const { port, stop } = await deps.startServer({
274
+ ...parsedArgs.options,
275
+ onMigrationProgress: deps.log,
276
+ update: {
277
+ version: deps.version,
278
+ fetchLatestVersion: deps.fetchLatestVersion,
279
+ installVersion: deps.installVersion,
280
+ argv,
281
+ command: CLI_COMMAND,
282
+ },
283
+ });
284
+
285
+ const bindHost = parsedArgs.options.host;
286
+ const displayHost =
287
+ parsedArgs.options.share || bindHost === '127.0.0.1' || bindHost === '0.0.0.0'
288
+ ? 'localhost'
289
+ : bindHost;
290
+
291
+ const launchUrl = `http://${displayHost}:${port}`;
292
+ let shareTunnelStop: (() => void) | null = null;
293
+
294
+ deps.log(`${LOG_PREFIX} listening on http://${bindHost}:${port}`);
295
+ deps.log(`${LOG_PREFIX} data dir: ${getDataDirDisplay()}`);
296
+
297
+ const suppressOpenBrowser = process.env[CLI_SUPPRESS_OPEN_ONCE_ENV_VAR] === '1';
298
+ if (parsedArgs.options.share) {
299
+ try {
300
+ const shareTunnel = await (
301
+ deps.startShareTunnel ??
302
+ ((localUrl) =>
303
+ startShareTunnel(localUrl, {
304
+ log: (message) => deps.log(`${LOG_PREFIX} ${message}`),
305
+ }))
306
+ )(launchUrl);
307
+ shareTunnelStop = shareTunnel.stop;
308
+
309
+ await logShareDetails(
310
+ deps.log,
311
+ shareTunnel.publicUrl,
312
+ launchUrl,
313
+ deps.renderShareQr ?? renderTerminalQr,
314
+ );
315
+ } catch (error) {
316
+ await stop();
317
+ deps.warn(`${LOG_PREFIX} failed to start Cloudflare share tunnel`);
318
+ if (error instanceof Error && error.message) {
319
+ deps.warn(`${LOG_PREFIX} ${error.message}`);
320
+ }
321
+ return { kind: 'exited', code: 1 };
322
+ }
323
+ }
324
+
325
+ if (parsedArgs.options.openBrowser && !parsedArgs.options.share && !suppressOpenBrowser) {
326
+ deps.openUrl(launchUrl);
327
+ }
328
+
329
+ return {
330
+ kind: 'started',
331
+ stop: async () => {
332
+ shareTunnelStop?.();
333
+ await stop();
334
+ },
335
+ };
336
+ }
337
+
338
+ export function openUrl(url: string) {
339
+ const platform = process.platform;
340
+ if (platform === 'darwin') {
341
+ spawnDetached('open', [url]);
342
+ } else if (platform === 'win32') {
343
+ spawnDetached('cmd', ['/c', 'start', '', url]);
344
+ } else {
345
+ spawnDetached('xdg-open', [url]);
346
+ }
347
+ console.log(`${LOG_PREFIX} opened in default browser`);
348
+ }
349
+
350
+ export async function fetchLatestPackageVersion(packageName: string) {
351
+ const response = await fetch(
352
+ `https://registry.npmjs.org/${encodeURIComponent(packageName)}/latest`,
353
+ { signal: AbortSignal.timeout(5_000) },
354
+ );
355
+
356
+ if (!response.ok) {
357
+ throw new Error(`registry returned ${response.status}`);
358
+ }
359
+
360
+ const payload = (await response.json()) as { version?: unknown };
361
+ if (typeof payload.version !== 'string' || !payload.version.trim()) {
362
+ throw new Error('registry response did not include a version');
363
+ }
364
+
365
+ return payload.version;
366
+ }
367
+
368
+ export function classifyInstallVersionFailure(output: string): UpdateInstallAttemptResult {
369
+ const normalizedOutput = output.trim();
370
+ if (/No version matching .* found|failed to resolve/i.test(normalizedOutput)) {
371
+ return {
372
+ ok: false,
373
+ errorCode: 'version_not_live_yet',
374
+ userTitle: 'Update not live yet',
375
+ userMessage: 'This update is still propagating. Try again in a few minutes.',
376
+ };
377
+ }
378
+
379
+ return {
380
+ ok: false,
381
+ errorCode: 'install_failed',
382
+ userTitle: 'Update failed',
383
+ userMessage: 'Miko could not install the update. Try again later.',
384
+ };
385
+ }
386
+
387
+ export function installPackageVersion(packageName: string, version: string) {
388
+ if (!hasCommand('bun')) {
389
+ return {
390
+ ok: false,
391
+ errorCode: 'command_missing',
392
+ userTitle: 'Bun not found',
393
+ userMessage: 'Miko could not find Bun to install the update.',
394
+ } satisfies UpdateInstallAttemptResult;
395
+ }
396
+
397
+ const result = spawnSync('bun', ['install', '-g', `${packageName}@${version}`], {
398
+ stdio: ['ignore', 'pipe', 'pipe'],
399
+ encoding: 'utf8',
400
+ });
401
+
402
+ const stdout = result.stdout ?? '';
403
+ const stderr = result.stderr ?? '';
404
+
405
+ if (stdout) process.stdout.write(stdout);
406
+ if (stderr) process.stderr.write(stderr);
407
+
408
+ if (result.status === 0) {
409
+ return {
410
+ ok: true,
411
+ errorCode: null,
412
+ userTitle: null,
413
+ userMessage: null,
414
+ } satisfies UpdateInstallAttemptResult;
415
+ }
416
+
417
+ return classifyInstallVersionFailure(`${stdout}\n${stderr}`);
418
+ }
@@ -0,0 +1,90 @@
1
+ import { spawn } from 'node:child_process';
2
+ import process from 'node:process';
3
+ import { CLI_COMMAND, LOG_PREFIX } from '../shared/branding';
4
+ import {
5
+ CLI_CHILD_ARGS_ENV_VAR,
6
+ CLI_CHILD_COMMAND_ENV_VAR,
7
+ CLI_CHILD_MODE,
8
+ CLI_CHILD_MODE_ENV_VAR,
9
+ CLI_SUPPRESS_OPEN_ONCE_ENV_VAR,
10
+ isUiUpdateRestart,
11
+ parseChildArgsEnv,
12
+ shouldRestartCliProcess,
13
+ } from './restart';
14
+
15
+ interface ChildExit {
16
+ code: number | null;
17
+ signal: NodeJS.Signals | null;
18
+ }
19
+
20
+ export function getChildProcessSpec(env: NodeJS.ProcessEnv = process.env) {
21
+ const command = env[CLI_CHILD_COMMAND_ENV_VAR] || CLI_COMMAND;
22
+ const args = parseChildArgsEnv(env[CLI_CHILD_ARGS_ENV_VAR]);
23
+ return { command, args };
24
+ }
25
+
26
+ export function spawnChild(argv: string[], suppressOpenThisChild: boolean) {
27
+ const childProcess = getChildProcessSpec();
28
+ return new Promise<ChildExit>((resolve, reject) => {
29
+ const child = spawn(childProcess.command, [...childProcess.args, ...argv], {
30
+ stdio: 'inherit',
31
+ env: {
32
+ ...process.env,
33
+ [CLI_CHILD_MODE_ENV_VAR]: CLI_CHILD_MODE,
34
+ ...(suppressOpenThisChild ? { [CLI_SUPPRESS_OPEN_ONCE_ENV_VAR]: '1' } : {}),
35
+ },
36
+ });
37
+
38
+ const forwardSignal = (signal: NodeJS.Signals) => {
39
+ if (child.exitCode !== null) return;
40
+ child.kill(signal);
41
+ };
42
+
43
+ const onSigint = () => {
44
+ forwardSignal('SIGINT');
45
+ };
46
+
47
+ const onSigterm = () => {
48
+ forwardSignal('SIGTERM');
49
+ };
50
+
51
+ process.on('SIGINT', onSigint);
52
+ process.on('SIGTERM', onSigterm);
53
+
54
+ child.once('error', (error) => {
55
+ process.off('SIGINT', onSigint);
56
+ process.off('SIGTERM', onSigterm);
57
+ reject(error);
58
+ });
59
+
60
+ child.once('exit', (code, signal) => {
61
+ process.off('SIGINT', onSigint);
62
+ process.off('SIGTERM', onSigterm);
63
+ resolve({ code, signal });
64
+ });
65
+ });
66
+ }
67
+
68
+ export async function runCliSupervisor(argv: string[]) {
69
+ let suppressOpenOnNextChild = false;
70
+
71
+ while (true) {
72
+ const suppressOpenThisChild = suppressOpenOnNextChild;
73
+ suppressOpenOnNextChild = false;
74
+
75
+ const result = await spawnChild(argv, suppressOpenThisChild);
76
+ if (shouldRestartCliProcess(result.code, result.signal)) {
77
+ suppressOpenOnNextChild = isUiUpdateRestart(result.code, result.signal);
78
+ console.log(
79
+ `${LOG_PREFIX} supervisor restarting ${CLI_COMMAND} in the same terminal session`,
80
+ );
81
+ continue;
82
+ }
83
+
84
+ process.exit(result.code ?? (result.signal ? 1 : 0));
85
+ }
86
+ }
87
+
88
+ if (import.meta.main) {
89
+ await runCliSupervisor(process.argv.slice(2));
90
+ }
@@ -0,0 +1,102 @@
1
+ import process from 'node:process';
2
+ import { LOG_PREFIX } from '../shared/branding';
3
+ import { fetchLatestPackageVersion, installPackageVersion, openUrl, runCli } from './cli-runtime';
4
+ import { CLI_STARTUP_UPDATE_RESTART_EXIT_CODE, CLI_UI_UPDATE_RESTART_EXIT_CODE } from './restart';
5
+ import { startServer } from './server';
6
+
7
+ // Read version from package.json at the package root.
8
+ const pkg = await Bun.file(new URL('../../package.json', import.meta.url)).json();
9
+ const VERSION: string = pkg.version ?? '0.0.0';
10
+
11
+ const argv = process.argv.slice(2);
12
+ let resolveExitAction: ((action: 'ui_restart' | 'exit') => void) | null = null;
13
+ let pendingExitAction: 'ui_restart' | 'exit' | null = null;
14
+
15
+ function triggerExitAction(action: 'ui_restart' | 'exit') {
16
+ if (resolveExitAction) {
17
+ const resolve = resolveExitAction;
18
+ resolveExitAction = null;
19
+ resolve(action);
20
+ return;
21
+ }
22
+
23
+ // Buffer early actions until the exit promise is armed.
24
+ if (pendingExitAction === null || action === 'ui_restart') {
25
+ pendingExitAction = action;
26
+ }
27
+ }
28
+
29
+ const result = await runCli(argv, {
30
+ version: VERSION,
31
+ bunVersion: Bun.version,
32
+ startServer: async (options) => {
33
+ const started = await startServer({
34
+ port: options.port,
35
+ host: options.host,
36
+ strictPort: options.strictPort,
37
+ onMigrationProgress: options.onMigrationProgress,
38
+ update: options.update,
39
+ });
40
+
41
+ const maybeUpdateManager = started as {
42
+ updateManager?: {
43
+ onChange: (listener: (snapshot: { status: string }) => void) => void;
44
+ };
45
+ };
46
+
47
+ if (maybeUpdateManager.updateManager && options.update) {
48
+ maybeUpdateManager.updateManager.onChange((snapshot) => {
49
+ if (snapshot.status !== 'restart_pending') return;
50
+ console.log(`${LOG_PREFIX} update installed, shutting down current process for restart`);
51
+ triggerExitAction('ui_restart');
52
+ });
53
+ }
54
+
55
+ return {
56
+ port: started.port,
57
+ stop: () => started.stop(),
58
+ };
59
+ },
60
+ fetchLatestVersion: fetchLatestPackageVersion,
61
+ installVersion: installPackageVersion,
62
+ openUrl,
63
+ log: console.log,
64
+ warn: console.warn,
65
+ });
66
+
67
+ if (result.kind === 'exited') {
68
+ process.exit(result.code);
69
+ }
70
+
71
+ if (result.kind === 'restarting') {
72
+ process.exit(
73
+ result.reason === 'startup_update'
74
+ ? CLI_STARTUP_UPDATE_RESTART_EXIT_CODE
75
+ : CLI_UI_UPDATE_RESTART_EXIT_CODE,
76
+ );
77
+ }
78
+
79
+ const exitAction = await new Promise<'ui_restart' | 'exit'>((resolve) => {
80
+ resolveExitAction = resolve;
81
+
82
+ if (pendingExitAction) {
83
+ const action = pendingExitAction;
84
+ pendingExitAction = null;
85
+ triggerExitAction(action);
86
+ return;
87
+ }
88
+
89
+ const shutdown = () => {
90
+ triggerExitAction('exit');
91
+ };
92
+
93
+ process.once('SIGINT', shutdown);
94
+ process.once('SIGTERM', shutdown);
95
+ });
96
+
97
+ await result.stop();
98
+ if (exitAction === 'ui_restart') {
99
+ console.log(`${LOG_PREFIX} current process stopped, handing restart back to supervisor`);
100
+ }
101
+
102
+ process.exit(exitAction === 'ui_restart' ? CLI_UI_UPDATE_RESTART_EXIT_CODE : 0);