@sanurb/ringi 0.2.1 → 0.3.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 (417) hide show
  1. package/dist/cli.mjs +505 -114
  2. package/dist/cli.mjs.map +1 -1
  3. package/dist/mcp.mjs +35 -39
  4. package/dist/mcp.mjs.map +1 -1
  5. package/dist/runtime.mjs +569 -428
  6. package/dist/runtime.mjs.map +1 -1
  7. package/package.json +9 -8
  8. package/server/nitro.json +17 -0
  9. package/server/public/assets/ClientOnly-QdfAxyFs.js +1 -0
  10. package/server/public/assets/_reviewId-CmXHvWLn.js +1 -0
  11. package/server/public/assets/_reviewId-DdOpDx4U.js +1 -0
  12. package/server/public/assets/abap-B1dkBSPn.js +1 -0
  13. package/server/public/assets/action-bar-DLRNvLjj.js +45 -0
  14. package/server/public/assets/actionscript-3-BT4ibYlP.js +1 -0
  15. package/server/public/assets/ada-CD92zeps.js +1 -0
  16. package/server/public/assets/andromeeda-DqSmgxi0.js +1 -0
  17. package/server/public/assets/angular-html-BDC0PfKr.js +1 -0
  18. package/server/public/assets/angular-ts-B9yoQMtj.js +1 -0
  19. package/server/public/assets/apache-D5suuoa_.js +1 -0
  20. package/server/public/assets/apex-BL-m4VHy.js +1 -0
  21. package/server/public/assets/apl-CldhY0Pn.js +1 -0
  22. package/server/public/assets/applescript-CLiBqvKT.js +1 -0
  23. package/server/public/assets/ara-LdDF8cmv.js +1 -0
  24. package/server/public/assets/asciidoc-2DZ9hC2N.js +1 -0
  25. package/server/public/assets/asm-0ZPGRSUy.js +1 -0
  26. package/server/public/assets/astro-DR6labZJ.js +1 -0
  27. package/server/public/assets/aurora-x-Da7Zfvbg.js +1 -0
  28. package/server/public/assets/awk-Bn0gn_B_.js +1 -0
  29. package/server/public/assets/ayu-dark-bqYKoqpM.js +1 -0
  30. package/server/public/assets/ayu-light-C45jTIzZ.js +1 -0
  31. package/server/public/assets/ayu-mirage-BV_FCTQi.js +1 -0
  32. package/server/public/assets/ballerina-D2nw_w8Q.js +1 -0
  33. package/server/public/assets/bat-ByUBN5gS.js +1 -0
  34. package/server/public/assets/beancount-BTb2W6Mp.js +1 -0
  35. package/server/public/assets/berry-5SO2uITG.js +1 -0
  36. package/server/public/assets/bibtex-CDBTNfUI.js +1 -0
  37. package/server/public/assets/bicep-fgxG_4rP.js +1 -0
  38. package/server/public/assets/bird2-BCwzDhwX.js +1 -0
  39. package/server/public/assets/blade-BBTRu2-g.js +1 -0
  40. package/server/public/assets/bsl-CG-fq4sc.js +1 -0
  41. package/server/public/assets/c-CEvNj7xl.js +1 -0
  42. package/server/public/assets/c3-Dlaci63_.js +1 -0
  43. package/server/public/assets/cadence-DHbRuEmm.js +1 -0
  44. package/server/public/assets/cairo-Ds0kTeYT.js +1 -0
  45. package/server/public/assets/catppuccin-frappe-DrL1fUuH.js +1 -0
  46. package/server/public/assets/catppuccin-latte-C0REgVjl.js +1 -0
  47. package/server/public/assets/catppuccin-macchiato-ChQpylWO.js +1 -0
  48. package/server/public/assets/catppuccin-mocha-Dd0JU1T0.js +1 -0
  49. package/server/public/assets/clarity-DMoTOm4G.js +1 -0
  50. package/server/public/assets/clojure-DBhE3PpS.js +1 -0
  51. package/server/public/assets/cmake-DwMc40Or.js +1 -0
  52. package/server/public/assets/cobol-BdNJSMRt.js +1 -0
  53. package/server/public/assets/codeowners-1lVr8wqV.js +1 -0
  54. package/server/public/assets/codeql-DWflolvo.js +1 -0
  55. package/server/public/assets/coffee-RA4xA24H.js +1 -0
  56. package/server/public/assets/common-lisp-CrVQ5xT-.js +1 -0
  57. package/server/public/assets/compiler-runtime-DZXZ41-q.js +1 -0
  58. package/server/public/assets/coq-CjfoyYSh.js +1 -0
  59. package/server/public/assets/cpp-BoW7e2Ow.js +1 -0
  60. package/server/public/assets/createServerFn-DTk395iP.js +9 -0
  61. package/server/public/assets/crystal-CYKRo3F9.js +1 -0
  62. package/server/public/assets/csharp-C7bIWP5y.js +1 -0
  63. package/server/public/assets/css-Ck2tii2d.js +1 -0
  64. package/server/public/assets/csv-DsAkDVtA.js +1 -0
  65. package/server/public/assets/cue-BWmQgbOB.js +1 -0
  66. package/server/public/assets/cypher-D-jVC50Q.js +1 -0
  67. package/server/public/assets/d-CaviyOrm.js +1 -0
  68. package/server/public/assets/dark-plus-DIrnwZt9.js +1 -0
  69. package/server/public/assets/dart-CZEi7JgC.js +1 -0
  70. package/server/public/assets/dax-BK-8zffy.js +1 -0
  71. package/server/public/assets/desktop-D3cjbL4D.js +1 -0
  72. package/server/public/assets/diff-sHAzLvlp.js +1 -0
  73. package/server/public/assets/docker--xs2Ng3w.js +1 -0
  74. package/server/public/assets/dotenv-Cm4nwcJ7.js +1 -0
  75. package/server/public/assets/dracula-CAUSusef.js +1 -0
  76. package/server/public/assets/dracula-soft-cjNkMFza.js +1 -0
  77. package/server/public/assets/dream-maker-fjmWTFCO.js +1 -0
  78. package/server/public/assets/edge-DxycC9wl.js +1 -0
  79. package/server/public/assets/elixir-B-50Er3p.js +1 -0
  80. package/server/public/assets/elm-B4-ygIVo.js +1 -0
  81. package/server/public/assets/emacs-lisp-CJzqStIa.js +1 -0
  82. package/server/public/assets/erb-DJvYE1L1.js +1 -0
  83. package/server/public/assets/erlang-C-m_88FN.js +1 -0
  84. package/server/public/assets/everforest-dark-DBpaSMx1.js +1 -0
  85. package/server/public/assets/everforest-light-CiGrXwia.js +1 -0
  86. package/server/public/assets/fennel-DRaXF7k8.js +1 -0
  87. package/server/public/assets/file-tree-CI3Xwwid.js +1907 -0
  88. package/server/public/assets/fish-Bn-Yh3Jj.js +1 -0
  89. package/server/public/assets/fluent-DF5F8Ks_.js +1 -0
  90. package/server/public/assets/fortran-fixed-form-Cx1lv7HN.js +1 -0
  91. package/server/public/assets/fortran-free-form-hCQHRqew.js +1 -0
  92. package/server/public/assets/fsharp-DC5k9sy2.js +1 -0
  93. package/server/public/assets/gdresource-D0EsKdgH.js +1 -0
  94. package/server/public/assets/gdscript-_C9_Hi_w.js +1 -0
  95. package/server/public/assets/gdshader-BW7b1X1Y.js +1 -0
  96. package/server/public/assets/geist-cyrillic-wght-normal-CHSlOQsW.woff2 +0 -0
  97. package/server/public/assets/geist-latin-ext-wght-normal-DMtmJ5ZE.woff2 +0 -0
  98. package/server/public/assets/geist-latin-wght-normal-Dm3htQBi.woff2 +0 -0
  99. package/server/public/assets/genie-Ch_6TCHd.js +1 -0
  100. package/server/public/assets/gherkin-CaNUsmTq.js +1 -0
  101. package/server/public/assets/git-commit-BcFsuO5E.js +1 -0
  102. package/server/public/assets/git-rebase-ChGA-z50.js +1 -0
  103. package/server/public/assets/github-dark-B9ygjgg6.js +1 -0
  104. package/server/public/assets/github-dark-default-Br2bgYSx.js +1 -0
  105. package/server/public/assets/github-dark-dimmed-CmtqpPJ-.js +1 -0
  106. package/server/public/assets/github-dark-high-contrast-fSfmrZcC.js +1 -0
  107. package/server/public/assets/github-light-BZjUqfZl.js +1 -0
  108. package/server/public/assets/github-light-default-lIytXXhR.js +1 -0
  109. package/server/public/assets/github-light-high-contrast-BRrjFb7n.js +1 -0
  110. package/server/public/assets/gleam-DALMDpNs.js +1 -0
  111. package/server/public/assets/glimmer-js-maLb6ysA.js +1 -0
  112. package/server/public/assets/glimmer-ts-DGNr-OBA.js +1 -0
  113. package/server/public/assets/glsl-CmplqyQ1.js +1 -0
  114. package/server/public/assets/gn-DGjqrYN9.js +1 -0
  115. package/server/public/assets/gnuplot-BYckvgQI.js +1 -0
  116. package/server/public/assets/go-JycvP538.js +1 -0
  117. package/server/public/assets/graphql-VhP7n4--.js +1 -0
  118. package/server/public/assets/groovy-D5qMRONT.js +1 -0
  119. package/server/public/assets/gruvbox-dark-hard-M1dj1e6V.js +1 -0
  120. package/server/public/assets/gruvbox-dark-medium-cqq_ncQu.js +1 -0
  121. package/server/public/assets/gruvbox-dark-soft-B4QwL2a9.js +1 -0
  122. package/server/public/assets/gruvbox-light-hard-DLayMKOQ.js +1 -0
  123. package/server/public/assets/gruvbox-light-medium-D52XgPKf.js +1 -0
  124. package/server/public/assets/gruvbox-light-soft-Dola3KdD.js +1 -0
  125. package/server/public/assets/hack-BVSQ2bxM.js +1 -0
  126. package/server/public/assets/haml-CwTtRHoj.js +1 -0
  127. package/server/public/assets/handlebars-CcO01SVo.js +1 -0
  128. package/server/public/assets/haskell-ys7wPPEd.js +1 -0
  129. package/server/public/assets/haxe-94kiChn7.js +1 -0
  130. package/server/public/assets/hcl-DmHt_-wq.js +1 -0
  131. package/server/public/assets/hjson-xMmoJ0Gx.js +1 -0
  132. package/server/public/assets/hlsl-b-Pskdze.js +1 -0
  133. package/server/public/assets/horizon-BKMqttiR.js +1 -0
  134. package/server/public/assets/horizon-bright-HNkBlnm5.js +1 -0
  135. package/server/public/assets/houston-BkBSBSOQ.js +1 -0
  136. package/server/public/assets/html-derivative-Cz-cKMi2.js +1 -0
  137. package/server/public/assets/html-zQbUS8Is.js +1 -0
  138. package/server/public/assets/http-CaGQ9BgA.js +1 -0
  139. package/server/public/assets/hurl-BBoki9bg.js +1 -0
  140. package/server/public/assets/hxml-iQTOTWpM.js +1 -0
  141. package/server/public/assets/hy-DKl1XhBq.js +1 -0
  142. package/server/public/assets/imba-DPxkOTAg.js +1 -0
  143. package/server/public/assets/ini-lkLGq_1x.js +1 -0
  144. package/server/public/assets/java-LAx6oszV.js +1 -0
  145. package/server/public/assets/javascript-COqx-gKX.js +1 -0
  146. package/server/public/assets/jinja-x-G_qSCP.js +1 -0
  147. package/server/public/assets/jison-7oSeVkKJ.js +1 -0
  148. package/server/public/assets/json-sTLOVXhc.js +1 -0
  149. package/server/public/assets/json5-Cy6ypJuJ.js +1 -0
  150. package/server/public/assets/jsonc-Cw2ugYAK.js +1 -0
  151. package/server/public/assets/jsonl-Dp5_qBVH.js +1 -0
  152. package/server/public/assets/jsonnet-BTbmg_-u.js +1 -0
  153. package/server/public/assets/jssm-CnT7nPea.js +1 -0
  154. package/server/public/assets/jsx-zXeIBQLI.js +1 -0
  155. package/server/public/assets/julia-E-6Xm9nd.js +1 -0
  156. package/server/public/assets/just-D9n74gZy.js +1 -0
  157. package/server/public/assets/kanagawa-dragon-CxsBnuhV.js +1 -0
  158. package/server/public/assets/kanagawa-lotus-vHdxDDOS.js +1 -0
  159. package/server/public/assets/kanagawa-wave-CIkfTKWk.js +1 -0
  160. package/server/public/assets/kdl-BwK60g80.js +1 -0
  161. package/server/public/assets/kotlin-Dbd9Vi-v.js +1 -0
  162. package/server/public/assets/kusto-BuTk9usc.js +1 -0
  163. package/server/public/assets/laserwave-C0wf_d3o.js +1 -0
  164. package/server/public/assets/latex-D0t4RtEU.js +1 -0
  165. package/server/public/assets/lean-CYAW8bRN.js +1 -0
  166. package/server/public/assets/less-D4uen21c.js +1 -0
  167. package/server/public/assets/light-plus-oqYyWKEE.js +1 -0
  168. package/server/public/assets/liquid-BzXN12F6.js +1 -0
  169. package/server/public/assets/llvm-Z1xJzteV.js +1 -0
  170. package/server/public/assets/log-BGUxlsk3.js +1 -0
  171. package/server/public/assets/logo-wVUhvQ1b.js +1 -0
  172. package/server/public/assets/lua-B0Cg8RP4.js +1 -0
  173. package/server/public/assets/luau-rPFZzCmq.js +1 -0
  174. package/server/public/assets/main-FvxVz-kD.js +15 -0
  175. package/server/public/assets/make-BmPf6m0P.js +1 -0
  176. package/server/public/assets/markdown-AseU6zcW.js +1 -0
  177. package/server/public/assets/marko-BlRPXWOe.js +1 -0
  178. package/server/public/assets/material-theme-6_W6rQhR.js +1 -0
  179. package/server/public/assets/material-theme-darker-VPEo3Sem.js +1 -0
  180. package/server/public/assets/material-theme-lighter-CUhzCcZ9.js +1 -0
  181. package/server/public/assets/material-theme-ocean-B2JdsaGb.js +1 -0
  182. package/server/public/assets/material-theme-palenight-DhY-sklA.js +1 -0
  183. package/server/public/assets/matlab-BOj_BDQv.js +1 -0
  184. package/server/public/assets/mdc-FiVDZSZ4.js +1 -0
  185. package/server/public/assets/mdx-Cm6cDkDI.js +1 -0
  186. package/server/public/assets/mermaid-DLO-R4hv.js +1 -0
  187. package/server/public/assets/min-dark-D34a_pX7.js +1 -0
  188. package/server/public/assets/min-light-Cdd4KORE.js +1 -0
  189. package/server/public/assets/mipsasm-DYpHF-GA.js +1 -0
  190. package/server/public/assets/mojo-DqYVFv_G.js +1 -0
  191. package/server/public/assets/monokai-CDR4sQ2n.js +1 -0
  192. package/server/public/assets/moonbit-DRKee9wk.js +1 -0
  193. package/server/public/assets/move-DbRk6Vn9.js +1 -0
  194. package/server/public/assets/narrat-IOfmaXfb.js +1 -0
  195. package/server/public/assets/new-DOyplRwM.js +1 -0
  196. package/server/public/assets/nextflow-D-Ec_bsY.js +1 -0
  197. package/server/public/assets/nextflow-groovy-EYl0c2BQ.js +1 -0
  198. package/server/public/assets/nginx-3JLAqmJa.js +1 -0
  199. package/server/public/assets/night-owl-light-Bedht9b4.js +1 -0
  200. package/server/public/assets/night-owl-yQJ3-I0I.js +1 -0
  201. package/server/public/assets/nim-DyjFVMzT.js +1 -0
  202. package/server/public/assets/nix-C2IovEl2.js +1 -0
  203. package/server/public/assets/nord-BjZ63GNL.js +1 -0
  204. package/server/public/assets/nushell-BflTrRB5.js +1 -0
  205. package/server/public/assets/objective-c-GRClK1S7.js +1 -0
  206. package/server/public/assets/objective-cpp-l3qYw-v5.js +1 -0
  207. package/server/public/assets/ocaml-BBDyhyMH.js +1 -0
  208. package/server/public/assets/odin-jCJ7Js99.js +1 -0
  209. package/server/public/assets/one-dark-pro-PIx2Diul.js +1 -0
  210. package/server/public/assets/one-light-BFMEz49S.js +1 -0
  211. package/server/public/assets/openscad-Drf0LgCX.js +1 -0
  212. package/server/public/assets/pascal-BT2XAUTl.js +1 -0
  213. package/server/public/assets/perl-Dr47G_2Q.js +1 -0
  214. package/server/public/assets/php-BhBDWTJe.js +1 -0
  215. package/server/public/assets/pierre-dark-CTXzTLfO.js +1 -0
  216. package/server/public/assets/pierre-light-C_5rlJRo.js +1 -0
  217. package/server/public/assets/pkl-ML-dWShO.js +1 -0
  218. package/server/public/assets/plastic-BFI-Z5Z2.js +1 -0
  219. package/server/public/assets/plsql-0vd5cLro.js +1 -0
  220. package/server/public/assets/po-CbZ_uqQA.js +1 -0
  221. package/server/public/assets/poimandres-Cayhd01L.js +1 -0
  222. package/server/public/assets/polar-C4hfV8Nc.js +1 -0
  223. package/server/public/assets/postcss-osFUbTLw.js +1 -0
  224. package/server/public/assets/powerquery-CTlGUQPj.js +1 -0
  225. package/server/public/assets/powershell-DyZsOmuq.js +1 -0
  226. package/server/public/assets/preload-helper-D7oT-Xwl.js +20 -0
  227. package/server/public/assets/prisma-SS92PO_I.js +1 -0
  228. package/server/public/assets/prolog-B1O1NNVC.js +1 -0
  229. package/server/public/assets/proto-BWu3eZTs.js +1 -0
  230. package/server/public/assets/pug-Dij_IK5w.js +1 -0
  231. package/server/public/assets/puppet-tvtRVdr6.js +1 -0
  232. package/server/public/assets/purescript-Dtbpb7D-.js +1 -0
  233. package/server/public/assets/python-Dlk0Acio.js +1 -0
  234. package/server/public/assets/qml-qUwk3nhh.js +1 -0
  235. package/server/public/assets/qmldir-B-iEOngH.js +1 -0
  236. package/server/public/assets/qss-Ba0p-aHw.js +1 -0
  237. package/server/public/assets/r-WmtNicKM.js +1 -0
  238. package/server/public/assets/racket-BXDsxf2U.js +1 -0
  239. package/server/public/assets/raku-Dw1WWFXK.js +1 -0
  240. package/server/public/assets/razor-DaqiVx3Q.js +1 -0
  241. package/server/public/assets/red-BC3Ds49b.js +1 -0
  242. package/server/public/assets/reg-DXFHGaM4.js +1 -0
  243. package/server/public/assets/regexp-CiSWN5Ne.js +1 -0
  244. package/server/public/assets/rel-Dc5_Ytx2.js +1 -0
  245. package/server/public/assets/reviews-CJvVXRLH.js +1 -0
  246. package/server/public/assets/reviews-CfbuF6ib.js +1 -0
  247. package/server/public/assets/riscv-ZgswiWij.js +1 -0
  248. package/server/public/assets/ron-YghabWAH.js +1 -0
  249. package/server/public/assets/rose-pine-ByWLnVr3.js +1 -0
  250. package/server/public/assets/rose-pine-dawn-DBmeySrz.js +1 -0
  251. package/server/public/assets/rose-pine-moon-B9J-N3nK.js +1 -0
  252. package/server/public/assets/rosmsg-DTKmAsVH.js +1 -0
  253. package/server/public/assets/routes-DNxq1Fba.js +1 -0
  254. package/server/public/assets/routes-Dp0ODZ55.js +2 -0
  255. package/server/public/assets/rst-CP6xOYlY.js +1 -0
  256. package/server/public/assets/ruby-BXYLc1CM.js +1 -0
  257. package/server/public/assets/rust-nfXwuE6F.js +1 -0
  258. package/server/public/assets/sas-CFdtZutF.js +1 -0
  259. package/server/public/assets/sass-CbRjkld3.js +1 -0
  260. package/server/public/assets/scala-BzD3eypx.js +1 -0
  261. package/server/public/assets/scheme-D4d1PV1y.js +1 -0
  262. package/server/public/assets/scss-D8KhdObH.js +1 -0
  263. package/server/public/assets/sdbl-Cf-Ydnvx.js +1 -0
  264. package/server/public/assets/shaderlab-DGohHMiF.js +1 -0
  265. package/server/public/assets/shellscript-BHdEbumI.js +1 -0
  266. package/server/public/assets/shellsession-Dh-bxrap.js +1 -0
  267. package/server/public/assets/slack-dark-MszIyPZ2.js +1 -0
  268. package/server/public/assets/slack-ochin-tQ3Q0gE9.js +1 -0
  269. package/server/public/assets/smalltalk-_uWoArwn.js +1 -0
  270. package/server/public/assets/snazzy-light-9sniMEk5.js +1 -0
  271. package/server/public/assets/solarized-dark-CdD0Hxzv.js +1 -0
  272. package/server/public/assets/solarized-light-C-nsEdqF.js +1 -0
  273. package/server/public/assets/solidity-D6uC-xwP.js +1 -0
  274. package/server/public/assets/soy-cDuODfbT.js +1 -0
  275. package/server/public/assets/sparql-BgU2QITA.js +1 -0
  276. package/server/public/assets/splunk-LQYHRu14.js +1 -0
  277. package/server/public/assets/sql-CKZpK620.js +1 -0
  278. package/server/public/assets/ssh-config-B7BUl8Rd.js +1 -0
  279. package/server/public/assets/stata-BLJTbKOO.js +1 -0
  280. package/server/public/assets/styles-UDowwF7S.css +2 -0
  281. package/server/public/assets/stylus-Byjxdx_q.js +1 -0
  282. package/server/public/assets/surrealql-C96KvYaj.js +1 -0
  283. package/server/public/assets/svelte-Qnbj2GWx.js +1 -0
  284. package/server/public/assets/swift-BexLlMrU.js +1 -0
  285. package/server/public/assets/synthwave-84-BxMBwQMS.js +1 -0
  286. package/server/public/assets/system-verilog-DVGwm0mw.js +1 -0
  287. package/server/public/assets/systemd-H2IT3-p5.js +1 -0
  288. package/server/public/assets/talonscript-mKZIGM8n.js +1 -0
  289. package/server/public/assets/tasl-B7he_Ugr.js +1 -0
  290. package/server/public/assets/tcl-5mT3RxHH.js +1 -0
  291. package/server/public/assets/templ-CQPDll3D.js +1 -0
  292. package/server/public/assets/terraform-BZP0GLsT.js +1 -0
  293. package/server/public/assets/test-D7JRfog1.js +1 -0
  294. package/server/public/assets/tex-97QNLoBJ.js +1 -0
  295. package/server/public/assets/tokyo-night-CTPVdZt9.js +1 -0
  296. package/server/public/assets/toml-CTFA98he.js +1 -0
  297. package/server/public/assets/ts-tags-B8zlXe2n.js +1 -0
  298. package/server/public/assets/tsv-BayJtYdY.js +1 -0
  299. package/server/public/assets/tsx-VqRU8NCz.js +1 -0
  300. package/server/public/assets/turtle-TVCBh_kY.js +1 -0
  301. package/server/public/assets/twig-FTTF8rVk.js +1 -0
  302. package/server/public/assets/typescript-CuX0hIVY.js +1 -0
  303. package/server/public/assets/typespec-BUvaJDLF.js +1 -0
  304. package/server/public/assets/typst-8NBaY7Ec.js +1 -0
  305. package/server/public/assets/useStore-M3H8PB1v.js +1 -0
  306. package/server/public/assets/utils-DElCu2hq.js +1 -0
  307. package/server/public/assets/v-VihyTigi.js +1 -0
  308. package/server/public/assets/vala-DyFAPyX6.js +1 -0
  309. package/server/public/assets/vb-Dg1Iqi4J.js +1 -0
  310. package/server/public/assets/verilog-D2Xc-vhD.js +1 -0
  311. package/server/public/assets/vesper-DJbtqYNr.js +1 -0
  312. package/server/public/assets/vhdl-CU3BVeE7.js +1 -0
  313. package/server/public/assets/viml-hG2shuOW.js +1 -0
  314. package/server/public/assets/vitesse-black-DbG2gsc0.js +1 -0
  315. package/server/public/assets/vitesse-dark-B6WV4xXH.js +1 -0
  316. package/server/public/assets/vitesse-light-DC1pdD02.js +1 -0
  317. package/server/public/assets/vue-DXwaEU0U.js +1 -0
  318. package/server/public/assets/vue-html-QD7AJ6JJ.js +1 -0
  319. package/server/public/assets/vue-vine-Bh2m1D2Z.js +1 -0
  320. package/server/public/assets/vyper-C1wojIuk.js +1 -0
  321. package/server/public/assets/wasm-C6Y0s02M.js +1 -0
  322. package/server/public/assets/wasm-qTvCOSHz.js +1 -0
  323. package/server/public/assets/wenyan-BG5vPQF0.js +1 -0
  324. package/server/public/assets/wgsl-DrVb-Cub.js +1 -0
  325. package/server/public/assets/wikitext-PRC4s8sH.js +1 -0
  326. package/server/public/assets/wit-ChW5qvg_.js +1 -0
  327. package/server/public/assets/wolfram-B8mKuZSQ.js +1 -0
  328. package/server/public/assets/xml-BK-rcb5a.js +1 -0
  329. package/server/public/assets/xsl-dt-d2R7p.js +1 -0
  330. package/server/public/assets/yaml-UiXU3hGj.js +1 -0
  331. package/server/public/assets/zenscript-C-jEPC9j.js +1 -0
  332. package/server/public/assets/zig-EbnRGjcz.js +1 -0
  333. package/server/public/favicon.ico +0 -0
  334. package/server/public/logo192.png +0 -0
  335. package/server/public/logo512.png +0 -0
  336. package/server/public/manifest.json +25 -0
  337. package/server/public/robots.txt +3 -0
  338. package/server/public/tanstack-circle-logo.png +0 -0
  339. package/server/public/tanstack-word-logo-white.svg +1 -0
  340. package/server/server/_chunks/ssr-renderer.mjs +15 -0
  341. package/server/server/_libs/@floating-ui/core+[...].mjs +698 -0
  342. package/server/server/_libs/@floating-ui/dom+[...].mjs +644 -0
  343. package/server/server/_libs/@floating-ui/react-dom+[...].mjs +839 -0
  344. package/server/server/_libs/@pierre/diffs+[...].mjs +18578 -0
  345. package/server/server/_libs/@radix-ui/react-arrow+[...].mjs +174 -0
  346. package/server/server/_libs/@radix-ui/react-collection+[...].mjs +162 -0
  347. package/server/server/_libs/@radix-ui/react-dialog+[...].mjs +1666 -0
  348. package/server/server/_libs/@radix-ui/react-popper+[...].mjs +289 -0
  349. package/server/server/_libs/@radix-ui/react-radio-group+[...].mjs +420 -0
  350. package/server/server/_libs/@radix-ui/react-select+[...].mjs +990 -0
  351. package/server/server/_libs/@tanstack/react-router+[...].mjs +14113 -0
  352. package/server/server/_libs/_.mjs +2 -0
  353. package/server/server/_libs/chokidar+readdirp.mjs +1599 -0
  354. package/server/server/_libs/class-variance-authority+clsx.mjs +69 -0
  355. package/server/server/_libs/effect+[...].mjs +34047 -0
  356. package/server/server/_libs/h3+rou3+srvx.mjs +1195 -0
  357. package/server/server/_libs/hookable.mjs +41 -0
  358. package/server/server/_libs/lucide-react.mjs +298 -0
  359. package/server/server/_libs/pierre__theme.mjs +2668 -0
  360. package/server/server/_libs/radix-ui__number.mjs +6 -0
  361. package/server/server/_libs/radix-ui__primitive.mjs +9 -0
  362. package/server/server/_libs/radix-ui__react-direction.mjs +11 -0
  363. package/server/server/_libs/shiki.mjs +16 -0
  364. package/server/server/_libs/shikijs__langs.mjs +1355 -0
  365. package/server/server/_libs/shikijs__themes.mjs +262 -0
  366. package/server/server/_libs/tailwind-merge.mjs +1962 -0
  367. package/server/server/_libs/tanstack__history.mjs +342 -0
  368. package/server/server/_libs/tanstack__router-core.mjs +6 -0
  369. package/server/server/_libs/ufo.mjs +64 -0
  370. package/server/server/_reviewId-AWnOGz5k.mjs +33 -0
  371. package/server/server/_reviewId-Com4yOlc.mjs +29 -0
  372. package/server/server/_reviewId-DAhmekJ2.mjs +277 -0
  373. package/server/server/_reviewId-p9mhYVwa.mjs +18 -0
  374. package/server/server/_runtime.mjs +35 -0
  375. package/server/server/_ssr/action-bar-C68xGnWW.mjs +592 -0
  376. package/server/server/_ssr/api-handler-CstW2n82.mjs +189 -0
  377. package/server/server/_ssr/client-runtime-BoPuAEoA.mjs +245 -0
  378. package/server/server/_ssr/createServerRpc--0mcGlWK.mjs +12 -0
  379. package/server/server/_ssr/createSsrRpc-AwdiLXmF.mjs +16 -0
  380. package/server/server/_ssr/domain-rpc-3Ds9DPr0.mjs +287 -0
  381. package/server/server/_ssr/file-tree-CQ5w2GHh.mjs +1951 -0
  382. package/server/server/_ssr/load-scoped-diff-NL2XAcdz.mjs +45 -0
  383. package/server/server/_ssr/new-BKl_G2Ks.mjs +37 -0
  384. package/server/server/_ssr/new-BREdMFAM.mjs +12 -0
  385. package/server/server/_ssr/new-DCz5eHkb.mjs +137 -0
  386. package/server/server/_ssr/reviews-BL5Nsgst.mjs +7 -0
  387. package/server/server/_ssr/reviews-BoaEgGKs.mjs +100 -0
  388. package/server/server/_ssr/reviews-C7_NIhY8.mjs +19 -0
  389. package/server/server/_ssr/reviews-Dd69YBDa.mjs +12 -0
  390. package/server/server/_ssr/router-DLxN8FOm.mjs +415 -0
  391. package/server/server/_ssr/routes-D25G8OuS.mjs +80 -0
  392. package/server/server/_ssr/routes-lz0AN75A.mjs +929 -0
  393. package/server/server/_ssr/runtime-D9IbnMlF.mjs +1401 -0
  394. package/server/server/_ssr/server-runtime-D99qpmma.mjs +12 -0
  395. package/server/server/_ssr/ssr.mjs +5318 -0
  396. package/server/server/_ssr/start-BIQfOZtj.mjs +4 -0
  397. package/server/server/_ssr/test-CQdMYlqa.mjs +6 -0
  398. package/server/server/_ssr/todo-m_uUvxca.mjs +88 -0
  399. package/server/server/_ssr/use-keyboard-shortcuts-D5b1Mxpq.mjs +25 -0
  400. package/server/server/_ssr/utils-BuOt9_LA.mjs +8 -0
  401. package/server/server/_tanstack-start-manifest_v-CnL10NRH.mjs +71 -0
  402. package/server/server/index.mjs +2615 -0
  403. package/server/server/node_modules/detect-libc/lib/detect-libc.js +313 -0
  404. package/server/server/node_modules/detect-libc/lib/elf.js +39 -0
  405. package/server/server/node_modules/detect-libc/lib/filesystem.js +51 -0
  406. package/server/server/node_modules/detect-libc/lib/process.js +24 -0
  407. package/server/server/node_modules/detect-libc/package.json +44 -0
  408. package/server/server/node_modules/msgpackr-extract/index.js +1 -0
  409. package/server/server/node_modules/msgpackr-extract/package.json +50 -0
  410. package/server/server/node_modules/node-gyp-build-optional-packages/index.js +6 -0
  411. package/server/server/node_modules/node-gyp-build-optional-packages/node-gyp-build.js +236 -0
  412. package/server/server/node_modules/node-gyp-build-optional-packages/package.json +32 -0
  413. package/server/server/node_modules/tslib/modules/index.js +70 -0
  414. package/server/server/node_modules/tslib/modules/package.json +3 -0
  415. package/server/server/node_modules/tslib/package.json +47 -0
  416. package/server/server/node_modules/tslib/tslib.js +484 -0
  417. package/server/server/package.json +12 -0
