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,458 @@
1
+ import { mkdir, readdir, rm, stat } from 'node:fs/promises';
2
+ import { homedir } from 'node:os';
3
+ import path from 'node:path';
4
+ import { getDataDir } from 'src/shared/branding';
5
+ import type {
6
+ ChatAttachment,
7
+ PullRequestCommentSnapshot,
8
+ WorkspaceGitSnapshot,
9
+ } from 'src/shared/types';
10
+ import type { DirectoryRecord, WorkspaceRecord } from './event';
11
+
12
+ const CREATE_PR_INSTRUCTIONS_FILE_NAME = 'create-pr-instructions.md';
13
+ const FAILING_CI_LOGS_FILE_NAME = 'failing-ci-logs.txt';
14
+ const MERGE_CONFLICT_INSTRUCTIONS_FILE_NAME = 'merge-conflict-instructions.md';
15
+ const SELECTED_REVIEW_COMMENTS_FILE_NAME = 'selected-review-comments.txt';
16
+ const REVIEW_INSTRUCTIONS_FILE_NAME = 'review-instructions.md';
17
+ const INSTRUCTION_FILE_PATTERN =
18
+ /^(?:create-pr|failing-ci|merge-conflict|selected-review-comments|review)-(.+)\.(?:md|txt)$/u;
19
+
20
+ export function getAgentInstructionsDir() {
21
+ return path.join(getDataDir(homedir()), 'agent-instructions');
22
+ }
23
+
24
+ export function agentInstructionContentUrl(fileName: string) {
25
+ return `/api/agent-instructions/${encodeURIComponent(fileName)}/content`;
26
+ }
27
+
28
+ export function isWorkspaceInstructionAttachment(fileName: string) {
29
+ return INSTRUCTION_FILE_PATTERN.exec(fileName);
30
+ }
31
+
32
+ export function getAgentInstructionFilePath(fileName: string) {
33
+ if (path.basename(fileName) !== fileName || !isWorkspaceInstructionAttachment(fileName)) {
34
+ throw new Error('Invalid agent instruction attachment path');
35
+ }
36
+ return path.join(getAgentInstructionsDir(), fileName);
37
+ }
38
+
39
+ export function buildCreatePrInstructionsMarkdown(args: {
40
+ workspaceId: string;
41
+ directoryPath: string;
42
+ workspacePath: string;
43
+ branchName: string;
44
+ githubOwner: string;
45
+ githubRepo: string;
46
+ hasUncommittedChanges: boolean;
47
+ hasPushedCommits?: boolean;
48
+ branchPublishState?: string;
49
+ }) {
50
+ const uncommittedLine = args.hasUncommittedChanges
51
+ ? 'There are uncommitted changes in this workspace.'
52
+ : 'There are no uncommitted changes currently detected in this workspace.';
53
+
54
+ const pushedLine = args.hasPushedCommits
55
+ ? 'The current branch appears to have pushed commits on origin.'
56
+ : 'The current branch does not appear to have pushed commits on origin yet.';
57
+
58
+ const upstreamLine =
59
+ args.branchPublishState === 'published'
60
+ ? 'The current branch appears to be published on origin.'
61
+ : 'There is no published remote branch detected yet.';
62
+
63
+ return `The user requested a pull request for this workspace.
64
+
65
+ Workspace ID: ${args.workspaceId}
66
+ Directory: ${args.directoryPath}
67
+ Worktree: ${args.workspacePath}
68
+ Current branch: ${args.branchName}
69
+ Target branch: origin/main
70
+ GitHub repository: ${args.githubOwner}/${args.githubRepo}
71
+
72
+ ${uncommittedLine}
73
+ ${pushedLine}
74
+ ${upstreamLine}
75
+
76
+ Follow these steps to create a PR:
77
+
78
+ - If you have any skills related to creating PRs, invoke them now. Instructions there should take precedence over these instructions.
79
+ - Run \`git status\` and \`git diff\` to review uncommitted changes.
80
+ - If there are uncommitted changes, commit them. Follow any instructions the user gave you about writing commit messages.
81
+ - Push the current branch to origin.
82
+ - Run \`git diff origin/main...HEAD\` to review the full PR diff.
83
+ - If this repository has previous pull requests, inspect recent PR titles/descriptions and follow the team's existing PR conventions.
84
+ - Use \`gh pr create --base main\` to create a PR onto the target branch.
85
+ - Keep the title under 80 characters.
86
+ - Keep the description under five sentences, unless the user instructed otherwise.
87
+ - Describe all meaningful changes in the workspace diff, not only the last message.
88
+ - Do not merge the PR.
89
+ - Do not rename the branch after creating the PR.
90
+
91
+ If any of these steps fail, ask the user for help.
92
+ `;
93
+ }
94
+
95
+ export async function writeCreatePrInstructionsAttachment(args: {
96
+ workspace: WorkspaceRecord;
97
+ directory: DirectoryRecord;
98
+ git: WorkspaceGitSnapshot;
99
+ }): Promise<ChatAttachment> {
100
+ const { workspace, directory, git } = args;
101
+ const instructionsDir = getAgentInstructionsDir();
102
+ await mkdir(instructionsDir, { recursive: true });
103
+
104
+ const absolutePath = path.join(instructionsDir, `create-pr-${workspace.id}.md`);
105
+ const markdown = buildCreatePrInstructionsMarkdown({
106
+ workspaceId: workspace.id,
107
+ directoryPath: directory.localPath,
108
+ workspacePath: workspace.localPath,
109
+ branchName: workspace.branchName,
110
+ githubOwner: directory.githubOwner,
111
+ githubRepo: directory.githubRepo,
112
+ hasUncommittedChanges: git.files.length > 0,
113
+ hasPushedCommits: git.hasPushedCommits,
114
+ branchPublishState: git.branchPublishState,
115
+ });
116
+
117
+ await Bun.write(absolutePath, markdown);
118
+ const info = await stat(absolutePath);
119
+
120
+ return {
121
+ id: `create-pr-${workspace.id}`,
122
+ kind: 'file',
123
+ displayName: CREATE_PR_INSTRUCTIONS_FILE_NAME,
124
+ absolutePath,
125
+ relativePath: CREATE_PR_INSTRUCTIONS_FILE_NAME,
126
+ contentUrl: agentInstructionContentUrl(path.basename(absolutePath)),
127
+ mimeType: 'text/markdown',
128
+ size: info.size,
129
+ };
130
+ }
131
+
132
+ export function buildReviewInstructionsMarkdown(args: {
133
+ workspaceId: string;
134
+ directoryPath: string;
135
+ workspacePath: string;
136
+ branchName: string;
137
+ githubOwner: string;
138
+ githubRepo: string;
139
+ hasUncommittedChanges: boolean;
140
+ }) {
141
+ const dirtyLine = args.hasUncommittedChanges
142
+ ? 'There are uncommitted changes in this workspace; include them in the review.'
143
+ : 'There are no uncommitted changes currently detected; review the committed branch diff.';
144
+
145
+ return `The user requested a thorough code review of the changes on this branch. Produce a single Markdown report. Do not modify any files, commit, push, or open a PR — this is a read-only review.
146
+
147
+ Workspace ID: ${args.workspaceId}
148
+ Directory: ${args.directoryPath}
149
+ Worktree: ${args.workspacePath}
150
+ Current branch: ${args.branchName}
151
+ Target branch: origin/main
152
+ GitHub repository: ${args.githubOwner}/${args.githubRepo}
153
+
154
+ ${dirtyLine}
155
+
156
+ ## How to gather context
157
+
158
+ - If you have any code-review skills or project review conventions, invoke them first; they take precedence over these instructions.
159
+ - Determine the full scope of changes: run \`git status\`, \`git diff origin/main...HEAD\`, and \`git diff\` for any uncommitted work. Review every changed file, not just the most recent edit.
160
+ - Read the surrounding code, not only the diff hunks, so you understand how changed code is actually used.
161
+ - For every public/exported API, function, type, constant, route, event, or config key that the diff adds, changes, renames, or removes, **search the repository for all call sites and usages** (e.g. ripgrep) before judging it. Confirm callers, tests, serialized/persisted shapes, and docs are consistent and that nothing was missed.
162
+ - Prefer evidence from the code over assumptions. Cite concrete \`path:line\` references for each finding.
163
+
164
+ ## What to evaluate
165
+
166
+ Cover each of these explicitly:
167
+
168
+ - **Real bugs & correctness**: logic errors, wrong conditions, off-by-one, null/undefined and error handling, async/await and race conditions, resource leaks, boundary/trust validation, and security issues. Prioritize bugs that will actually trigger in real usage over hypotheticals; state how each is reached.
169
+ - **Architectural constraints**: does the change respect the project's boundaries, layering, ownership rules, and existing patterns (per CLAUDE.md and the .context architecture maps)? Flag violations such as server-only logic leaking into client code, bypassing the typed protocol/event store, or persisting derived state.
170
+ - **Modularity & abstraction**: are responsibilities well separated and placed in the right module? Are abstractions at the right altitude — neither leaky nor over-engineered? Flag premature abstraction and helpers that should be inlined, as well as duplicated logic that should be shared.
171
+ - **Maintainability**: naming, readability, consistency with surrounding style, dead code, comments that explain non-obvious protocol/security/process behavior, and reasonable test coverage for the changed behavior.
172
+ - **API surface & reuse**: are new public APIs necessary, minimal, and consistent with existing ones? Could existing utilities be reused instead? Are breaking changes to existing APIs handled at every call site found in the search above?
173
+
174
+ ## Output format
175
+
176
+ Write the report as Markdown with these sections:
177
+
178
+ 1. **Summary** — 2-4 sentences on what the change does and overall assessment.
179
+ 2. **Blocking issues** — real bugs or constraint violations that must be fixed, each with a \`path:line\` reference, why it matters, and a concrete fix.
180
+ 3. **Improvements** — modularity, abstraction, maintainability, and reuse suggestions, each with references.
181
+ 4. **Nits** — minor/optional polish.
182
+ 5. **Open questions** — anything you could not verify and what you would need.
183
+
184
+ Order findings by severity. If a section has nothing, write "None". Be specific and concise; skip generic praise.
185
+ `;
186
+ }
187
+
188
+ export async function writeReviewInstructionsAttachment(args: {
189
+ workspace: WorkspaceRecord;
190
+ directory: DirectoryRecord;
191
+ git: WorkspaceGitSnapshot;
192
+ }): Promise<ChatAttachment> {
193
+ const { workspace, directory, git } = args;
194
+ const instructionsDir = getAgentInstructionsDir();
195
+ await mkdir(instructionsDir, { recursive: true });
196
+
197
+ const absolutePath = path.join(instructionsDir, `review-${workspace.id}.md`);
198
+ const markdown = buildReviewInstructionsMarkdown({
199
+ workspaceId: workspace.id,
200
+ directoryPath: directory.localPath,
201
+ workspacePath: workspace.localPath,
202
+ branchName: workspace.branchName,
203
+ githubOwner: directory.githubOwner,
204
+ githubRepo: directory.githubRepo,
205
+ hasUncommittedChanges: git.files.length > 0,
206
+ });
207
+
208
+ await Bun.write(absolutePath, markdown);
209
+ const info = await stat(absolutePath);
210
+
211
+ return {
212
+ id: `review-${workspace.id}`,
213
+ kind: 'file',
214
+ displayName: REVIEW_INSTRUCTIONS_FILE_NAME,
215
+ absolutePath,
216
+ relativePath: REVIEW_INSTRUCTIONS_FILE_NAME,
217
+ contentUrl: agentInstructionContentUrl(path.basename(absolutePath)),
218
+ mimeType: 'text/markdown',
219
+ size: info.size,
220
+ };
221
+ }
222
+
223
+ export async function writeFailingCiLogsAttachment(args: {
224
+ workspace: WorkspaceRecord;
225
+ logs: Array<{
226
+ runId: number;
227
+ title?: string;
228
+ workflowName?: string;
229
+ url?: string;
230
+ log: string;
231
+ }>;
232
+ }): Promise<ChatAttachment> {
233
+ const instructionsDir = getAgentInstructionsDir();
234
+ await mkdir(instructionsDir, { recursive: true });
235
+
236
+ const absolutePath = path.join(instructionsDir, `failing-ci-${args.workspace.id}.txt`);
237
+ const body = args.logs
238
+ .map((entry) =>
239
+ [
240
+ `Run ID: ${entry.runId}`,
241
+ entry.workflowName ? `Workflow: ${entry.workflowName}` : null,
242
+ entry.title ? `Title: ${entry.title}` : null,
243
+ entry.url ? `URL: ${entry.url}` : null,
244
+ '',
245
+ entry.log || 'No failing log output was returned.',
246
+ ]
247
+ .filter((line): line is string => line !== null)
248
+ .join('\n'),
249
+ )
250
+ .join('\n\n---\n\n');
251
+
252
+ await Bun.write(absolutePath, body || 'No failing CI logs were found.');
253
+ const info = await stat(absolutePath);
254
+
255
+ return {
256
+ id: `failing-ci-${args.workspace.id}`,
257
+ kind: 'file',
258
+ displayName: FAILING_CI_LOGS_FILE_NAME,
259
+ absolutePath,
260
+ relativePath: FAILING_CI_LOGS_FILE_NAME,
261
+ contentUrl: agentInstructionContentUrl(path.basename(absolutePath)),
262
+ mimeType: 'text/plain',
263
+ size: info.size,
264
+ };
265
+ }
266
+
267
+ export function buildMergeConflictInstructionsMarkdown(args: {
268
+ workspaceId: string;
269
+ directoryPath: string;
270
+ workspacePath: string;
271
+ branchName: string;
272
+ defaultBranchName: string;
273
+ githubOwner: string;
274
+ githubRepo: string;
275
+ prNumber?: number;
276
+ prTitle?: string;
277
+ prUrl?: string;
278
+ mergeStateStatus?: string;
279
+ hasUncommittedChanges: boolean;
280
+ hasUnpushedCommits?: boolean;
281
+ }) {
282
+ const prLine = args.prNumber
283
+ ? `Pull request: #${args.prNumber}${args.prTitle ? ` ${args.prTitle}` : ''}`
284
+ : 'Pull request: unknown';
285
+ const urlLine = args.prUrl ? `Pull request URL: ${args.prUrl}` : null;
286
+ const mergeStatusLine = args.mergeStateStatus
287
+ ? `GitHub merge state: ${args.mergeStateStatus}`
288
+ : null;
289
+ const dirtyLine = args.hasUncommittedChanges
290
+ ? 'There are uncommitted changes in this workspace. Review them before resolving conflicts.'
291
+ : 'There are no uncommitted changes currently detected in this workspace.';
292
+ const aheadLine = args.hasUnpushedCommits
293
+ ? 'The current branch has local commits that are not pushed to its upstream.'
294
+ : 'No unpushed upstream commits are currently detected.';
295
+
296
+ return `The user requested help resolving pull request merge conflicts.
297
+
298
+ Workspace ID: ${args.workspaceId}
299
+ Directory: ${args.directoryPath}
300
+ Worktree: ${args.workspacePath}
301
+ Current branch: ${args.branchName}
302
+ Target branch: origin/${args.defaultBranchName}
303
+ GitHub repository: ${args.githubOwner}/${args.githubRepo}
304
+ ${prLine}
305
+ ${urlLine ? `${urlLine}\n` : ''}${mergeStatusLine ? `${mergeStatusLine}\n` : ''}${dirtyLine}
306
+ ${aheadLine}
307
+
308
+ Follow these steps:
309
+
310
+ - Inspect the current workspace state with \`git status\` and \`git diff\`.
311
+ - Fetch the latest target branch from origin.
312
+ - Merge or rebase \`origin/${args.defaultBranchName}\` into the current branch to reproduce the conflicts locally.
313
+ - Resolve conflicted files carefully and preserve the user's intended changes.
314
+ - Run the relevant tests or checks for the files you changed.
315
+ - Commit the conflict resolution if needed.
316
+ - Push the current branch after the conflict resolution is complete.
317
+ - Do not merge the pull request.
318
+ - Do not rename the branch.
319
+
320
+ If the conflict cannot be reproduced locally or any step fails, stop and explain the blocker.
321
+ `;
322
+ }
323
+
324
+ export async function writeMergeConflictInstructionsAttachment(args: {
325
+ workspace: WorkspaceRecord;
326
+ directory: DirectoryRecord;
327
+ git: WorkspaceGitSnapshot;
328
+ github?: {
329
+ prNumber?: number;
330
+ title?: string;
331
+ url?: string;
332
+ mergeStateStatus?: string;
333
+ } | null;
334
+ }): Promise<ChatAttachment> {
335
+ const { workspace, directory, git, github } = args;
336
+ const instructionsDir = getAgentInstructionsDir();
337
+ await mkdir(instructionsDir, { recursive: true });
338
+
339
+ const absolutePath = path.join(instructionsDir, `merge-conflict-${workspace.id}.md`);
340
+ const markdown = buildMergeConflictInstructionsMarkdown({
341
+ workspaceId: workspace.id,
342
+ directoryPath: directory.localPath,
343
+ workspacePath: workspace.localPath,
344
+ branchName: workspace.branchName,
345
+ defaultBranchName: directory.defaultBranchName,
346
+ githubOwner: directory.githubOwner,
347
+ githubRepo: directory.githubRepo,
348
+ prNumber: github?.prNumber ?? workspace.pullRequest?.number,
349
+ prTitle: github?.title ?? workspace.pullRequest?.title,
350
+ prUrl: github?.url ?? workspace.pullRequest?.url,
351
+ mergeStateStatus: github?.mergeStateStatus ?? workspace.pullRequest?.mergeStateStatus,
352
+ hasUncommittedChanges: git.files.length > 0,
353
+ hasUnpushedCommits: (git.aheadCount ?? 0) > 0,
354
+ });
355
+
356
+ await Bun.write(absolutePath, markdown);
357
+ const info = await stat(absolutePath);
358
+
359
+ return {
360
+ id: `merge-conflict-${workspace.id}`,
361
+ kind: 'file',
362
+ displayName: MERGE_CONFLICT_INSTRUCTIONS_FILE_NAME,
363
+ absolutePath,
364
+ relativePath: MERGE_CONFLICT_INSTRUCTIONS_FILE_NAME,
365
+ contentUrl: `file://${absolutePath}`,
366
+ mimeType: 'text/markdown',
367
+ size: info.size,
368
+ };
369
+ }
370
+
371
+ export async function writeSelectedReviewCommentsAttachment(args: {
372
+ workspace: WorkspaceRecord;
373
+ comments: PullRequestCommentSnapshot[];
374
+ prNumber?: number;
375
+ prTitle?: string;
376
+ }): Promise<ChatAttachment> {
377
+ const instructionsDir = getAgentInstructionsDir();
378
+ await mkdir(instructionsDir, { recursive: true });
379
+
380
+ const absolutePath = path.join(
381
+ instructionsDir,
382
+ `selected-review-comments-${args.workspace.id}.txt`,
383
+ );
384
+ const header = [
385
+ 'The user selected these PR review comments to address.',
386
+ args.prNumber ? `PR: #${args.prNumber}${args.prTitle ? ` ${args.prTitle}` : ''}` : null,
387
+ `Workspace ID: ${args.workspace.id}`,
388
+ `Branch: ${args.workspace.branchName}`,
389
+ ]
390
+ .filter((line): line is string => line !== null)
391
+ .join('\n');
392
+
393
+ const body = args.comments
394
+ .map((comment, index) =>
395
+ [
396
+ `Comment ${index + 1}`,
397
+ `ID: ${comment.id}`,
398
+ comment.author ? `Author: ${comment.author}` : null,
399
+ `Source: ${comment.source}`,
400
+ comment.path ? `File: ${comment.path}${comment.line ? `:${comment.line}` : ''}` : null,
401
+ comment.url ? `URL: ${comment.url}` : null,
402
+ comment.createdAt ? `Created: ${comment.createdAt}` : null,
403
+ comment.updatedAt ? `Updated: ${comment.updatedAt}` : null,
404
+ comment.isBot ? 'Bot: yes' : 'Bot: no',
405
+ '',
406
+ comment.body,
407
+ ]
408
+ .filter((line): line is string => line !== null)
409
+ .join('\n'),
410
+ )
411
+ .join('\n\n---\n\n');
412
+
413
+ await Bun.write(absolutePath, `${header}\n\n${body}`);
414
+ const info = await stat(absolutePath);
415
+
416
+ return {
417
+ id: `selected-review-comments-${args.workspace.id}`,
418
+ kind: 'file',
419
+ displayName: SELECTED_REVIEW_COMMENTS_FILE_NAME,
420
+ absolutePath,
421
+ relativePath: SELECTED_REVIEW_COMMENTS_FILE_NAME,
422
+ contentUrl: agentInstructionContentUrl(path.basename(absolutePath)),
423
+ mimeType: 'text/plain',
424
+ size: info.size,
425
+ };
426
+ }
427
+
428
+ export async function cleanupStaleInstructionAttachments(workspaces: WorkspaceRecord[]) {
429
+ const keepWorkspaceIds = new Set(
430
+ workspaces
431
+ .filter(
432
+ (workspace) =>
433
+ !workspace.removedAt &&
434
+ workspace.visibilityState === 'active' &&
435
+ workspace.reviewState !== 'done' &&
436
+ workspace.reviewState !== 'closed',
437
+ )
438
+ .map((workspace) => workspace.id),
439
+ );
440
+ const instructionsDir = getAgentInstructionsDir();
441
+ const entries = await readdir(instructionsDir, { withFileTypes: true }).catch(() => []);
442
+ let deletedCount = 0;
443
+
444
+ await Promise.all(
445
+ entries.map(async (entry) => {
446
+ if (!entry.isFile()) return;
447
+ const match = isWorkspaceInstructionAttachment(entry.name);
448
+ if (!match) return;
449
+ const workspaceId = match[1];
450
+ if (keepWorkspaceIds.has(workspaceId)) return;
451
+
452
+ await rm(path.join(instructionsDir, entry.name), { force: true });
453
+ deletedCount += 1;
454
+ }),
455
+ );
456
+
457
+ return { deletedCount };
458
+ }