package/dist/runtime.mjs CHANGED
@@ -2,27 +2,35 @@ import { execFile, spawn } from "node:child_process";
2
2
  import { mkdirSync, stat, unwatchFile, watch, watchFile } from "node:fs";
3
3
  import * as sp from "node:path";
4
4
  import { dirname, join, relative, resolve, sep } from "node:path";
5
- import * as HttpApiSchema from "@effect/platform/HttpApiSchema";
6
5
  import * as Schema from "effect/Schema";
7
6
  import { lstat, open, readFile, readdir, realpath, stat as stat$1 } from "node:fs/promises";
8
7
  import { randomUUID } from "node:crypto";
8
+ import { ServiceMap } from "effect";
9
9
  import * as Effect from "effect/Effect";
10
+ import * as Layer from "effect/Layer";
10
11
  import * as Option from "effect/Option";
11
12
  import { DatabaseSync } from "node:sqlite";
12
13
  import * as Config from "effect/Config";
13
14
  import * as Exit from "effect/Exit";
14
- import * as Layer from "effect/Layer";
15
15
  import "effect/ManagedRuntime";
16
16
  import { platform, type } from "node:os";
17
17
  import { EventEmitter } from "node:events";
18
18
  import { Readable } from "node:stream";
19
19
  import * as Queue from "effect/Queue";
20
- import * as Runtime from "effect/Runtime";
21
20
  import * as Stream from "effect/Stream";
22
21
  //#region ../../packages/core/src/schemas/review.ts
23
22
  const ReviewId = Schema.String.pipe(Schema.brand("ReviewId"));
24
- const ReviewStatus = Schema.Literal("in_progress", "approved", "changes_requested");
25
- const ReviewSourceType = Schema.Literal("staged", "branch", "commits");
23
+ const ReviewStatus = Schema.Literals([
24
+ "in_progress",
25
+ "approved",
26
+ "changes_requested"
27
+ ]);
28
+ const ReviewSourceType = Schema.Literals([
29
+ "staged",
30
+ "branch",
31
+ "commits",
32
+ "pull_request"
33
+ ]);
26
34
  Schema.Struct({
27
35
  baseRef: Schema.NullOr(Schema.String),
28
36
  createdAt: Schema.String,
@@ -35,11 +43,11 @@ Schema.Struct({
35
43
  updatedAt: Schema.String
36
44
  });
37
45
  Schema.Struct({
38
- sourceRef: Schema.optionalWith(Schema.NullOr(Schema.String), { default: () => null }),
39
- sourceType: Schema.optionalWith(ReviewSourceType, { default: () => "staged" })
46
+ sourceRef: Schema.NullOr(Schema.String).pipe(Schema.optionalKey, Schema.withDecodingDefaultKey(() => null)),
47
+ sourceType: ReviewSourceType.pipe(Schema.optionalKey, Schema.withDecodingDefaultKey(() => "staged"))
40
48
  });
41
- Schema.Struct({ status: Schema.optionalWith(ReviewStatus, { as: "Option" }) });
42
- var ReviewNotFound = class extends Schema.TaggedError()("ReviewNotFound", { id: ReviewId }, HttpApiSchema.annotations({ status: 404 })) {};
49
+ Schema.Struct({ status: Schema.OptionFromNullOr(ReviewStatus).pipe(Schema.optionalKey) });
50
+ var ReviewNotFound = class extends Schema.TaggedErrorClass()("ReviewNotFound", { id: ReviewId }) {};
43
51
  //#endregion
44
52
  //#region ../../packages/core/src/schemas/todo.ts
45
53
  const TodoId = Schema.String.pipe(Schema.brand("TodoId"));
@@ -53,14 +61,14 @@ Schema.Struct({
53
61
  updatedAt: Schema.String
54
62
  });
55
63
  Schema.Struct({
56
- content: Schema.String.pipe(Schema.minLength(1)),
57
- reviewId: Schema.optionalWith(Schema.NullOr(ReviewId), { default: () => null })
64
+ content: Schema.String.pipe(Schema.check(Schema.isMinLength(1))),
65
+ reviewId: Schema.NullOr(ReviewId).pipe(Schema.optionalKey, Schema.withDecodingDefaultKey(() => null))
58
66
  });
59
67
  Schema.Struct({
60
- completed: Schema.optionalWith(Schema.Boolean, { as: "Option" }),
61
- content: Schema.optionalWith(Schema.String.pipe(Schema.minLength(1)), { as: "Option" })
68
+ completed: Schema.OptionFromNullOr(Schema.Boolean).pipe(Schema.optionalKey),
69
+ content: Schema.OptionFromNullOr(Schema.String.pipe(Schema.check(Schema.isMinLength(1)))).pipe(Schema.optionalKey)
62
70
  });
63
- var TodoNotFound = class extends Schema.TaggedError()("TodoNotFound", { id: TodoId }, HttpApiSchema.annotations({ status: 404 })) {};
71
+ var TodoNotFound = class extends Schema.TaggedErrorClass()("TodoNotFound", { id: TodoId }) {};
64
72
  //#endregion
65
73
  //#region ../../packages/core/src/db/migrations.ts
66
74
  const migrations = [
@@ -127,15 +135,17 @@ const withTransaction = (db, body) => Effect.acquireUseRelease(Effect.sync(() =>
127
135
  if (Exit.isSuccess(exit)) db.exec("COMMIT");
128
136
  else db.exec("ROLLBACK");
129
137
  }));
130
- var SqliteService = class extends Effect.Service()("@ringi/SqliteService", { effect: Effect.gen(function* effect() {
131
- const dbPath = yield* Config.string("DB_PATH").pipe(Config.withDefault(".ringi/reviews.db"));
132
- mkdirSync(dirname(dbPath), { recursive: true });
133
- const db = new DatabaseSync(dbPath);
134
- db.exec("PRAGMA journal_mode=WAL");
135
- db.exec("PRAGMA foreign_keys=ON");
136
- runMigrations(db);
137
- return { db };
138
- }) }) {};
138
+ var SqliteService = class SqliteService extends ServiceMap.Service()("@ringi/SqliteService") {
139
+ static Default = Layer.effect(SqliteService, Effect.gen(function* () {
140
+ const dbPath = yield* Config.string("DB_PATH").pipe(Config.withDefault(".ringi/reviews.db"));
141
+ mkdirSync(dirname(dbPath), { recursive: true });
142
+ const db = new DatabaseSync(dbPath);
143
+ db.exec("PRAGMA journal_mode=WAL");
144
+ db.exec("PRAGMA foreign_keys=ON");
145
+ runMigrations(db);
146
+ return SqliteService.of({ db });
147
+ }));
148
+ };
139
149
  //#endregion
140
150
  //#region ../../packages/core/src/repos/comment.repo.ts
141
151
  const rowToComment = (row) => ({
@@ -150,9 +160,8 @@ const rowToComment = (row) => ({
150
160
  suggestion: row.suggestion,
151
161
  updatedAt: row.updated_at
152
162
  });
153
- var CommentRepo = class extends Effect.Service()("@ringi/CommentRepo", {
154
- dependencies: [SqliteService.Default],
155
- effect: Effect.gen(function* effect() {
163
+ var CommentRepo = class CommentRepo extends ServiceMap.Service()("@ringi/CommentRepo") {
164
+ static Default = Layer.effect(CommentRepo, Effect.gen(function* () {
156
165
  const { db } = yield* SqliteService;
157
166
  const stmtFindById = db.prepare("SELECT * FROM comments WHERE id = ?");
158
167
  const stmtFindByReview = db.prepare("SELECT * FROM comments WHERE review_id = ? ORDER BY created_at ASC");
@@ -225,7 +234,7 @@ var CommentRepo = class extends Effect.Service()("@ringi/CommentRepo", {
225
234
  withSuggestions: row.with_suggestions
226
235
  };
227
236
  });
228
- return {
237
+ return CommentRepo.of({
229
238
  countByReview,
230
239
  create,
231
240
  findByFile,
@@ -235,13 +244,17 @@ var CommentRepo = class extends Effect.Service()("@ringi/CommentRepo", {
235
244
  removeByReview,
236
245
  setResolved,
237
246
  update
238
- };
239
- })
240
- }) {};
247
+ });
248
+ }));
249
+ };
241
250
  //#endregion
242
251
  //#region ../../packages/core/src/schemas/comment.ts
243
252
  const CommentId = Schema.String.pipe(Schema.brand("CommentId"));
244
- const LineType = Schema.Literal("added", "removed", "context");
253
+ const LineType = Schema.Literals([
254
+ "added",
255
+ "removed",
256
+ "context"
257
+ ]);
245
258
  Schema.Struct({
246
259
  content: Schema.String,
247
260
  createdAt: Schema.String,
@@ -255,84 +268,77 @@ Schema.Struct({
255
268
  updatedAt: Schema.String
256
269
  });
257
270
  Schema.Struct({
258
- content: Schema.String.pipe(Schema.minLength(1)),
259
- filePath: Schema.String.pipe(Schema.minLength(1)),
260
- lineNumber: Schema.optionalWith(Schema.NullOr(Schema.Number), { default: () => null }),
261
- lineType: Schema.optionalWith(Schema.NullOr(LineType), { default: () => null }),
262
- suggestion: Schema.optionalWith(Schema.NullOr(Schema.String), { default: () => null })
271
+ content: Schema.String.pipe(Schema.check(Schema.isMinLength(1))),
272
+ filePath: Schema.String.pipe(Schema.check(Schema.isMinLength(1))),
273
+ lineNumber: Schema.NullOr(Schema.Number).pipe(Schema.optionalKey, Schema.withDecodingDefaultKey(() => null)),
274
+ lineType: Schema.NullOr(LineType).pipe(Schema.optionalKey, Schema.withDecodingDefaultKey(() => null)),
275
+ suggestion: Schema.NullOr(Schema.String).pipe(Schema.optionalKey, Schema.withDecodingDefaultKey(() => null))
263
276
  });
264
277
  Schema.Struct({
265
- content: Schema.optionalWith(Schema.String.pipe(Schema.minLength(1)), { as: "Option" }),
266
- suggestion: Schema.optionalWith(Schema.NullOr(Schema.String), { as: "Option" })
278
+ content: Schema.OptionFromNullOr(Schema.String.pipe(Schema.check(Schema.isMinLength(1)))).pipe(Schema.optionalKey),
279
+ suggestion: Schema.OptionFromNullOr(Schema.NullOr(Schema.String)).pipe(Schema.optionalKey)
267
280
  });
268
- var CommentNotFound = class extends Schema.TaggedError()("CommentNotFound", { id: CommentId }, HttpApiSchema.annotations({ status: 404 })) {};
281
+ var CommentNotFound = class extends Schema.TaggedErrorClass()("CommentNotFound", { id: CommentId }) {};
269
282
  //#endregion
270
283
  //#region ../../packages/core/src/services/comment.service.ts
271
- var CommentService = class extends Effect.Service()("@ringi/CommentService", {
272
- dependencies: [CommentRepo.Default],
273
- effect: Effect.sync(() => {
274
- const create = Effect.fn("CommentService.create")(function* create(reviewId, input) {
275
- const repo = yield* CommentRepo;
284
+ var CommentService = class CommentService extends ServiceMap.Service()("@ringi/CommentService") {
285
+ static Default = Layer.effect(CommentService, Effect.gen(function* () {
286
+ const repo = yield* CommentRepo;
287
+ const create = (reviewId, input) => {
276
288
  const id = randomUUID();
277
- return yield* repo.create({
289
+ return repo.create({
278
290
  content: input.content,
279
291
  filePath: input.filePath,
280
292
  id,
281
- lineNumber: input.lineNumber,
282
- lineType: input.lineType,
293
+ lineNumber: input.lineNumber ?? null,
294
+ lineType: input.lineType ?? null,
283
295
  reviewId,
284
- suggestion: input.suggestion
296
+ suggestion: input.suggestion ?? null
285
297
  });
286
- });
287
- const getById = Effect.fn("CommentService.getById")(function* getById(id) {
288
- const comment = yield* (yield* CommentRepo).findById(id);
298
+ };
299
+ const getById = (id) => Effect.gen(function* () {
300
+ const comment = yield* repo.findById(id);
289
301
  if (!comment) return yield* new CommentNotFound({ id });
290
302
  return comment;
291
303
  });
292
- const getByReview = Effect.fn("CommentService.getByReview")(function* getByReview(reviewId) {
293
- return yield* (yield* CommentRepo).findByReview(reviewId);
294
- });
295
- const getByFile = Effect.fn("CommentService.getByFile")(function* getByFile(reviewId, filePath) {
296
- return yield* (yield* CommentRepo).findByFile(reviewId, filePath);
297
- });
298
- const update = Effect.fn("CommentService.update")(function* update(id, input) {
299
- const repo = yield* CommentRepo;
304
+ const getByReview = (reviewId) => repo.findByReview(reviewId);
305
+ const getByFile = (reviewId, filePath) => repo.findByFile(reviewId, filePath);
306
+ const update = (id, input) => Effect.gen(function* () {
300
307
  const updates = {};
301
- if (Option.isSome(input.content)) updates.content = input.content.value;
302
- if (Option.isSome(input.suggestion)) updates.suggestion = input.suggestion.value;
308
+ if (input.content && Option.isSome(input.content)) updates.content = input.content.value;
309
+ if (input.suggestion && Option.isSome(input.suggestion)) updates.suggestion = input.suggestion.value;
303
310
  const comment = yield* repo.update(id, updates);
304
311
  if (!comment) return yield* new CommentNotFound({ id });
305
312
  return comment;
306
313
  });
307
- const resolve = Effect.fn("CommentService.resolve")(function* resolve(id) {
308
- const comment = yield* (yield* CommentRepo).setResolved(id, true);
314
+ const resolve = (id) => Effect.gen(function* () {
315
+ const comment = yield* repo.setResolved(id, true);
309
316
  if (!comment) return yield* new CommentNotFound({ id });
310
317
  return comment;
311
318
  });
312
- const unresolve = Effect.fn("CommentService.unresolve")(function* unresolve(id) {
313
- const comment = yield* (yield* CommentRepo).setResolved(id, false);
319
+ const unresolve = (id) => Effect.gen(function* () {
320
+ const comment = yield* repo.setResolved(id, false);
314
321
  if (!comment) return yield* new CommentNotFound({ id });
315
322
  return comment;
316
323
  });
317
- const remove = Effect.fn("CommentService.remove")(function* remove(id) {
318
- if (!(yield* (yield* CommentRepo).remove(id))) return yield* new CommentNotFound({ id });
324
+ const remove = (id) => Effect.gen(function* () {
325
+ if (!(yield* repo.remove(id))) return yield* new CommentNotFound({ id });
319
326
  return { success: true };
320
327
  });
321
- return {
328
+ const getStats = (reviewId) => repo.countByReview(reviewId);
329
+ return CommentService.of({
322
330
  create,
323
331
  getByFile,
324
332
  getById,
325
333
  getByReview,
326
- getStats: Effect.fn("CommentService.getStats")(function* getStats(reviewId) {
327
- return yield* (yield* CommentRepo).countByReview(reviewId);
328
- }),
334
+ getStats,
329
335
  remove,
330
336
  resolve,
331
337
  unresolve,
332
338
  update
333
- };
334
- })
335
- }) {};
339
+ });
340
+ }));
341
+ };
336
342
  //#endregion
337
343
  //#region ../../packages/core/src/services/diff.service.ts
338
344
  const HUNK_HEADER = /@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/;
@@ -450,11 +456,13 @@ const getDiffSummary = (files) => {
450
456
  };
451
457
  //#endregion
452
458
  //#region ../../packages/core/src/repos/review-file.repo.ts
453
- const parseHunks = (hunksData) => hunksData == null ? Effect.succeed([]) : Effect.try(() => JSON.parse(hunksData)).pipe(Effect.orElseSucceed(() => []));
459
+ const parseHunks = (hunksData) => hunksData == null ? Effect.succeed([]) : Effect.try({
460
+ try: () => JSON.parse(hunksData),
461
+ catch: () => []
462
+ }).pipe(Effect.orElseSucceed(() => []));
454
463
  const serializeHunks = (hunks) => JSON.stringify(hunks);
455
- var ReviewFileRepo = class extends Effect.Service()("@ringi/ReviewFileRepo", {
456
- dependencies: [SqliteService.Default],
457
- effect: Effect.gen(function* effect() {
464
+ var ReviewFileRepo = class ReviewFileRepo extends ServiceMap.Service()("@ringi/ReviewFileRepo") {
465
+ static Default = Layer.effect(ReviewFileRepo, Effect.gen(function* () {
458
466
  const { db } = yield* SqliteService;
459
467
  const stmtFindByReview = db.prepare(`SELECT id, review_id, file_path, old_path, status, additions, deletions, created_at
460
468
  FROM review_files WHERE review_id = ? ORDER BY file_path`);
@@ -477,15 +485,15 @@ var ReviewFileRepo = class extends Effect.Service()("@ringi/ReviewFileRepo", {
477
485
  const countByReview = (reviewId) => Effect.sync(() => {
478
486
  return stmtCountByReview.get(reviewId).count;
479
487
  });
480
- return {
488
+ return ReviewFileRepo.of({
481
489
  countByReview,
482
490
  createBulk,
483
491
  deleteByReview,
484
492
  findByReview,
485
493
  findByReviewAndPath
486
- };
487
- })
488
- }) {};
494
+ });
495
+ }));
496
+ };
489
497
  //#endregion
490
498
  //#region ../../packages/core/src/repos/review.repo.ts
491
499
  const rowToReview = (row) => ({
@@ -499,14 +507,14 @@ const rowToReview = (row) => ({
499
507
  status: row.status,
500
508
  updatedAt: row.updated_at
501
509
  });
502
- var ReviewRepo = class extends Effect.Service()("@ringi/ReviewRepo", {
503
- dependencies: [SqliteService.Default],
504
- effect: Effect.gen(function* effect() {
510
+ var ReviewRepo = class ReviewRepo extends ServiceMap.Service()("@ringi/ReviewRepo") {
511
+ static Default = Layer.effect(ReviewRepo, Effect.gen(function* () {
505
512
  const { db } = yield* SqliteService;
506
513
  const stmtFindById = db.prepare("SELECT * FROM reviews WHERE id = ?");
507
514
  const stmtInsert = db.prepare(`INSERT INTO reviews (id, repository_path, base_ref, source_type, source_ref, snapshot_data, status, created_at, updated_at)
508
515
  VALUES (?, ?, ?, ?, ?, ?, ?, datetime('now'), datetime('now'))`);
509
516
  const stmtUpdate = db.prepare(`UPDATE reviews SET status = COALESCE(?, status), updated_at = datetime('now') WHERE id = ?`);
517
+ const stmtUpdateSnapshot = db.prepare(`UPDATE reviews SET snapshot_data = ?, updated_at = datetime('now') WHERE id = ?`);
510
518
  const stmtDelete = db.prepare("DELETE FROM reviews WHERE id = ?");
511
519
  const stmtCountAll = db.prepare("SELECT COUNT(*) as count FROM reviews");
512
520
  const stmtCountByStatus = db.prepare("SELECT COUNT(*) as count FROM reviews WHERE status = ?");
@@ -548,6 +556,11 @@ var ReviewRepo = class extends Effect.Service()("@ringi/ReviewRepo", {
548
556
  const row = stmtFindById.get(id);
549
557
  return row ? rowToReview(row) : null;
550
558
  });
559
+ const updateSnapshotData = (id, snapshotData) => Effect.sync(() => {
560
+ stmtUpdateSnapshot.run(snapshotData, id);
561
+ const row = stmtFindById.get(id);
562
+ return row ? rowToReview(row) : null;
563
+ });
551
564
  const remove = (id) => Effect.sync(() => {
552
565
  const result = stmtDelete.run(id);
553
566
  return Number(result.changes) > 0;
@@ -558,22 +571,23 @@ var ReviewRepo = class extends Effect.Service()("@ringi/ReviewRepo", {
558
571
  const countByStatus = (status) => Effect.sync(() => {
559
572
  return stmtCountByStatus.get(status).count;
560
573
  });
561
- return {
574
+ return ReviewRepo.of({
562
575
  countAll,
563
576
  countByStatus,
564
577
  create,
565
578
  findAll,
566
579
  findById,
567
580
  remove,
568
- update
569
- };
570
- })
571
- }) {};
581
+ update,
582
+ updateSnapshotData
583
+ });
584
+ }));
585
+ };
572
586
  //#endregion
573
587
  //#region ../../packages/core/src/services/git.service.ts
574
- var GitError = class extends Schema.TaggedError()("GitError", { message: Schema.String }, HttpApiSchema.annotations({ status: 500 })) {};
588
+ var GitError = class extends Schema.TaggedErrorClass()("GitError", { message: Schema.String }) {};
575
589
  /** Max bytes to collect from a git command before truncating (200 MB). */
576
- const MAX_STDOUT_BYTES = 200 * 1024 * 1024;
590
+ const MAX_STDOUT_BYTES$1 = 200 * 1024 * 1024;
577
591
  const execGit = (args, repoPath) => Effect.tryPromise({
578
592
  catch: (error) => new GitError({ message: String(error) }),
579
593
  try: () => new Promise((resolve, reject) => {
@@ -584,7 +598,7 @@ const execGit = (args, repoPath) => Effect.tryPromise({
584
598
  child.stdout.on("data", (chunk) => {
585
599
  if (truncated) return;
586
600
  bytes += chunk.length;
587
- if (bytes > MAX_STDOUT_BYTES) {
601
+ if (bytes > MAX_STDOUT_BYTES$1) {
588
602
  truncated = true;
589
603
  child.kill();
590
604
  return;
@@ -616,187 +630,189 @@ const parseNameStatus = (output) => lines(output).map((line) => {
616
630
  status
617
631
  };
618
632
  });
619
- var GitService = class extends Effect.Service()("@ringi/GitService", { effect: Effect.gen(function* effect() {
620
- const repoPath = yield* Config.string("REPOSITORY_PATH").pipe(Config.withDefault(process.cwd()));
621
- const hasCommits = execGit(["rev-parse", "HEAD"], repoPath).pipe(Effect.as(true), Effect.catchTag("GitError", () => Effect.succeed(false)), Effect.withSpan("GitService.hasCommits"));
622
- const getRepositoryInfo = Effect.gen(function* getRepositoryInfo() {
623
- const name = yield* execGit(["rev-parse", "--show-toplevel"], repoPath).pipe(Effect.map((s) => s.trim().split("/").pop() ?? "unknown"));
624
- return {
625
- branch: yield* execGit([
626
- "rev-parse",
627
- "--abbrev-ref",
628
- "HEAD"
629
- ], repoPath).pipe(Effect.map((s) => s.trim())),
630
- name,
631
- path: repoPath,
632
- remote: yield* execGit([
633
- "config",
634
- "--get",
635
- "remote.origin.url"
636
- ], repoPath).pipe(Effect.map((s) => s.trim() || null), Effect.catchTag("GitError", () => Effect.succeed(null)))
637
- };
638
- }).pipe(Effect.withSpan("GitService.getRepositoryInfo"));
639
- const getStagedDiff = execGit([
640
- "diff",
641
- "--cached",
642
- "--no-color",
643
- "--unified=3"
644
- ], repoPath).pipe(Effect.withSpan("GitService.getStagedDiff"));
645
- const getUncommittedDiff = hasCommits.pipe(Effect.flatMap((has) => has ? execGit([
646
- "diff",
647
- "HEAD",
648
- "--no-color",
649
- "--unified=3"
650
- ], repoPath) : Effect.succeed("")), Effect.withSpan("GitService.getUncommittedDiff"));
651
- const getUnstagedDiff = execGit([
652
- "diff",
653
- "--no-color",
654
- "--unified=3"
655
- ], repoPath).pipe(Effect.withSpan("GitService.getUnstagedDiff"));
656
- const getLastCommitDiff = hasCommits.pipe(Effect.flatMap((has) => has ? execGit([
657
- "show",
658
- "HEAD",
659
- "--format=",
660
- "--no-color",
661
- "--unified=3"
662
- ], repoPath) : Effect.succeed("")), Effect.withSpan("GitService.getLastCommitDiff"));
663
- const getBranchDiff = Effect.fn("GitService.getBranchDiff")(function* getBranchDiff(branch) {
664
- return yield* execGit([
633
+ var GitService = class GitService extends ServiceMap.Service()("@ringi/GitService") {
634
+ static Default = Layer.effect(GitService, Effect.gen(function* () {
635
+ const repoPath = yield* Config.string("REPOSITORY_PATH").pipe(Config.withDefault(process.cwd()));
636
+ const hasCommits = execGit(["rev-parse", "HEAD"], repoPath).pipe(Effect.as(true), Effect.catchTag("GitError", () => Effect.succeed(false)), Effect.withSpan("GitService.hasCommits"));
637
+ const getRepositoryInfo = Effect.gen(function* () {
638
+ const name = yield* execGit(["rev-parse", "--show-toplevel"], repoPath).pipe(Effect.map((s) => s.trim().split("/").pop() ?? "unknown"));
639
+ return {
640
+ branch: yield* execGit([
641
+ "rev-parse",
642
+ "--abbrev-ref",
643
+ "HEAD"
644
+ ], repoPath).pipe(Effect.map((s) => s.trim())),
645
+ name,
646
+ path: repoPath,
647
+ remote: yield* execGit([
648
+ "config",
649
+ "--get",
650
+ "remote.origin.url"
651
+ ], repoPath).pipe(Effect.map((s) => s.trim() || null), Effect.catchTag("GitError", () => Effect.succeed(null)))
652
+ };
653
+ }).pipe(Effect.withSpan("GitService.getRepositoryInfo"));
654
+ const getStagedDiff = execGit([
665
655
  "diff",
666
- `${branch}...HEAD`,
656
+ "--cached",
667
657
  "--no-color",
668
658
  "--unified=3"
669
- ], repoPath);
670
- });
671
- const getCommitDiff = Effect.fn("GitService.getCommitDiff")(function* getCommitDiff(shas) {
672
- if (shas.length === 1) return yield* execGit([
673
- "show",
674
- shas[0],
675
- "--format=",
659
+ ], repoPath).pipe(Effect.withSpan("GitService.getStagedDiff"));
660
+ const getUncommittedDiff = hasCommits.pipe(Effect.flatMap((has) => has ? execGit([
661
+ "diff",
662
+ "HEAD",
676
663
  "--no-color",
677
664
  "--unified=3"
678
- ], repoPath);
679
- const first = shas.at(-1);
680
- const last = shas[0];
681
- return yield* execGit([
665
+ ], repoPath) : Effect.succeed("")), Effect.withSpan("GitService.getUncommittedDiff"));
666
+ const getUnstagedDiff = execGit([
682
667
  "diff",
683
- `${first}~1..${last}`,
684
668
  "--no-color",
685
669
  "--unified=3"
686
- ], repoPath);
687
- });
688
- const getStagedFiles = execGit([
689
- "diff",
690
- "--cached",
691
- "--name-status"
692
- ], repoPath).pipe(Effect.map(parseNameStatus), Effect.withSpan("GitService.getStagedFiles"));
693
- const getUncommittedFiles = hasCommits.pipe(Effect.flatMap((has) => has ? execGit([
694
- "diff",
695
- "HEAD",
696
- "--name-status"
697
- ], repoPath).pipe(Effect.map(parseNameStatus)) : Effect.succeed([])), Effect.withSpan("GitService.getUncommittedFiles"));
698
- const getUnstagedFiles = execGit(["diff", "--name-status"], repoPath).pipe(Effect.map(parseNameStatus), Effect.withSpan("GitService.getUnstagedFiles"));
699
- const getLastCommitFiles = hasCommits.pipe(Effect.flatMap((has) => has ? execGit([
700
- "show",
701
- "HEAD",
702
- "--format=",
703
- "--name-status"
704
- ], repoPath).pipe(Effect.map(parseNameStatus)) : Effect.succeed([])), Effect.withSpan("GitService.getLastCommitFiles"));
705
- const getFileContent = Effect.fn("GitService.getFileContent")(function* getFileContent(filePath, version) {
706
- switch (version) {
707
- case "staged": return yield* execGit(["show", `:${filePath}`], repoPath);
708
- case "head": return yield* execGit(["show", `HEAD:${filePath}`], repoPath);
709
- default: return yield* Effect.tryPromise({
710
- catch: (error) => new GitError({ message: `Failed to read ${filePath}: ${String(error)}` }),
711
- try: () => readFile(join(repoPath, filePath), "utf8")
712
- });
713
- }
714
- });
715
- const getFileTree = Effect.fn("GitService.getFileTree")(function* getFileTree(ref) {
716
- return yield* execGit([
717
- "ls-tree",
718
- "-r",
719
- "--name-only",
720
- ref
721
- ], repoPath).pipe(Effect.map(lines));
722
- });
723
- const getBranches = execGit(["branch", "--format=%(refname:short) %(HEAD)"], repoPath).pipe(Effect.map((output) => lines(output).map((line) => {
724
- const [name, head] = line.split(" ");
725
- return {
726
- current: head === "*",
727
- name
728
- };
729
- })), Effect.withSpan("GitService.getBranches"));
730
- const getCommits = Effect.fn("GitService.getCommits")(function* getCommits(opts) {
731
- const limit = (opts.limit ?? 20) + 1;
732
- const args = [
733
- "log",
734
- `--max-count=${limit}`,
735
- `--skip=${opts.offset ?? 0}`,
736
- "--format=%H %s %an %aI"
737
- ];
738
- if (opts.search) args.push(`--grep=${opts.search}`, "-i");
739
- const rows = lines(yield* execGit(args, repoPath));
740
- const hasMore = rows.length === limit;
741
- return {
742
- commits: (hasMore ? rows.slice(0, -1) : rows).map((line) => {
743
- const [hash, message, author, date] = line.split(" ");
744
- return {
745
- author,
746
- date,
747
- hash,
748
- message
749
- };
750
- }),
751
- hasMore
752
- };
753
- });
754
- const stageFiles = Effect.fn("GitService.stageFiles")(function* stageFiles(files) {
755
- return yield* execGit([
756
- "add",
757
- "--",
758
- ...files
759
- ], repoPath).pipe(Effect.as(files));
760
- });
761
- const stageAll = execGit(["add", "-A"], repoPath).pipe(Effect.flatMap(() => getStagedFiles), Effect.map((files) => files.map((f) => f.path)), Effect.withSpan("GitService.stageAll"));
762
- const unstageFiles = Effect.fn("GitService.unstageFiles")(function* unstageFiles(files) {
763
- return yield* execGit([
764
- "reset",
670
+ ], repoPath).pipe(Effect.withSpan("GitService.getUnstagedDiff"));
671
+ const getLastCommitDiff = hasCommits.pipe(Effect.flatMap((has) => has ? execGit([
672
+ "show",
765
673
  "HEAD",
766
- "--",
767
- ...files
768
- ], repoPath).pipe(Effect.as(files));
769
- });
770
- return {
771
- getBranchDiff,
772
- getBranches,
773
- getCommitDiff,
774
- getCommits,
775
- getFileContent,
776
- getFileTree,
777
- getLastCommitDiff,
778
- getLastCommitFiles,
779
- getRepositoryInfo,
780
- getRepositoryPath: execGit(["rev-parse", "--show-toplevel"], repoPath).pipe(Effect.map((s) => s.trim()), Effect.withSpan("GitService.getRepositoryPath")),
781
- getStagedDiff,
782
- getStagedFiles,
783
- getUncommittedDiff,
784
- getUncommittedFiles,
785
- getUnstagedDiff,
786
- getUnstagedFiles,
787
- hasCommits,
788
- stageAll,
789
- stageFiles,
790
- unstageFiles
791
- };
792
- }) }) {};
674
+ "--format=",
675
+ "--no-color",
676
+ "--unified=3"
677
+ ], repoPath) : Effect.succeed("")), Effect.withSpan("GitService.getLastCommitDiff"));
678
+ const getBranchDiff = Effect.fn("GitService.getBranchDiff")(function* (branch) {
679
+ return yield* execGit([
680
+ "diff",
681
+ `${branch}...HEAD`,
682
+ "--no-color",
683
+ "--unified=3"
684
+ ], repoPath);
685
+ });
686
+ const getCommitDiff = Effect.fn("GitService.getCommitDiff")(function* (shas) {
687
+ if (shas.length === 1) return yield* execGit([
688
+ "show",
689
+ shas[0],
690
+ "--format=",
691
+ "--no-color",
692
+ "--unified=3"
693
+ ], repoPath);
694
+ const first = shas.at(-1);
695
+ const last = shas[0];
696
+ return yield* execGit([
697
+ "diff",
698
+ `${first}~1..${last}`,
699
+ "--no-color",
700
+ "--unified=3"
701
+ ], repoPath);
702
+ });
703
+ const getStagedFiles = execGit([
704
+ "diff",
705
+ "--cached",
706
+ "--name-status"
707
+ ], repoPath).pipe(Effect.map(parseNameStatus), Effect.withSpan("GitService.getStagedFiles"));
708
+ const getUncommittedFiles = hasCommits.pipe(Effect.flatMap((has) => has ? execGit([
709
+ "diff",
710
+ "HEAD",
711
+ "--name-status"
712
+ ], repoPath).pipe(Effect.map(parseNameStatus)) : Effect.succeed([])), Effect.withSpan("GitService.getUncommittedFiles"));
713
+ const getUnstagedFiles = execGit(["diff", "--name-status"], repoPath).pipe(Effect.map(parseNameStatus), Effect.withSpan("GitService.getUnstagedFiles"));
714
+ const getLastCommitFiles = hasCommits.pipe(Effect.flatMap((has) => has ? execGit([
715
+ "show",
716
+ "HEAD",
717
+ "--format=",
718
+ "--name-status"
719
+ ], repoPath).pipe(Effect.map(parseNameStatus)) : Effect.succeed([])), Effect.withSpan("GitService.getLastCommitFiles"));
720
+ const getFileContent = Effect.fn("GitService.getFileContent")(function* (filePath, version) {
721
+ switch (version) {
722
+ case "staged": return yield* execGit(["show", `:${filePath}`], repoPath);
723
+ case "head": return yield* execGit(["show", `HEAD:${filePath}`], repoPath);
724
+ default: return yield* Effect.tryPromise({
725
+ catch: (error) => new GitError({ message: `Failed to read ${filePath}: ${String(error)}` }),
726
+ try: () => readFile(join(repoPath, filePath), "utf8")
727
+ });
728
+ }
729
+ });
730
+ const getFileTree = Effect.fn("GitService.getFileTree")(function* (ref) {
731
+ return yield* execGit([
732
+ "ls-tree",
733
+ "-r",
734
+ "--name-only",
735
+ ref
736
+ ], repoPath).pipe(Effect.map(lines));
737
+ });
738
+ const getBranches = execGit(["branch", "--format=%(refname:short) %(HEAD)"], repoPath).pipe(Effect.map((output) => lines(output).map((line) => {
739
+ const [name, head] = line.split(" ");
740
+ return {
741
+ current: head === "*",
742
+ name
743
+ };
744
+ })), Effect.withSpan("GitService.getBranches"));
745
+ const getCommits = Effect.fn("GitService.getCommits")(function* (opts) {
746
+ const limit = (opts.limit ?? 20) + 1;
747
+ const args = [
748
+ "log",
749
+ `--max-count=${limit}`,
750
+ `--skip=${opts.offset ?? 0}`,
751
+ "--format=%H %s %an %aI"
752
+ ];
753
+ if (opts.search) args.push(`--grep=${opts.search}`, "-i");
754
+ const rows = lines(yield* execGit(args, repoPath));
755
+ const hasMore = rows.length === limit;
756
+ return {
757
+ commits: (hasMore ? rows.slice(0, -1) : rows).map((line) => {
758
+ const [hash, message, author, date] = line.split(" ");
759
+ return {
760
+ author,
761
+ date,
762
+ hash,
763
+ message
764
+ };
765
+ }),
766
+ hasMore
767
+ };
768
+ });
769
+ const stageFiles = Effect.fn("GitService.stageFiles")(function* (files) {
770
+ return yield* execGit([
771
+ "add",
772
+ "--",
773
+ ...files
774
+ ], repoPath).pipe(Effect.as(files));
775
+ });
776
+ const stageAll = execGit(["add", "-A"], repoPath).pipe(Effect.flatMap(() => getStagedFiles), Effect.map((files) => files.map((f) => f.path)), Effect.withSpan("GitService.stageAll"));
777
+ const unstageFiles = Effect.fn("GitService.unstageFiles")(function* (files) {
778
+ return yield* execGit([
779
+ "reset",
780
+ "HEAD",
781
+ "--",
782
+ ...files
783
+ ], repoPath).pipe(Effect.as(files));
784
+ });
785
+ const getRepositoryPath = execGit(["rev-parse", "--show-toplevel"], repoPath).pipe(Effect.map((s) => s.trim()), Effect.withSpan("GitService.getRepositoryPath"));
786
+ return GitService.of({
787
+ getBranchDiff,
788
+ getBranches,
789
+ getCommitDiff,
790
+ getCommits,
791
+ getFileContent,
792
+ getFileTree,
793
+ getLastCommitDiff,
794
+ getLastCommitFiles,
795
+ getRepositoryInfo,
796
+ getRepositoryPath,
797
+ getStagedDiff,
798
+ getStagedFiles,
799
+ getUncommittedDiff,
800
+ getUncommittedFiles,
801
+ getUnstagedDiff,
802
+ getUnstagedFiles,
803
+ hasCommits,
804
+ stageAll,
805
+ stageFiles,
806
+ unstageFiles
807
+ });
808
+ }));
809
+ };
793
810
  //#endregion
794
811
  //#region ../../packages/core/src/services/review.service.ts
795
- var ReviewError = class extends Schema.TaggedError()("ReviewError", {
812
+ var ReviewError = class extends Schema.TaggedErrorClass()("ReviewError", {
796
813
  code: Schema.String,
797
814
  message: Schema.String
798
- }, HttpApiSchema.annotations({ status: 400 })) {};
799
- /** Get HEAD SHA via git rev-parse. */
815
+ }) {};
800
816
  const getHeadSha = (repoPath) => Effect.tryPromise({
801
817
  catch: () => new ReviewError({
802
818
  code: "GIT_ERROR",
@@ -809,23 +825,16 @@ const getHeadSha = (repoPath) => Effect.tryPromise({
809
825
  });
810
826
  })
811
827
  });
812
- /**
813
- * Parse snapshotData JSON. Handles both v1 and v2 formats gracefully.
814
- * v1: { files: DiffFile[], repository: {...} }
815
- * v2: { repository: {...}, version: 2 }
816
- */
817
- const parseSnapshotData = (s) => Effect.try(() => JSON.parse(s)).pipe(Effect.orElseSucceed(() => ({})));
818
- var ReviewService = class extends Effect.Service()("@ringi/ReviewService", {
819
- dependencies: [
820
- ReviewRepo.Default,
821
- ReviewFileRepo.Default,
822
- GitService.Default
823
- ],
824
- effect: Effect.sync(() => {
825
- const create = Effect.fn("ReviewService.create")(function* create(input) {
826
- const git = yield* GitService;
827
- const repo = yield* ReviewRepo;
828
- const fileRepo = yield* ReviewFileRepo;
828
+ const parseSnapshotData = (s) => Effect.try({
829
+ try: () => JSON.parse(s),
830
+ catch: () => ({})
831
+ }).pipe(Effect.orElseSucceed(() => ({})));
832
+ var ReviewService = class ReviewService extends ServiceMap.Service()("@ringi/ReviewService") {
833
+ static Default = Layer.effect(ReviewService, Effect.gen(function* () {
834
+ const git = yield* GitService;
835
+ const repo = yield* ReviewRepo;
836
+ const fileRepo = yield* ReviewFileRepo;
837
+ const create = (input) => Effect.gen(function* () {
829
838
  const repoPath = yield* git.getRepositoryPath;
830
839
  if (!(yield* git.hasCommits)) return yield* new ReviewError({
831
840
  code: "NO_COMMITS",
@@ -903,9 +912,7 @@ var ReviewService = class extends Effect.Service()("@ringi/ReviewService", {
903
912
  yield* fileRepo.createBulk(fileInputs);
904
913
  return review;
905
914
  });
906
- const list = Effect.fn("ReviewService.list")(function* list(opts) {
907
- const repo = yield* ReviewRepo;
908
- const fileRepo = yield* ReviewFileRepo;
915
+ const list = (opts) => Effect.gen(function* () {
909
916
  const page = opts.page ?? 1;
910
917
  const pageSize = opts.pageSize ?? 20;
911
918
  const result = yield* repo.findAll({
@@ -933,9 +940,7 @@ var ReviewService = class extends Effect.Service()("@ringi/ReviewService", {
933
940
  total: result.total
934
941
  };
935
942
  });
936
- const getById = Effect.fn("ReviewService.getById")(function* getById(id) {
937
- const repo = yield* ReviewRepo;
938
- const fileRepo = yield* ReviewFileRepo;
943
+ const getById = (id) => Effect.gen(function* () {
939
944
  const review = yield* repo.findById(id);
940
945
  if (!review) return yield* new ReviewNotFound({ id });
941
946
  const files = (yield* fileRepo.findByReview(id)).map((r) => ({
@@ -962,10 +967,7 @@ var ReviewService = class extends Effect.Service()("@ringi/ReviewService", {
962
967
  summary
963
968
  };
964
969
  });
965
- const getFileHunks = Effect.fn("ReviewService.getFileHunks")(function* getFileHunks(reviewId, filePath) {
966
- const repo = yield* ReviewRepo;
967
- const fileRepo = yield* ReviewFileRepo;
968
- const git = yield* GitService;
970
+ const getFileHunks = (reviewId, filePath) => Effect.gen(function* () {
969
971
  const review = yield* repo.findById(reviewId);
970
972
  if (!review) return yield* new ReviewNotFound({ id: reviewId });
971
973
  const fileRecord = yield* fileRepo.findByReviewAndPath(reviewId, filePath);
@@ -979,43 +981,40 @@ var ReviewService = class extends Effect.Service()("@ringi/ReviewService", {
979
981
  if (snapshot.files) return snapshot.files.find((f) => f.newPath === filePath)?.hunks ?? [];
980
982
  return [];
981
983
  });
982
- const update = Effect.fn("ReviewService.update")(function* update(id, input) {
983
- const repo = yield* ReviewRepo;
984
+ const update = (id, input) => Effect.gen(function* () {
984
985
  if (!(yield* repo.findById(id))) return yield* new ReviewNotFound({ id });
985
- const status = Option.getOrNull(input.status);
986
+ const status = input.status ? Option.getOrNull(input.status) : null;
986
987
  const review = yield* repo.update(id, status);
987
988
  if (!review) return yield* new ReviewNotFound({ id });
988
989
  return review;
989
990
  });
990
- const remove = Effect.fn("ReviewService.remove")(function* remove(id) {
991
- const repo = yield* ReviewRepo;
992
- const fileRepo = yield* ReviewFileRepo;
991
+ const remove = (id) => Effect.gen(function* () {
993
992
  if (!(yield* repo.findById(id))) return yield* new ReviewNotFound({ id });
994
993
  yield* fileRepo.deleteByReview(id);
995
994
  yield* repo.remove(id);
996
995
  return { success: true };
997
996
  });
998
- return {
997
+ const getStats = () => Effect.gen(function* () {
998
+ const total = yield* repo.countAll();
999
+ const inProgress = yield* repo.countByStatus("in_progress");
1000
+ return {
1001
+ approved: yield* repo.countByStatus("approved"),
1002
+ changesRequested: yield* repo.countByStatus("changes_requested"),
1003
+ inProgress,
1004
+ total
1005
+ };
1006
+ });
1007
+ return ReviewService.of({
999
1008
  create,
1000
1009
  getById,
1001
1010
  getFileHunks,
1002
- getStats: Effect.fn("ReviewService.getStats")(function* getStats() {
1003
- const repo = yield* ReviewRepo;
1004
- const total = yield* repo.countAll();
1005
- const inProgress = yield* repo.countByStatus("in_progress");
1006
- return {
1007
- approved: yield* repo.countByStatus("approved"),
1008
- changesRequested: yield* repo.countByStatus("changes_requested"),
1009
- inProgress,
1010
- total
1011
- };
1012
- }),
1011
+ getStats,
1013
1012
  list,
1014
1013
  remove,
1015
1014
  update
1016
- };
1017
- })
1018
- }) {};
1015
+ });
1016
+ }));
1017
+ };
1019
1018
  //#endregion
1020
1019
  //#region ../../packages/core/src/repos/todo.repo.ts
1021
1020
  const rowToTodo = (row) => ({
@@ -1027,9 +1026,8 @@ const rowToTodo = (row) => ({
1027
1026
  reviewId: row.review_id,
1028
1027
  updatedAt: row.updated_at
1029
1028
  });
1030
- var TodoRepo = class extends Effect.Service()("@ringi/TodoRepo", {
1031
- dependencies: [SqliteService.Default],
1032
- effect: Effect.gen(function* effect() {
1029
+ var TodoRepo = class TodoRepo extends ServiceMap.Service()("@ringi/TodoRepo") {
1030
+ static Default = Layer.effect(TodoRepo, Effect.gen(function* () {
1033
1031
  const { db } = yield* SqliteService;
1034
1032
  const stmtFindById = db.prepare("SELECT * FROM todos WHERE id = ?");
1035
1033
  const stmtInsert = db.prepare(`INSERT INTO todos (id, content, completed, review_id, position, created_at, updated_at)
@@ -1118,7 +1116,7 @@ var TodoRepo = class extends Effect.Service()("@ringi/TodoRepo", {
1118
1116
  }
1119
1117
  return updated;
1120
1118
  }));
1121
- const move = (id, newPosition) => Effect.gen(function* move() {
1119
+ const move = (id, newPosition) => Effect.gen(function* () {
1122
1120
  const row = stmtFindById.get(id);
1123
1121
  if (!row) return null;
1124
1122
  const oldPosition = row.position;
@@ -1138,7 +1136,7 @@ var TodoRepo = class extends Effect.Service()("@ringi/TodoRepo", {
1138
1136
  const countPending = () => Effect.sync(() => {
1139
1137
  return stmtCountPending.get().count;
1140
1138
  });
1141
- return {
1139
+ return TodoRepo.of({
1142
1140
  countAll,
1143
1141
  countCompleted,
1144
1142
  countPending,
@@ -1151,30 +1149,29 @@ var TodoRepo = class extends Effect.Service()("@ringi/TodoRepo", {
1151
1149
  reorder,
1152
1150
  toggle,
1153
1151
  update
1154
- };
1155
- })
1156
- }) {};
1152
+ });
1153
+ }));
1154
+ };
1157
1155
  //#endregion
1158
1156
  //#region ../../packages/core/src/services/todo.service.ts
1159
- var TodoService = class extends Effect.Service()("@ringi/TodoService", {
1160
- dependencies: [TodoRepo.Default],
1161
- effect: Effect.sync(() => {
1162
- const create = Effect.fn("TodoService.create")(function* create(input) {
1163
- const repo = yield* TodoRepo;
1157
+ var TodoService = class TodoService extends ServiceMap.Service()("@ringi/TodoService") {
1158
+ static Default = Layer.effect(TodoService, Effect.gen(function* () {
1159
+ const repo = yield* TodoRepo;
1160
+ const create = (input) => {
1164
1161
  const id = randomUUID();
1165
- return yield* repo.create({
1162
+ return repo.create({
1166
1163
  content: input.content,
1167
1164
  id,
1168
- reviewId: input.reviewId
1165
+ reviewId: input.reviewId ?? null
1169
1166
  });
1170
- });
1171
- const getById = Effect.fn("TodoService.getById")(function* getById(id) {
1172
- const todo = yield* (yield* TodoRepo).findById(id);
1167
+ };
1168
+ const getById = (id) => Effect.gen(function* () {
1169
+ const todo = yield* repo.findById(id);
1173
1170
  if (!todo) return yield* new TodoNotFound({ id });
1174
1171
  return todo;
1175
1172
  });
1176
- const list = Effect.fn("TodoService.list")(function* list(opts = {}) {
1177
- const result = yield* (yield* TodoRepo).findAll(opts);
1173
+ const list = (opts = {}) => Effect.gen(function* () {
1174
+ const result = yield* repo.findAll(opts);
1178
1175
  return {
1179
1176
  data: result.data,
1180
1177
  limit: opts.limit ?? null,
@@ -1182,50 +1179,48 @@ var TodoService = class extends Effect.Service()("@ringi/TodoService", {
1182
1179
  total: result.total
1183
1180
  };
1184
1181
  });
1185
- const update = Effect.fn("TodoService.update")(function* update(id, input) {
1186
- const repo = yield* TodoRepo;
1182
+ const update = (id, input) => Effect.gen(function* () {
1187
1183
  if (!(yield* repo.findById(id))) return yield* new TodoNotFound({ id });
1188
1184
  const updates = {};
1189
- if (Option.isSome(input.content)) updates.content = input.content.value;
1190
- if (Option.isSome(input.completed)) updates.completed = input.completed.value;
1185
+ if (input.content && Option.isSome(input.content)) updates.content = input.content.value;
1186
+ if (input.completed && Option.isSome(input.completed)) updates.completed = input.completed.value;
1191
1187
  const todo = yield* repo.update(id, updates);
1192
1188
  if (!todo) return yield* new TodoNotFound({ id });
1193
1189
  return todo;
1194
1190
  });
1195
- const toggle = Effect.fn("TodoService.toggle")(function* toggle(id) {
1196
- const todo = yield* (yield* TodoRepo).toggle(id);
1191
+ const toggle = (id) => Effect.gen(function* () {
1192
+ const todo = yield* repo.toggle(id);
1197
1193
  if (!todo) return yield* new TodoNotFound({ id });
1198
1194
  return todo;
1199
1195
  });
1200
- const remove = Effect.fn("TodoService.remove")(function* remove(id) {
1201
- const repo = yield* TodoRepo;
1196
+ const remove = (id) => Effect.gen(function* () {
1202
1197
  if (!(yield* repo.findById(id))) return yield* new TodoNotFound({ id });
1203
1198
  yield* repo.remove(id);
1204
1199
  return { success: true };
1205
1200
  });
1206
- const removeCompleted = Effect.fn("TodoService.removeCompleted")(function* removeCompleted() {
1207
- return { deleted: yield* (yield* TodoRepo).removeCompleted() };
1201
+ const removeCompleted = () => Effect.gen(function* () {
1202
+ return { deleted: yield* repo.removeCompleted() };
1208
1203
  });
1209
- const reorder = Effect.fn("TodoService.reorder")(function* reorder(orderedIds) {
1210
- return { updated: yield* (yield* TodoRepo).reorder(orderedIds) };
1204
+ const reorder = (orderedIds) => Effect.gen(function* () {
1205
+ return { updated: yield* repo.reorder(orderedIds) };
1211
1206
  });
1212
- const move = Effect.fn("TodoService.move")(function* move(id, position) {
1213
- const todo = yield* (yield* TodoRepo).move(id, position);
1207
+ const move = (id, position) => Effect.gen(function* () {
1208
+ const todo = yield* repo.move(id, position);
1214
1209
  if (!todo) return yield* new TodoNotFound({ id });
1215
1210
  return todo;
1216
1211
  });
1217
- return {
1212
+ const getStats = () => Effect.gen(function* () {
1213
+ const total = yield* repo.countAll();
1214
+ return {
1215
+ completed: yield* repo.countCompleted(),
1216
+ pending: yield* repo.countPending(),
1217
+ total
1218
+ };
1219
+ });
1220
+ return TodoService.of({
1218
1221
  create,
1219
1222
  getById,
1220
- getStats: Effect.fn("TodoService.getStats")(function* getStats() {
1221
- const repo = yield* TodoRepo;
1222
- const total = yield* repo.countAll();
1223
- return {
1224
- completed: yield* repo.countCompleted(),
1225
- pending: yield* repo.countPending(),
1226
- total
1227
- };
1228
- }),
1223
+ getStats,
1229
1224
  list,
1230
1225
  move,
1231
1226
  remove,
@@ -1233,22 +1228,17 @@ var TodoService = class extends Effect.Service()("@ringi/TodoService", {
1233
1228
  reorder,
1234
1229
  toggle,
1235
1230
  update
1236
- };
1237
- })
1238
- }) {};
1231
+ });
1232
+ }));
1233
+ };
1239
1234
  //#endregion
1240
1235
  //#region ../../packages/core/src/services/export.service.ts
1241
- var ExportService = class extends Effect.Service()("@ringi/ExportService", {
1242
- dependencies: [
1243
- ReviewService.Default,
1244
- CommentService.Default,
1245
- TodoService.Default
1246
- ],
1247
- effect: Effect.sync(() => {
1248
- return { exportReview: Effect.fn("ExportService.exportReview")(function* exportReview(reviewId) {
1249
- const reviewSvc = yield* ReviewService;
1250
- const commentSvc = yield* CommentService;
1251
- const todoSvc = yield* TodoService;
1236
+ var ExportService = class ExportService extends ServiceMap.Service()("@ringi/ExportService") {
1237
+ static Default = Layer.effect(ExportService, Effect.gen(function* () {
1238
+ const reviewSvc = yield* ReviewService;
1239
+ const commentSvc = yield* CommentService;
1240
+ const todoSvc = yield* TodoService;
1241
+ const exportReview = (reviewId) => Effect.gen(function* () {
1252
1242
  const review = yield* reviewSvc.getById(reviewId);
1253
1243
  const repo = review.repository;
1254
1244
  const repoName = repo?.name ?? "Unknown";
@@ -1313,9 +1303,154 @@ var ExportService = class extends Effect.Service()("@ringi/ExportService", {
1313
1303
  }
1314
1304
  lines.push("");
1315
1305
  return lines.join("\n");
1316
- }) };
1317
- })
1306
+ });
1307
+ return ExportService.of({ exportReview });
1308
+ }));
1309
+ };
1310
+ //#endregion
1311
+ //#region ../../packages/core/src/services/gh.service.ts
1312
+ var GhNotInstalled = class extends Schema.TaggedErrorClass()("GhNotInstalled", { message: Schema.String }) {};
1313
+ var GhAuthError = class extends Schema.TaggedErrorClass()("GhAuthError", {
1314
+ host: Schema.String,
1315
+ message: Schema.String
1316
+ }) {};
1317
+ var GhApiError = class extends Schema.TaggedErrorClass()("GhApiError", {
1318
+ message: Schema.String,
1319
+ statusCode: Schema.NullOr(Schema.Number)
1318
1320
  }) {};
1321
+ /** Max bytes to collect from gh output (50 MB — PR diffs can be large). */
1322
+ const MAX_STDOUT_BYTES = 50 * 1024 * 1024;
1323
+ const execGh = (args) => Effect.tryPromise({
1324
+ catch: (error) => new GhApiError({
1325
+ message: String(error),
1326
+ statusCode: null
1327
+ }),
1328
+ try: () => new Promise((resolve, reject) => {
1329
+ const child = spawn("gh", [...args], { stdio: [
1330
+ "ignore",
1331
+ "pipe",
1332
+ "pipe"
1333
+ ] });
1334
+ const chunks = [];
1335
+ let bytes = 0;
1336
+ let truncated = false;
1337
+ child.stdout.on("data", (chunk) => {
1338
+ if (truncated) return;
1339
+ bytes += chunk.length;
1340
+ if (bytes > MAX_STDOUT_BYTES) {
1341
+ truncated = true;
1342
+ child.kill();
1343
+ return;
1344
+ }
1345
+ chunks.push(chunk);
1346
+ });
1347
+ let stderr = "";
1348
+ child.stderr.on("data", (chunk) => {
1349
+ stderr += chunk.toString();
1350
+ });
1351
+ child.on("error", (err) => {
1352
+ reject(/* @__PURE__ */ new Error(`Failed to spawn gh: ${err.message}`));
1353
+ });
1354
+ child.on("close", (code) => {
1355
+ if (truncated) {
1356
+ resolve(Buffer.concat(chunks).toString("utf8"));
1357
+ return;
1358
+ }
1359
+ if (code !== 0) reject(/* @__PURE__ */ new Error(`gh ${args[0]} exited with code ${code}: ${stderr}`));
1360
+ else resolve(Buffer.concat(chunks).toString("utf8"));
1361
+ });
1362
+ })
1363
+ });
1364
+ /** PR metadata fields requested from gh in a single JSON call. */
1365
+ const PR_JSON_FIELDS = [
1366
+ "additions",
1367
+ "author",
1368
+ "baseRefName",
1369
+ "baseRefOid",
1370
+ "body",
1371
+ "changedFiles",
1372
+ "createdAt",
1373
+ "deletions",
1374
+ "headRefName",
1375
+ "headRefOid",
1376
+ "headRepository",
1377
+ "isDraft",
1378
+ "mergeable",
1379
+ "number",
1380
+ "reviewDecision",
1381
+ "state",
1382
+ "title",
1383
+ "updatedAt",
1384
+ "url"
1385
+ ].join(",");
1386
+ var GhService = class GhService extends ServiceMap.Service()("@ringi/GhService") {
1387
+ static Default = Layer.effect(GhService, Effect.gen(function* () {
1388
+ const ensureInstalled = execGh(["version"]).pipe(Effect.asVoid, Effect.mapError(() => new GhNotInstalled({ message: "GitHub CLI (gh) not found. Install: https://cli.github.com" })), Effect.withSpan("GhService.ensureInstalled"));
1389
+ const ensureAuthenticated = Effect.fn("GhService.ensureAuthenticated")(function* (host) {
1390
+ yield* execGh([
1391
+ "auth",
1392
+ "status",
1393
+ "--hostname",
1394
+ host
1395
+ ]).pipe(Effect.asVoid, Effect.mapError(() => new GhAuthError({
1396
+ host,
1397
+ message: `Not authenticated to ${host}. Run: gh auth login --hostname ${host}`
1398
+ })));
1399
+ });
1400
+ const fetchPrMetadata = Effect.fn("GhService.fetchPrMetadata")(function* (target) {
1401
+ const json = yield* execGh([
1402
+ "pr",
1403
+ "view",
1404
+ String(target.prNumber),
1405
+ "--repo",
1406
+ target.nwoRef,
1407
+ "--json",
1408
+ PR_JSON_FIELDS
1409
+ ]);
1410
+ return yield* Effect.try({
1411
+ catch: () => new GhApiError({
1412
+ message: "Failed to parse PR metadata JSON from gh output",
1413
+ statusCode: null
1414
+ }),
1415
+ try: () => JSON.parse(json)
1416
+ });
1417
+ });
1418
+ const fetchPrDiff = Effect.fn("GhService.fetchPrDiff")(function* (target) {
1419
+ return yield* execGh([
1420
+ "pr",
1421
+ "diff",
1422
+ String(target.prNumber),
1423
+ "--repo",
1424
+ target.nwoRef
1425
+ ]);
1426
+ });
1427
+ const fetchPrHeadOid = Effect.fn("GhService.fetchPrHeadOid")(function* (target) {
1428
+ const json = yield* execGh([
1429
+ "pr",
1430
+ "view",
1431
+ String(target.prNumber),
1432
+ "--repo",
1433
+ target.nwoRef,
1434
+ "--json",
1435
+ "headRefOid"
1436
+ ]);
1437
+ return yield* Effect.try({
1438
+ catch: () => new GhApiError({
1439
+ message: "Failed to parse head OID from gh output",
1440
+ statusCode: null
1441
+ }),
1442
+ try: () => JSON.parse(json).headRefOid
1443
+ });
1444
+ });
1445
+ return GhService.of({
1446
+ ensureAuthenticated,
1447
+ ensureInstalled,
1448
+ fetchPrDiff,
1449
+ fetchPrHeadOid,
1450
+ fetchPrMetadata
1451
+ });
1452
+ }));
1453
+ };
1319
1454
  //#endregion
1320
1455
  //#region ../../node_modules/.pnpm/readdirp@5.0.0/node_modules/readdirp/index.js
1321
1456
  const EntryTypes = {
@@ -2909,67 +3044,73 @@ var chokidar_default = {
2909
3044
  };
2910
3045
  //#endregion
2911
3046
  //#region ../../packages/core/src/services/event.service.ts
2912
- var EventService = class extends Effect.Service()("@ringi/EventService", { effect: Effect.gen(function* effect() {
2913
- const rt = yield* Effect.runtime();
2914
- const runFork = Runtime.runFork(rt);
2915
- const subscribers = /* @__PURE__ */ new Set();
2916
- const broadcast = Effect.fn("EventService.broadcast")(function* broadcast(type, data) {
2917
- const event = {
2918
- data,
2919
- timestamp: Date.now(),
2920
- type
2921
- };
2922
- for (const queue of subscribers) yield* Queue.offer(queue, event);
2923
- });
2924
- const subscribe = Effect.fn("EventService.subscribe")(function* subscribe() {
2925
- const queue = yield* Queue.sliding(100);
2926
- subscribers.add(queue);
2927
- return {
2928
- stream: Stream.fromQueue(queue),
2929
- unsubscribe: Effect.sync(() => {
2930
- subscribers.delete(queue);
2931
- }).pipe(Effect.andThen(Queue.shutdown(queue)))
2932
- };
2933
- });
2934
- const startFileWatcher = (repoPath) => Effect.acquireRelease(Effect.sync(() => {
2935
- let debounceTimer = null;
2936
- const watcher = chokidar_default.watch(repoPath, {
2937
- ignoreInitial: true,
2938
- ignored: [
2939
- "**/node_modules/**",
2940
- "**/.git/**",
2941
- "**/.ringi/**",
2942
- "**/dist/**"
2943
- ],
2944
- persistent: true,
2945
- ...platform() === "darwin" ? {
2946
- interval: 1e3,
2947
- usePolling: true
2948
- } : {}
2949
- });
2950
- const debouncedBroadcast = (filePath) => {
2951
- if (debounceTimer) clearTimeout(debounceTimer);
2952
- debounceTimer = setTimeout(() => {
2953
- runFork(broadcast("files", { path: relative(repoPath, filePath) }));
2954
- }, 300);
2955
- };
2956
- watcher.on("add", debouncedBroadcast);
2957
- watcher.on("change", debouncedBroadcast);
2958
- watcher.on("unlink", debouncedBroadcast);
2959
- return watcher;
2960
- }), (watcher) => Effect.promise(() => watcher.close()));
2961
- const getClientCount = () => Effect.sync(() => subscribers.size);
2962
- return {
2963
- broadcast,
2964
- getClientCount,
2965
- startFileWatcher,
2966
- subscribe
2967
- };
2968
- }) }) {};
3047
+ var EventService = class EventService extends ServiceMap.Service()("@ringi/EventService") {
3048
+ static Default = Layer.effect(EventService, Effect.sync(() => {
3049
+ const subscribers = /* @__PURE__ */ new Set();
3050
+ const broadcast = (type, data) => Effect.gen(function* () {
3051
+ const event = {
3052
+ data,
3053
+ timestamp: Date.now(),
3054
+ type
3055
+ };
3056
+ for (const queue of subscribers) yield* Queue.offer(queue, event);
3057
+ });
3058
+ const subscribe = () => Effect.gen(function* () {
3059
+ const queue = yield* Queue.sliding(100);
3060
+ subscribers.add(queue);
3061
+ return {
3062
+ stream: Stream.fromQueue(queue),
3063
+ unsubscribe: Effect.sync(() => {
3064
+ subscribers.delete(queue);
3065
+ }).pipe(Effect.andThen(Queue.shutdown(queue)))
3066
+ };
3067
+ });
3068
+ const startFileWatcher = (repoPath) => Effect.acquireRelease(Effect.sync(() => {
3069
+ let debounceTimer = null;
3070
+ const watcher = chokidar_default.watch(repoPath, {
3071
+ ignoreInitial: true,
3072
+ ignored: [
3073
+ "**/node_modules/**",
3074
+ "**/.git/**",
3075
+ "**/.ringi/**",
3076
+ "**/dist/**"
3077
+ ],
3078
+ persistent: true,
3079
+ ...platform() === "darwin" ? {
3080
+ interval: 1e3,
3081
+ usePolling: true
3082
+ } : {}
3083
+ });
3084
+ const debouncedBroadcast = (filePath) => {
3085
+ if (debounceTimer) clearTimeout(debounceTimer);
3086
+ debounceTimer = setTimeout(() => {
3087
+ const rel = relative(repoPath, filePath);
3088
+ Effect.runFork(broadcast("files", { path: rel }));
3089
+ }, 300);
3090
+ };
3091
+ watcher.on("add", debouncedBroadcast);
3092
+ watcher.on("change", debouncedBroadcast);
3093
+ watcher.on("unlink", debouncedBroadcast);
3094
+ return watcher;
3095
+ }), (watcher) => Effect.promise(() => watcher.close()));
3096
+ const getClientCount = () => Effect.sync(() => subscribers.size);
3097
+ return EventService.of({
3098
+ broadcast,
3099
+ getClientCount,
3100
+ startFileWatcher,
3101
+ subscribe
3102
+ });
3103
+ }));
3104
+ };
2969
3105
  //#endregion
2970
3106
  //#region ../../packages/core/src/runtime.ts
2971
- const CoreLive = Layer.mergeAll(ReviewService.Default, ReviewRepo.Default, ReviewFileRepo.Default, CommentService.Default, CommentRepo.Default, TodoService.Default, TodoRepo.Default, GitService.Default, EventService.Default, ExportService.Default, SqliteService.Default);
3107
+ const RepoLive = Layer.mergeAll(ReviewRepo.Default, ReviewFileRepo.Default, CommentRepo.Default, TodoRepo.Default).pipe(Layer.provide(SqliteService.Default));
3108
+ const CommentServiceLive = CommentService.Default.pipe(Layer.provide(CommentRepo.Default), Layer.provide(SqliteService.Default));
3109
+ const TodoServiceLive = TodoService.Default.pipe(Layer.provide(TodoRepo.Default), Layer.provide(SqliteService.Default));
3110
+ const ReviewServiceLive = ReviewService.Default.pipe(Layer.provide(ReviewRepo.Default), Layer.provide(ReviewFileRepo.Default), Layer.provide(GitService.Default), Layer.provide(SqliteService.Default));
3111
+ const ExportServiceLive = ExportService.Default.pipe(Layer.provide(ReviewServiceLive), Layer.provide(CommentServiceLive), Layer.provide(TodoServiceLive));
3112
+ const CoreLive = Layer.mergeAll(ReviewServiceLive, CommentServiceLive, TodoServiceLive, GitService.Default, GhService.Default, EventService.Default, ExportServiceLive, RepoLive, SqliteService.Default);
2972
3113
  //#endregion
2973
- export { GitService as a, CommentService as c, ReviewId as d, ReviewNotFound as f, ReviewService as i, TodoId as l, ExportService as n, getDiffSummary as o, ReviewSourceType as p, TodoService as r, parseDiff as s, CoreLive as t, TodoNotFound as u };
3114
+ export { ReviewSourceType as _, ReviewService as a, ReviewFileRepo as c, parseDiff as d, CommentService as f, ReviewNotFound as g, ReviewId as h, TodoService as i, serializeHunks as l, TodoNotFound as m, GhService as n, GitService as o, TodoId as p, ExportService as r, ReviewRepo as s, CoreLive as t, getDiffSummary as u };
2974
3115
 
2975
3116
  //# sourceMappingURL=runtime.mjs.map