epiq 1.5.0 → 1.6.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 (403) hide show
  1. package/dist/gui/abap-QUGURUBX.js +10 -0
  2. package/dist/gui/actionscript-3-3B35LJ6O.js +10 -0
  3. package/dist/gui/ada-UZZSP2VN.js +10 -0
  4. package/dist/gui/ahk-AV2XNNVZ.js +10 -0
  5. package/dist/gui/ahk2-KEAF4H55.js +10 -0
  6. package/dist/gui/andromeeda-2GR76PYB.js +7 -0
  7. package/dist/gui/angular-html-TCKFTSN3.js +10 -0
  8. package/dist/gui/angular-ts-OWXT6U2F.js +44 -0
  9. package/dist/gui/apache-K3WQQUQC.js +10 -0
  10. package/dist/gui/apex-76A7OZCW.js +10 -0
  11. package/dist/gui/apl-QUJH6REI.js +31 -0
  12. package/dist/gui/applescript-DYSSLNAH.js +10 -0
  13. package/dist/gui/ara-JBUHYAMO.js +10 -0
  14. package/dist/gui/asciidoc-GVSAY7ID.js +10 -0
  15. package/dist/gui/asm-7T5K47RE.js +10 -0
  16. package/dist/gui/astro-ROBUIKHM.js +34 -0
  17. package/dist/gui/aurora-x-CCBQ7SH7.js +7 -0
  18. package/dist/gui/awk-X3RXUDTD.js +10 -0
  19. package/dist/gui/ayu-dark-PIU367MT.js +7 -0
  20. package/dist/gui/ayu-light-Y4QUM4BU.js +7 -0
  21. package/dist/gui/ayu-mirage-LSLYYZ6M.js +7 -0
  22. package/dist/gui/ballerina-X5OCGDT7.js +10 -0
  23. package/dist/gui/bat-6N655JFC.js +7 -0
  24. package/dist/gui/beancount-737SRZDB.js +10 -0
  25. package/dist/gui/berry-27ZIFCK5.js +10 -0
  26. package/dist/gui/bibtex-PCJ2P64N.js +7 -0
  27. package/dist/gui/bicep-KZTPGRFB.js +10 -0
  28. package/dist/gui/bird2-4JCG5OZF.js +10 -0
  29. package/dist/gui/blade-TDVDX7TO.js +39 -0
  30. package/dist/gui/bsl-35Z2FTGV.js +14 -0
  31. package/dist/gui/c-7CKX2DSI.js +7 -0
  32. package/dist/gui/c3-DR3DV77K.js +10 -0
  33. package/dist/gui/cadence-OYNPDM3M.js +10 -0
  34. package/dist/gui/cairo-COXU6RBH.js +14 -0
  35. package/dist/gui/catppuccin-frappe-P2B2FXCB.js +7 -0
  36. package/dist/gui/catppuccin-latte-AIEPHNSB.js +7 -0
  37. package/dist/gui/catppuccin-macchiato-CLAJLZV7.js +7 -0
  38. package/dist/gui/catppuccin-mocha-DJZW5ULN.js +7 -0
  39. package/dist/gui/chapel-5CK5YMSY.js +14 -0
  40. package/dist/gui/chunk-2IVRELJI.js +9 -0
  41. package/dist/gui/chunk-2JKKPALB.js +9 -0
  42. package/dist/gui/chunk-2PUAXP2T.js +38 -0
  43. package/dist/gui/chunk-2QHMH6QB.js +9 -0
  44. package/dist/gui/chunk-2XE676KO.js +9 -0
  45. package/dist/gui/chunk-2YCLQAMI.js +9 -0
  46. package/dist/gui/chunk-3567J5D4.js +14 -0
  47. package/dist/gui/chunk-3BGADQKG.js +9 -0
  48. package/dist/gui/chunk-45O7TJOW.js +9 -0
  49. package/dist/gui/chunk-4DOSCG4B.js +26 -0
  50. package/dist/gui/chunk-4IZ5IRSO.js +9 -0
  51. package/dist/gui/chunk-5TDK5Y5S.js +9 -0
  52. package/dist/gui/chunk-67HINKFV.js +9 -0
  53. package/dist/gui/chunk-6TG6XZZD.js +14 -0
  54. package/dist/gui/chunk-76C5RMV7.js +9 -0
  55. package/dist/gui/chunk-7CB7TITS.js +9 -0
  56. package/dist/gui/chunk-7YLAFQQ7.js +27 -0
  57. package/dist/gui/chunk-AZIN3OHL.js +14 -0
  58. package/dist/gui/chunk-BW7B23CF.js +9 -0
  59. package/dist/gui/chunk-C774R7J7.js +26 -0
  60. package/dist/gui/chunk-CB7BCEL4.js +9 -0
  61. package/dist/gui/chunk-CYKSS2Y7.js +9 -0
  62. package/dist/gui/chunk-DCJCRTKO.js +14 -0
  63. package/dist/gui/chunk-DKOWBU7G.js +9 -0
  64. package/dist/gui/chunk-DWAALHPK.js +9 -0
  65. package/dist/gui/chunk-EZITVRXA.js +9 -0
  66. package/dist/gui/chunk-FAHLSHNR.js +9 -0
  67. package/dist/gui/chunk-FALFVRCV.js +14 -0
  68. package/dist/gui/chunk-GL2Q3EDW.js +9 -0
  69. package/dist/gui/chunk-H66FQEKW.js +9 -0
  70. package/dist/gui/chunk-HGZA2JNF.js +9 -0
  71. package/dist/gui/chunk-HQG63PQL.js +9 -0
  72. package/dist/gui/chunk-HSNCWORT.js +9 -0
  73. package/dist/gui/chunk-IJCSV645.js +14 -0
  74. package/dist/gui/chunk-ILHZPDJC.js +9 -0
  75. package/dist/gui/chunk-IYFWWBRC.js +34 -0
  76. package/dist/gui/chunk-J6IKJJ34.js +34 -0
  77. package/dist/gui/chunk-JBVY6KB5.js +9 -0
  78. package/dist/gui/chunk-JJHUDSW7.js +9 -0
  79. package/dist/gui/chunk-JLIS73DH.js +14 -0
  80. package/dist/gui/chunk-JO5JNDTX.js +9 -0
  81. package/dist/gui/chunk-JV223PVL.js +14 -0
  82. package/dist/gui/chunk-JVCCJA2A.js +30 -0
  83. package/dist/gui/chunk-KGH6JTBL.js +9 -0
  84. package/dist/gui/chunk-KM2QKTEE.js +50 -0
  85. package/dist/gui/chunk-KSXADT4K.js +9 -0
  86. package/dist/gui/chunk-MT4FGOLU.js +9 -0
  87. package/dist/gui/chunk-NAD33WBI.js +14 -0
  88. package/dist/gui/chunk-NE25QJUZ.js +9 -0
  89. package/dist/gui/chunk-OII47WE4.js +14 -0
  90. package/dist/gui/chunk-OWEPHUF3.js +14 -0
  91. package/dist/gui/chunk-Q2AHPUVI.js +9 -0
  92. package/dist/gui/chunk-Q567VMM5.js +9 -0
  93. package/dist/gui/chunk-QFOAKHDY.js +9 -0
  94. package/dist/gui/chunk-QH2T6GYZ.js +9 -0
  95. package/dist/gui/chunk-QU263C3I.js +9 -0
  96. package/dist/gui/chunk-QYOJGBVM.js +14 -0
  97. package/dist/gui/chunk-R27EWKMH.js +58 -0
  98. package/dist/gui/chunk-RW4VQAW5.js +18 -0
  99. package/dist/gui/chunk-S7GWCO5B.js +9 -0
  100. package/dist/gui/chunk-SBETFYFF.js +30 -0
  101. package/dist/gui/chunk-SF5VS2XA.js +9 -0
  102. package/dist/gui/chunk-SZ2AIRR5.js +9 -0
  103. package/dist/gui/chunk-TKLN6WSC.js +9 -0
  104. package/dist/gui/chunk-TS3VPCJT.js +9 -0
  105. package/dist/gui/chunk-UUL2FFKC.js +53 -0
  106. package/dist/gui/chunk-VB3O6QM4.js +9 -0
  107. package/dist/gui/chunk-VEW77XHD.js +9 -0
  108. package/dist/gui/chunk-VVHT2QDI.js +14 -0
  109. package/dist/gui/chunk-WAWKOXXW.js +18 -0
  110. package/dist/gui/chunk-WBGGZ2J4.js +9 -0
  111. package/dist/gui/chunk-WC4BNZJP.js +9 -0
  112. package/dist/gui/chunk-XOMTOLBK.js +9 -0
  113. package/dist/gui/chunk-YBPIMBI6.js +9 -0
  114. package/dist/gui/chunk-YCL6DOP5.js +9 -0
  115. package/dist/gui/chunk-YJV35WLF.js +14 -0
  116. package/dist/gui/chunk-YOOITCA2.js +22 -0
  117. package/dist/gui/chunk-YWGUZU7U.js +9 -0
  118. package/dist/gui/chunk-YXIK6PVL.js +9 -0
  119. package/dist/gui/chunk-ZMZROCQO.js +9 -0
  120. package/dist/gui/clarity-X6Y4EF32.js +10 -0
  121. package/dist/gui/clojure-HWHJFZBF.js +7 -0
  122. package/dist/gui/cmake-4WVDKLXE.js +7 -0
  123. package/dist/gui/cobol-BK36TVIL.js +20 -0
  124. package/dist/gui/codeowners-PKXUEH4G.js +10 -0
  125. package/dist/gui/codeql-GSSNZAAP.js +10 -0
  126. package/dist/gui/coffee-CGHHEFIM.js +8 -0
  127. package/dist/gui/common-lisp-V4DD5MQE.js +10 -0
  128. package/dist/gui/coq-QVWLCVBB.js +10 -0
  129. package/dist/gui/cpp-KAUF3RSB.js +10 -0
  130. package/dist/gui/crystal-7TGOAT76.js +34 -0
  131. package/dist/gui/csharp-RRPDDXD7.js +7 -0
  132. package/dist/gui/css-S4XR6RYL.js +7 -0
  133. package/dist/gui/csv-ZNGJRB22.js +7 -0
  134. package/dist/gui/cue-7HOXZRS4.js +10 -0
  135. package/dist/gui/cypher-EAUAMJM6.js +10 -0
  136. package/dist/gui/d-CBA7NL6B.js +10 -0
  137. package/dist/gui/dark-plus-BOB45KCW.js +7 -0
  138. package/dist/gui/dart-MZSRF3IM.js +7 -0
  139. package/dist/gui/dax-Q4BTRBTA.js +10 -0
  140. package/dist/gui/desktop-NKAUWTGR.js +10 -0
  141. package/dist/gui/diff-RVUP6GV7.js +7 -0
  142. package/dist/gui/docker-KGDTLYEN.js +7 -0
  143. package/dist/gui/dotenv-5YOSIPZS.js +10 -0
  144. package/dist/gui/dracula-F56RSW6N.js +7 -0
  145. package/dist/gui/dracula-soft-CV5NUT6A.js +7 -0
  146. package/dist/gui/dream-maker-RGHMRX3B.js +10 -0
  147. package/dist/gui/edge-R66O24VV.js +24 -0
  148. package/dist/gui/elixir-5LJ2OUDN.js +10 -0
  149. package/dist/gui/elm-UWVV5ID7.js +15 -0
  150. package/dist/gui/emacs-lisp-TAO5U74P.js +10 -0
  151. package/dist/gui/erb-VBZVG65V.js +35 -0
  152. package/dist/gui/erlang-NLTHURFZ.js +8 -0
  153. package/dist/gui/everforest-dark-JBR4GKJA.js +7 -0
  154. package/dist/gui/everforest-light-AIUWRSLR.js +7 -0
  155. package/dist/gui/fennel-U2PEW23D.js +10 -0
  156. package/dist/gui/fish-KA4MOTTR.js +10 -0
  157. package/dist/gui/fluent-TC32ABGF.js +10 -0
  158. package/dist/gui/fortran-fixed-form-HMHOKX2P.js +14 -0
  159. package/dist/gui/fortran-free-form-T5IDESEJ.js +7 -0
  160. package/dist/gui/fsharp-QTHVHR6A.js +8 -0
  161. package/dist/gui/gdresource-ANDGJRDE.js +18 -0
  162. package/dist/gui/gdscript-2MXOLWT4.js +7 -0
  163. package/dist/gui/gdshader-RPDJURLG.js +7 -0
  164. package/dist/gui/genie-KQGSIM6L.js +10 -0
  165. package/dist/gui/gherkin-UU7PIT6E.js +10 -0
  166. package/dist/gui/git-commit-2OSO66MB.js +8 -0
  167. package/dist/gui/git-rebase-QIB3QI3O.js +8 -0
  168. package/dist/gui/github-dark-H5MJU2XK.js +7 -0
  169. package/dist/gui/github-dark-default-VHJFG2UV.js +7 -0
  170. package/dist/gui/github-dark-dimmed-UMS2CKX4.js +7 -0
  171. package/dist/gui/github-dark-high-contrast-N7ADHDRY.js +7 -0
  172. package/dist/gui/github-light-L3SBY5N4.js +7 -0
  173. package/dist/gui/github-light-default-N7QH7CFJ.js +7 -0
  174. package/dist/gui/github-light-high-contrast-2RMTNJOX.js +7 -0
  175. package/dist/gui/gleam-MB2OP4K4.js +10 -0
  176. package/dist/gui/glimmer-js-YJIW2B6M.js +26 -0
  177. package/dist/gui/glimmer-ts-RBWTLTMH.js +26 -0
  178. package/dist/gui/glsl-F7QZR37K.js +8 -0
  179. package/dist/gui/gn-F5BIWANZ.js +10 -0
  180. package/dist/gui/gnuplot-5K7Z5OR2.js +10 -0
  181. package/dist/gui/go-C26CLWJG.js +7 -0
  182. package/dist/gui/graphql-LOUCQJXE.js +11 -0
  183. package/dist/gui/groovy-DVSWXLFJ.js +7 -0
  184. package/dist/gui/gruvbox-dark-hard-WCNUL35F.js +7 -0
  185. package/dist/gui/gruvbox-dark-medium-BELAJCDV.js +7 -0
  186. package/dist/gui/gruvbox-dark-soft-DA4S6ZCG.js +7 -0
  187. package/dist/gui/gruvbox-light-hard-G3DA2CVN.js +7 -0
  188. package/dist/gui/gruvbox-light-medium-XC4P77WY.js +7 -0
  189. package/dist/gui/gruvbox-light-soft-AXFRXVRJ.js +7 -0
  190. package/dist/gui/hack-7E22AMLX.js +20 -0
  191. package/dist/gui/haml-DLYDG7TX.js +9 -0
  192. package/dist/gui/handlebars-EXMYBU7Q.js +11 -0
  193. package/dist/gui/haskell-PZFDAWUI.js +10 -0
  194. package/dist/gui/haxe-VZSRFGDC.js +7 -0
  195. package/dist/gui/hcl-NAPQ56UJ.js +10 -0
  196. package/dist/gui/hjson-7YO44GAE.js +10 -0
  197. package/dist/gui/hlsl-P6H2KE4L.js +7 -0
  198. package/dist/gui/horizon-ABEUFKCJ.js +7 -0
  199. package/dist/gui/horizon-bright-4IF4JCRZ.js +7 -0
  200. package/dist/gui/houston-ACBQLVIG.js +7 -0
  201. package/dist/gui/html-37GWH2QE.js +9 -0
  202. package/dist/gui/html-derivative-TSWK6LSQ.js +10 -0
  203. package/dist/gui/http-MBDMTHEC.js +31 -0
  204. package/dist/gui/hurl-WAATKOCB.js +27 -0
  205. package/dist/gui/hxml-LG2R5CDK.js +14 -0
  206. package/dist/gui/hy-4MDQ72ZR.js +10 -0
  207. package/dist/gui/imba-AMDQ2OVM.js +10 -0
  208. package/dist/gui/ini-BSRRTTCB.js +7 -0
  209. package/dist/gui/java-VPDWWQCN.js +7 -0
  210. package/dist/gui/javascript-YSK6TDHD.js +7 -0
  211. package/dist/gui/jinja-PJIERUUD.js +23 -0
  212. package/dist/gui/jison-6R6YZ4D3.js +14 -0
  213. package/dist/gui/json-CDBUD4K4.js +7 -0
  214. package/dist/gui/json5-GQ5EPJPN.js +10 -0
  215. package/dist/gui/jsonc-EUK6K7BC.js +7 -0
  216. package/dist/gui/jsonl-AZZ6LVAP.js +10 -0
  217. package/dist/gui/jsonnet-TG4672OU.js +10 -0
  218. package/dist/gui/jssm-POLM2BGU.js +10 -0
  219. package/dist/gui/jsx-HNQJHG7G.js +7 -0
  220. package/dist/gui/julia-EQ4JLFSR.js +15 -0
  221. package/dist/gui/just-3SVPXB4P.js +49 -0
  222. package/dist/gui/kanagawa-dragon-4QPQEBJF.js +7 -0
  223. package/dist/gui/kanagawa-lotus-E2SVDYBP.js +7 -0
  224. package/dist/gui/kanagawa-wave-ZAYNGKIP.js +7 -0
  225. package/dist/gui/kdl-GX2QLRI3.js +10 -0
  226. package/dist/gui/kotlin-GKENNT4G.js +10 -0
  227. package/dist/gui/kusto-YE5J7WH7.js +10 -0
  228. package/dist/gui/laserwave-FEC67QFP.js +7 -0
  229. package/dist/gui/latex-AULDPOF3.js +9 -0
  230. package/dist/gui/lean-WU3KGKFX.js +10 -0
  231. package/dist/gui/less-G3PHK6XJ.js +7 -0
  232. package/dist/gui/light-plus-IWZ7H7K5.js +7 -0
  233. package/dist/gui/liquid-GRGQYWEM.js +26 -0
  234. package/dist/gui/llvm-GZMF4RGX.js +10 -0
  235. package/dist/gui/log-IVFPTJO5.js +7 -0
  236. package/dist/gui/logo-QKNO4KB4.js +10 -0
  237. package/dist/gui/lua-2SFYRRVQ.js +8 -0
  238. package/dist/gui/luau-7LGUQMID.js +10 -0
  239. package/dist/gui/main.js +32294 -5232
  240. package/dist/gui/make-6IBN4RHX.js +7 -0
  241. package/dist/gui/markdown-RGBXB5KM.js +7 -0
  242. package/dist/gui/marko-6ENW4ITK.js +26 -0
  243. package/dist/gui/material-theme-JOKMNPZD.js +7 -0
  244. package/dist/gui/material-theme-darker-7MTKLCCM.js +7 -0
  245. package/dist/gui/material-theme-lighter-VOBCBDGF.js +7 -0
  246. package/dist/gui/material-theme-ocean-HIZIQ6ZI.js +7 -0
  247. package/dist/gui/material-theme-palenight-MDKGMWOS.js +7 -0
  248. package/dist/gui/matlab-NVRQWPT4.js +10 -0
  249. package/dist/gui/mdc-3KJ5Z26I.js +25 -0
  250. package/dist/gui/mdx-TUFOPE2U.js +10 -0
  251. package/dist/gui/mermaid-2ELHPTEI.js +10 -0
  252. package/dist/gui/min-dark-H6FRUPEW.js +7 -0
  253. package/dist/gui/min-light-AAKNJKN7.js +7 -0
  254. package/dist/gui/mipsasm-CMTR7652.js +10 -0
  255. package/dist/gui/mojo-QON2ZHI5.js +10 -0
  256. package/dist/gui/monokai-4IQYQQA3.js +7 -0
  257. package/dist/gui/moonbit-YXIFXWNL.js +10 -0
  258. package/dist/gui/move-5AVESP7D.js +10 -0
  259. package/dist/gui/narrat-P67ZRVLF.js +10 -0
  260. package/dist/gui/nextflow-IA3AKAOV.js +14 -0
  261. package/dist/gui/nextflow-groovy-3TZGSHZN.js +7 -0
  262. package/dist/gui/nginx-A674IMF2.js +15 -0
  263. package/dist/gui/night-owl-YKMG5AEG.js +7 -0
  264. package/dist/gui/night-owl-light-FK52JHEJ.js +7 -0
  265. package/dist/gui/nim-TNAHEHQE.js +15 -0
  266. package/dist/gui/nix-PKII6ZAX.js +17 -0
  267. package/dist/gui/nord-UMPZ4MDR.js +7 -0
  268. package/dist/gui/nsis-RLNIMWJ4.js +10 -0
  269. package/dist/gui/nushell-XCKRAB5V.js +10 -0
  270. package/dist/gui/objective-c-VW6IYVZR.js +7 -0
  271. package/dist/gui/objective-cpp-A6HOVYIZ.js +10 -0
  272. package/dist/gui/ocaml-LEW2N47R.js +7 -0
  273. package/dist/gui/odin-ZYNZP2Z7.js +10 -0
  274. package/dist/gui/one-dark-pro-7ZD2R4C3.js +7 -0
  275. package/dist/gui/one-light-S6GW5JPC.js +7 -0
  276. package/dist/gui/openscad-S55J35RH.js +10 -0
  277. package/dist/gui/org-HWNUVJ3K.js +203 -0
  278. package/dist/gui/pascal-PQJYR7AK.js +10 -0
  279. package/dist/gui/perl-NRCSCL2T.js +13 -0
  280. package/dist/gui/php-7FKD7NQ6.js +14 -0
  281. package/dist/gui/pierre-dark-2VX7FTVH.js +7 -0
  282. package/dist/gui/pierre-dark-protanopia-deuteranopia-IWPDHMFY.js +7 -0
  283. package/dist/gui/pierre-dark-soft-PBZEND7C.js +7 -0
  284. package/dist/gui/pierre-dark-tritanopia-H4RGFNEU.js +7 -0
  285. package/dist/gui/pierre-dark-vibrant-74HELCEP.js +7 -0
  286. package/dist/gui/pierre-light-2CTJ4CSM.js +7 -0
  287. package/dist/gui/pierre-light-protanopia-deuteranopia-SGQCEX2P.js +7 -0
  288. package/dist/gui/pierre-light-soft-FSLVXWQU.js +7 -0
  289. package/dist/gui/pierre-light-tritanopia-YDWTX7OC.js +7 -0
  290. package/dist/gui/pierre-light-vibrant-CBHQI6SK.js +7 -0
  291. package/dist/gui/pkl-BBS5JDCX.js +10 -0
  292. package/dist/gui/plastic-24BUHBC6.js +7 -0
  293. package/dist/gui/plsql-WTYXI2RI.js +10 -0
  294. package/dist/gui/po-GLVRZSLC.js +10 -0
  295. package/dist/gui/poimandres-6BCLQCCV.js +7 -0
  296. package/dist/gui/polar-HQ7LUSDG.js +10 -0
  297. package/dist/gui/postcss-5ILUXDAM.js +7 -0
  298. package/dist/gui/powerquery-T2DA4K5Q.js +10 -0
  299. package/dist/gui/powershell-YAEHZVQU.js +7 -0
  300. package/dist/gui/prisma-UYCP5C7X.js +10 -0
  301. package/dist/gui/prolog-JLW5JO7Q.js +10 -0
  302. package/dist/gui/proto-XPAGGVMR.js +10 -0
  303. package/dist/gui/pug-4D7KLPNZ.js +10 -0
  304. package/dist/gui/puppet-CAH3DWTQ.js +10 -0
  305. package/dist/gui/purescript-TY5CZSBG.js +10 -0
  306. package/dist/gui/python-AJWUUEXZ.js +7 -0
  307. package/dist/gui/qml-3P7XGIWB.js +14 -0
  308. package/dist/gui/qmldir-MU3RYVKI.js +10 -0
  309. package/dist/gui/qss-GQ3SQE63.js +10 -0
  310. package/dist/gui/r-MZS2GKC3.js +7 -0
  311. package/dist/gui/racket-EJOVFY7Q.js +10 -0
  312. package/dist/gui/raku-N7M6AP4Z.js +7 -0
  313. package/dist/gui/razor-XMDVCJ7X.js +20 -0
  314. package/dist/gui/rbs-3XJPBJS3.js +10 -0
  315. package/dist/gui/red-DQ454N4M.js +7 -0
  316. package/dist/gui/reg-FCSLOXMU.js +10 -0
  317. package/dist/gui/regexp-OU4NYHVA.js +7 -0
  318. package/dist/gui/rel-GPRT753E.js +10 -0
  319. package/dist/gui/riscv-IO6X3OUS.js +10 -0
  320. package/dist/gui/ron-LAUU7JCT.js +10 -0
  321. package/dist/gui/rose-pine-FGMQPAXN.js +7 -0
  322. package/dist/gui/rose-pine-dawn-XZHKMJMS.js +7 -0
  323. package/dist/gui/rose-pine-moon-44RDFYAS.js +7 -0
  324. package/dist/gui/rosmsg-HKG52NBT.js +10 -0
  325. package/dist/gui/rst-PIASADIQ.js +56 -0
  326. package/dist/gui/ruby-Z6MF5JYI.js +25 -0
  327. package/dist/gui/rust-C45CB5ZB.js +7 -0
  328. package/dist/gui/sas-EOAR3TJ3.js +14 -0
  329. package/dist/gui/sass-KEOLMOQJ.js +10 -0
  330. package/dist/gui/scala-O3LM5FKD.js +7 -0
  331. package/dist/gui/scheme-NGQ2H462.js +10 -0
  332. package/dist/gui/scss-WAYO2YAL.js +8 -0
  333. package/dist/gui/sdbl-G5J5BQHJ.js +7 -0
  334. package/dist/gui/shaderlab-XU7645J6.js +14 -0
  335. package/dist/gui/shellscript-QPJOW65X.js +7 -0
  336. package/dist/gui/shellsession-LCJMCYFU.js +14 -0
  337. package/dist/gui/slack-dark-VD234CKF.js +7 -0
  338. package/dist/gui/slack-ochin-QY7RWW52.js +7 -0
  339. package/dist/gui/smalltalk-LMQWJTYB.js +10 -0
  340. package/dist/gui/smithy-XKBQ5TXG.js +10 -0
  341. package/dist/gui/snazzy-light-7DJMADZF.js +7 -0
  342. package/dist/gui/solarized-dark-PXF6MHWO.js +7 -0
  343. package/dist/gui/solarized-light-XQPVPM7L.js +7 -0
  344. package/dist/gui/solidity-67AFBEYM.js +10 -0
  345. package/dist/gui/soy-C25UWDWI.js +16 -0
  346. package/dist/gui/sparql-GG32TI6Q.js +14 -0
  347. package/dist/gui/splunk-Q7OG3S6M.js +10 -0
  348. package/dist/gui/sql-6F3HA23R.js +7 -0
  349. package/dist/gui/ssh-config-EK5IZW3T.js +10 -0
  350. package/dist/gui/stata-54FRWEK5.js +14 -0
  351. package/dist/gui/stylus-TKKFQVIW.js +7 -0
  352. package/dist/gui/surrealql-2O6L6FVR.js +14 -0
  353. package/dist/gui/svelte-RQW3BSQN.js +26 -0
  354. package/dist/gui/swift-XM6BATYX.js +7 -0
  355. package/dist/gui/synthwave-84-T7XO3VP6.js +7 -0
  356. package/dist/gui/system-verilog-5A7OWIS7.js +7 -0
  357. package/dist/gui/systemd-YG2GIELU.js +10 -0
  358. package/dist/gui/talonscript-PIYOSW4G.js +10 -0
  359. package/dist/gui/tasl-LSN6MJU3.js +10 -0
  360. package/dist/gui/tcl-QL7GI7GB.js +10 -0
  361. package/dist/gui/templ-LLH4QDAT.js +22 -0
  362. package/dist/gui/terraform-7ESBXUP7.js +10 -0
  363. package/dist/gui/tex-X4LXVCV7.js +8 -0
  364. package/dist/gui/tokyo-night-FBILIEZB.js +7 -0
  365. package/dist/gui/toml-ZPLDESJA.js +10 -0
  366. package/dist/gui/ts-tags-HZGRWBOR.js +81 -0
  367. package/dist/gui/tsv-DFQOAT3Y.js +10 -0
  368. package/dist/gui/tsx-HKUFCS2K.js +7 -0
  369. package/dist/gui/turtle-JNLUZA5M.js +7 -0
  370. package/dist/gui/twig-OEKA6N6I.js +30 -0
  371. package/dist/gui/typescript-TJKT3IXK.js +7 -0
  372. package/dist/gui/typespec-LYVFB2R5.js +10 -0
  373. package/dist/gui/typst-NRT4OQOK.js +243 -0
  374. package/dist/gui/v-Y4OWOLQI.js +10 -0
  375. package/dist/gui/vala-MD66CNI7.js +10 -0
  376. package/dist/gui/vb-CPQUJ3PO.js +7 -0
  377. package/dist/gui/verilog-ECIZCOEU.js +7 -0
  378. package/dist/gui/vesper-JUVJQUCS.js +7 -0
  379. package/dist/gui/vhdl-QJIATVDS.js +10 -0
  380. package/dist/gui/viml-SAWLYNSC.js +10 -0
  381. package/dist/gui/vitesse-black-44DSWBPL.js +7 -0
  382. package/dist/gui/vitesse-dark-ZB4X3SXC.js +7 -0
  383. package/dist/gui/vitesse-light-T4PKXN2B.js +7 -0
  384. package/dist/gui/vue-YZTXYZUC.js +63 -0
  385. package/dist/gui/vue-html-3OB5SOZU.js +14 -0
  386. package/dist/gui/vue-vine-ZQNB45F6.js +34 -0
  387. package/dist/gui/vyper-545OELAD.js +10 -0
  388. package/dist/gui/wasm-6SXLSWDK.js +13 -0
  389. package/dist/gui/wasm-UNG3ITYZ.js +10 -0
  390. package/dist/gui/wenyan-6MAMINLZ.js +10 -0
  391. package/dist/gui/wgsl-GTGWOC2E.js +10 -0
  392. package/dist/gui/wikitext-X3KHSBD4.js +10 -0
  393. package/dist/gui/wit-RN2FK5B5.js +10 -0
  394. package/dist/gui/wolfram-X3KENW2V.js +10 -0
  395. package/dist/gui/xml-Y333D7KT.js +8 -0
  396. package/dist/gui/xsl-ZBX7NBWE.js +9 -0
  397. package/dist/gui/yaml-HXOTARZF.js +7 -0
  398. package/dist/gui/zenscript-UJ7J7IFX.js +10 -0
  399. package/dist/gui/zig-6J4JS6G3.js +7 -0
  400. package/dist/index.js +71 -56
  401. package/dist/mcp.js +57 -46
  402. package/package.json +8 -4
  403. package/readme.md +40 -15
package/dist/mcp.js CHANGED
@@ -1,58 +1,69 @@
1
1
  #!/usr/bin/env node
2
- var zu=Object.defineProperty;var y=(e,t)=>()=>(e&&(t=e(e=0)),t);var _i=(e,t)=>{for(var n in t)zu(e,n,{get:t[n],enumerable:!0})};var Pt,i,c,a,bt,A=y(()=>{"use strict";Pt={Success:"success",Fail:"fail"},i=e=>({status:Pt.Fail,message:e,value:null}),c=(e,t)=>({status:Pt.Success,message:e,value:t}),a=e=>e.status==="fail",bt=e=>e.status==="success"});var Do,$e,st=y(()=>{"use strict";A();Do="removed",$e=(e,t)=>{let n=e.find(o=>o.context===t);return n!==void 0?c("Found node",n):i("Unable to find node in breadcrumb")}});function rs(e){return e.context===D.WORKSPACE}function L(e){return e.context===D.TICKET}function $i(e){return e.context===D.TEXT}function je(e){return e.context===D.FIELD}function Vn(e){return e.context===D.FIELD_LIST}var D,Zt,Fo,Kn,ie=y(()=>{"use strict";D={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT",COMMENT:"COMMENT"};Zt=e=>e.context===D.SWIMLANE,Fo=e=>e.context===D.BOARD,Kn=e=>e.context===D.COMMENT});var f,ne=y(()=>{"use strict";f={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"cmd-line",PALETTE:"palette"}});var ji=y(()=>{"use strict";en()});function Oo(e,t){let n=Math.min(e.length,t.length),o=0;for(;o<n&&e[o]===t[o];)o++;return o}var It,Ge,Dt=y(()=>{"use strict";It=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",Ge=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim()});var Wi,Hi,Vi=y(()=>{"use strict";Wi=e=>{let t=new Map;for(let n of e)for(let o=1;o<=n.length;o++){let r=n.slice(0,o),s=t.get(r);s?s.push(n):t.set(r,[n])}return t},Hi=(e,t)=>t?e.get(t)??[]:[]});var Ki,Yu,qi,Gi=y(()=>{"use strict";Dt();Vi();Ki=new WeakMap,Yu=e=>{let t=Ki.get(e);return t||(t=Wi(e),Ki.set(e,t)),t},qi=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let o=t.toLowerCase();return Hi(Yu(e),o).filter(s=>Oo(o,s)>=n)}});var Xu,zi,Ju,Yi=y(()=>{"use strict";Dt();Gi();Xu={hint:"",hints:[],overlap:0,remainder:""},zi=({inputToMatch:e,lastWord:t,isLastWordCompleted:n},o)=>{if(n||e==="")return Xu;let r=qi({wordList:o,inputToMatch:e,overlapThreshold:1});return Ju(t,r)},Ju=(e,t)=>{let n=t[0]??"",o=Oo(e.toLowerCase(),n.toLowerCase()),[r,s]=n.split(":"),d=o<(r??"").length,l=!!s,p=(l&&d?r:n)+(l&&d?":":" "),v=p.slice(o);return{hint:p,hints:t,overlap:o,remainder:v}}});import{useSyncExternalStore as ch}from"react";var Bo,Qu,Zu,ae,ze,ke=y(()=>{"use strict";Bo={logLevel:"info",autoSyncIntervalMs:null,attachmentMaxKb:null,autoSync:null,preferredEditor:null,userName:null,userId:null,viewMode:null},Qu=new Set,Zu=()=>{for(let e of Qu)e()},ae=()=>Bo,ze=e=>(Bo={...Bo,...e},Zu(),Bo)});function Xi(e){return!e||!tm.test(e)?i(`Invalid hex rank: ${e}`):c("Converted rank to bigint",BigInt("0x"+e))}function We(e,t=En){if(e<0n)return i("Negative rank not allowed");let n=e.toString(16);return c("Converted bigint to hex rank",n.padStart(Number(t),"0"))}function Pe(e,t){if(!e&&!t)return We(Je/2n,En);let n=e?Xi(e):c("Resolved lower bound",0n);if(a(n))return n;let o=t?Xi(t):c("Resolved upper bound",Je);if(a(o))return o;let r=n.value,s=o.value;if(s<=r)return We(Je/2n,En);let d=(r+s)/2n;return d===r||d===s?i("No rank space available between neighbors"):We(d,En)}function Ji(e){if(e<=0)return c("Resolved empty rank list",[]);let t=BigInt(e),n=[];for(let o=0;o<e;o++){let r=Je*BigInt(o+1)/(t+1n),s=We(r,En);if(a(s))return s;n.push(s.value)}return c("Resolved evenly spaced ranks",n)}var En,em,Je,tm,Nn=y(()=>{"use strict";A();En=24n,em=En*4n,Je=(1n<<em)-1n,tm=/^[0-9a-f]+$/});import{ulid as nm}from"ulid";var ss,Qi=y(()=>{"use strict";A();it();Nn();ss=(e,t)=>{let n=oe(e),o=Ji(n.length);if(a(o))return o;let r={};for(let s=0;s<n.length;s++){let d=n[s],l=o.value[s];if(!d||!l)return i("Unable to assign rebalance rank");r[d.id]=l}return c("Created rebalance event",{id:nm(),action:"rebalance.children",payload:{parent:e,ranks:r},...t})}});import qn from"node:fs";import{ulid as om}from"ulid";import{z as Uo}from"zod";var rm,sm,_o,xt,Zi,ea,Ft=y(()=>{"use strict";A();me();rm="__epiq_state__",sm=Uo.object({projectId:Uo.string().min(1),stateBranch:Uo.string().min(1),createdAt:Uo.iso.datetime()}),_o=()=>({projectId:om(),stateBranch:rm,createdAt:new Date().toISOString()}),xt=e=>{let t=$o(e);if(!qn.existsSync(t))return i("Missing .epiq/project.json");try{let n=qn.readFileSync(t,"utf8"),o=JSON.parse(n),r=sm.safeParse(o);return r.success?c("Read project.json",r.data):i(`Invalid .epiq/project.json: ${r.error.issues.map(s=>`${s.path.join(".")}: ${s.message}`).join(", ")}`)}catch(n){return i(n instanceof Error?`Failed to read .epiq/project.json: ${n.message}`:"Failed to read .epiq/project.json")}},Zi=e=>{let t=xt(e);return a(t)?i(t.message):c("Read projectId",t.value.projectId)},ea=({repoRoot:e,fileContents:t})=>{let n=Gn(e),o=$o(e);try{if(qn.mkdirSync(n,{recursive:!0}),qn.existsSync(o)){let r=xt(e);return a(r)?i(r.message):c("Project already initialized",null)}return qn.writeFileSync(o,JSON.stringify(t,null,2)+`
3
- `,"utf8"),c("Created project.json",null)}catch(r){return i(r instanceof Error?`Failed to initialize project: ${r.message}`:"Failed to initialize project")}}});import im from"node:os";import am from"node:path";var Qe,zn,is=y(()=>{"use strict";Qe=".epiq-global",zn=()=>process.env.EPIQ_GLOBAL_DIR??am.join(im.homedir(),Qe)});var as,ta=y(()=>{"use strict";A();as=(e,t)=>{let n=new Map,o=t??((...s)=>JSON.stringify(s)),r=((...s)=>{let d=o(...s);if(!n.has(d)){let l=e(...s).then(u=>(a(u)&&n.delete(d),u));n.set(d,l)}return n.get(d)});return r.clear=()=>n.clear(),r}});var he,jo=y(()=>{"use strict";Ot();he={stage:({cwd:e,pathspec:t})=>_({args:["add",...t],cwd:e}),commit:({cwd:e,message:t,allowEmpty:n=!1,pathspec:o})=>_({args:["commit",...n?["--allow-empty"]:[],"-m",t,...o?.length?["--",...o]:[]],cwd:e}),fetch:({cwd:e,remote:t,branch:n})=>_({args:["fetch",t,n],cwd:e}),pullRebase:({cwd:e,remote:t,branch:n})=>_({args:["-c","rebase.autoStash=true","pull","--rebase",t,n],cwd:e}),checkout:({cwd:e,branch:t})=>_({args:["checkout",t],cwd:e}),push:({cwd:e,remote:t,branch:n,setUpstream:o=!1})=>{let r=t&&n?["push",...o?["-u"]:[],t,n]:["push"];return _({args:r,cwd:e})},setUpstream:({cwd:e,branch:t,upstream:n})=>_({args:["branch","--set-upstream-to",n,t],cwd:e}),worktreeAdd:({cwd:e,worktreeRoot:t,branch:n})=>_({args:["worktree","add",t,n],cwd:e}),worktreeRemove:({cwd:e,worktreeRoot:t})=>_({args:["worktree","remove","--force",t],cwd:e}),worktreePrune:({cwd:e})=>_({args:["worktree","prune"],cwd:e})}});var Rn,Ze,Wo=y(()=>{"use strict";Ft();A();me();Rn=e=>{let t=et(e);if(a(t))return i("Unable to resolve epiq project root");let n=xt(t.value);return a(n)?i("Unable to read project.json"):c("Resolved state branch",n.value.stateBranch)},Ze="origin"});import{spawn as dm}from"node:child_process";import Ho from"node:fs";import Yn from"node:path";var na,cm,ra,_,tt,Cn,lm,um,Vo,ds,cs,Ko,Xn,sa,ls,qo,ia,aa,mm,oa,us,pm,ms,da,ca,la,Ot=y(()=>{"use strict";A();jo();Wo();na=1e4,cm={...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:"echo",GIT_SSH_COMMAND:process.env.GIT_SSH_COMMAND??"ssh -o BatchMode=yes -o ConnectTimeout=10"},ra=({args:e,cwd:t,allowFail:n})=>new Promise(o=>{if(!Ho.existsSync(t)){let p=`Git cwd does not exist: ${t}`;if(n){o({stdout:"",stderr:p,exitCode:1});return}o(i(p));return}let r=dm("git",e,{cwd:t,stdio:["ignore","pipe","pipe"],env:cm}),s=!1,d="",l="",u=p=>{s||(s=!0,clearTimeout(m),o(p))},m=setTimeout(()=>{r.kill("SIGTERM");let p=[`git ${e.join(" ")}`,`cwd=${t}`,`Git command timed out after ${na}ms`].join(`
4
- `);u(n?{stdout:d,stderr:p,exitCode:124}:i(p))},na);r.stdout.setEncoding("utf8"),r.stderr.setEncoding("utf8"),r.stdout.on("data",p=>{d+=p}),r.stderr.on("data",p=>{l+=p}),r.on("error",p=>{if(n){u({stdout:d,stderr:p.message,exitCode:1});return}u(i([`git ${e.join(" ")}`,`cwd=${t}`,p.message].join(`
5
- `)))}),r.on("close",p=>{let v=p??1;if(n){u({stdout:d,stderr:l,exitCode:v});return}if(v!==0){u(i([`git ${e.join(" ")}`,l.trim()||d.trim()||"Git command failed"].filter(Boolean).join(`
6
- `)));return}u(c("Git command succeeded",{stdout:d,stderr:l,exitCode:v}))})}),_=({args:e,cwd:t})=>ra({args:e,cwd:t,allowFail:!1}),tt=({args:e,cwd:t})=>ra({args:e,cwd:t,allowFail:!0}),Cn=async({cwd:e,message:t,pathspec:n})=>{let o=await he.commit({cwd:e,message:t,pathspec:n});if(a(o))return i(`Failed to create commit
7
- ${o.message}`);let r=await _({args:["rev-parse","HEAD"],cwd:e});return a(r)?i(`Commit created, but failed to read HEAD SHA
8
- ${r.message}`):c("Created commit and resolved SHA",r.value.stdout.trim())},lm=async e=>{let t=await _({cwd:e,args:["rev-parse","--git-dir"]});if(a(t))return i(t.message);let n=t.value.stdout.trim();return c("Resolved git dir",Yn.isAbsolute(n)?n:Yn.resolve(e,n))},um=async e=>{let t=await lm(e);if(a(t))return i(t.message);let n=t.value,o={MERGE_HEAD:"merge in progress"};for(let[s,d]of Object.entries(o))if(Ho.existsSync(Yn.join(n,s)))return c("Checked for in-progress Git operation",d);let r={"rebase-merge":"rebase in progress","rebase-apply":"rebase in progress"};for(let[s,d]of Object.entries(r))if(Ho.existsSync(Yn.join(n,s)))return c("Checked for in-progress Git operation",d);return c("Checked for in-progress Git operation",null)},Vo=async e=>{let t=await um(e);return a(t)?i(t.message):c("Checked for in-progress Git operation",t.value!==null)},ds=async({repoRoot:e})=>{let n=(await tt({args:["remote","get-url",Ze],cwd:e})).exitCode===0;return c(`Checked remote ${n}`,n)},cs=async({repoRoot:e,branch:t})=>{let n=await tt({args:["ls-remote","--heads",Ze,t],cwd:e});return n.exitCode!==0?i(n.stderr.trim()||`Unable to inspect remote branch ${Ze}/${t}`):c("Checked remote branch",n.stdout.trim().length>0)},Ko=async({repoRoot:e,branch:t})=>{let n=await tt({args:["show-ref","--verify","--quiet",`refs/heads/${t}`],cwd:e});return n.exitCode===0?c("Local branch exists",!0):n.exitCode===1?c("Local branch missing",!1):i(n.stderr.trim()||`Unable to inspect branch ${t}`)},Xn=e=>{try{return Ho.realpathSync.native(e)}catch{return Yn.resolve(e)}},sa=async({repoRoot:e,worktreeRoot:t})=>{let n=await _({args:["worktree","list","--porcelain"],cwd:e});if(a(n))return i(n.message);let o=Xn(t),r=n.value.stdout.split(`
9
- `).filter(s=>s.startsWith("worktree ")).map(s=>s.slice(9)).map(Xn).includes(o);return c("Checked worktree registration",r)},ls=async e=>{let t=await tt({args:["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],cwd:e});return c("Checked upstream",t.exitCode===0&&t.stdout.trim().length>0)},qo=async e=>{let t=await _({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return a(t)?i(t.message):c("Resolved current branch",t.value.stdout.trim())},ia=async e=>{let t=await _({args:["rev-parse","--short","HEAD"],cwd:e});return a(t)?i(t.message):c("Resolved short HEAD sha",t.value.stdout.trim())},aa=e=>e.includes("fetch first")||e.includes("non-fast-forward"),mm=async e=>(await tt({cwd:e,args:["rebase","--abort"]})).exitCode===0?c("Aborted stale rebase",!0):c("No rebase to abort",!1),oa=async e=>{let t=await tt({args:["rev-parse","HEAD"],cwd:e});return t.exitCode===0?t.stdout.trim():null},us=e=>/could not resolve host/i.test(e)||/connection refused|connection timed out|operation timed out/i.test(e)||/network is unreachable|no route to host/i.test(e)||/failed to connect to/i.test(e)||/git command timed out after/i.test(e),pm=e=>e.includes("couldn't find remote ref")||e.includes("Could not find remote branch"),ms=async({cwd:e,branch:t})=>{let n=await mm(e);if(a(n))return i(n.message);let o=await oa(e),r=await he.pullRebase({cwd:e,remote:Ze,branch:t});if(a(r))return pm(r.message)?c("Remote branch missing, skipped pull",!1):i(`Failed during pull --rebase
10
- ${r.message}`);let s=await oa(e),d=o!==null&&s!==null&&o!==s;return c(d?"Pulled with rebase":"Already up to date",d)},da=async e=>{let t=await tt({args:["rev-list","--count","@{u}..HEAD"],cwd:e});return t.exitCode!==0?c("No upstream to compare against",!1):c("Compared against upstream",Number(t.stdout.trim())>0)},ca=async(e,t)=>{let n=await tt({args:["diff","--cached","--quiet",...t?.length?["--",...t]:[]],cwd:e});return n.exitCode===0?c("No staged changes",!1):n.exitCode===1?c("Has staged changes",!0):i(n.stderr.trim()||"Unable to inspect staged changes")},la=async e=>{let t=await qo(e);return a(t)?i(t.message):c("Checked detached HEAD state",t.value==="HEAD")}});import Jn from"node:fs";import at from"node:path";var ma,pa,ga,fa,Go,De,gm,ua,Qn,zo,va,ha,ya,dt,ry,ct=y(()=>{"use strict";Ft();A();is();me();ta();Bt();Ot();ma="4b825dc642cb6eb9a060e54bf8d69288fbee4904",pa=e=>at.join(lt,Yo,e),ga=()=>at.join(lt,ps),fa=zn,Go=()=>at.join(fa(),"worktrees"),De=({repoRoot:e})=>{let t=Zi(e);return a(t)?i(t.message):c("Resolved state branch root",at.join(Go(),t.value))},gm=e=>at.join(e,lt),ua=e=>at.join(gm(e),Yo),Qn=e=>{try{return Jn.mkdirSync(e,{recursive:!0}),c("Ensured directory",void 0)}catch(t){return i(t instanceof Error?t.message:String(t))}},zo=()=>{let e=fa(),t=Go(),n=!Jn.existsSync(e)||!Jn.existsSync(t),o=Qn(e);if(a(o))return i(`Ensure epiq home failed.
11
- `+o.message);let r=Qn(t);return a(r)?i(`Ensure worktrees dir failed.
12
- `+r.message):c("Ensured epiq storage",n)},va=e=>{Jn.existsSync(e)&&(J.debug("[sync] remove path",e),Jn.rmSync(e,{recursive:!0,force:!0}))},ha=(e,t)=>{for(let n of[ua(e),ua(t)]){let o=Qn(n);if(a(o))return i(o.message)}return c("Ensured state branch",void 0)},ya=async e=>{let t=await _({args:["ls-tree","--name-only","HEAD"],cwd:e});if(a(t))return i(`ensure state branch is storage only failed
2
+ var Mp=Object.defineProperty;var y=(e,t)=>()=>(e&&(t=e(e=0)),t);var Pa=(e,t)=>{for(var n in t)Mp(e,n,{get:t[n],enumerable:!0})};var jt,i,c,a,Ct,A=y(()=>{"use strict";jt={Success:"success",Fail:"fail"},i=e=>({status:jt.Fail,message:e,value:null}),c=(e,t)=>({status:jt.Success,message:e,value:t}),a=e=>e.status==="fail",Ct=e=>e.status==="success"});var ir,qe,gt=y(()=>{"use strict";A();ir="removed",qe=(e,t)=>{let n=e.find(o=>o.context===t);return n!==void 0?c("Found node",n):i("Unable to find node in breadcrumb")}});function Fs(e){return e.context===F.WORKSPACE}function k(e){return e.context===F.TICKET}function Da(e){return e.context===F.TEXT}function Ve(e){return e.context===F.FIELD}function ro(e){return e.context===F.FIELD_LIST}var F,ln,ar,so,pe=y(()=>{"use strict";F={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT",COMMENT:"COMMENT"};ln=e=>e.context===F.SWIMLANE,ar=e=>e.context===F.BOARD,so=e=>e.context===F.COMMENT});var h,de=y(()=>{"use strict";h={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"cmd-line",PALETTE:"palette"}});var Fa=y(()=>{"use strict";un()});function dr(e,t){let n=Math.min(e.length,t.length),o=0;for(;o<n&&e[o]===t[o];)o++;return o}var ft,Be,Ht=y(()=>{"use strict";ft=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",Be=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim()});var Ba,Oa,_a=y(()=>{"use strict";Ba=e=>{let t=new Map;for(let n of e)for(let o=1;o<=n.length;o++){let r=n.slice(0,o),s=t.get(r);s?s.push(n):t.set(r,[n])}return t},Oa=(e,t)=>t?e.get(t)??[]:[]});var Ua,kp,$a,ja=y(()=>{"use strict";Ht();_a();Ua=new WeakMap,kp=e=>{let t=Ua.get(e);return t||(t=Ba(e),Ua.set(e,t)),t},$a=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let o=t.toLowerCase();return Oa(kp(e),o).filter(s=>dr(o,s)>=n)}});var Lp,Ha,Pp,Wa=y(()=>{"use strict";Ht();ja();Lp={hint:"",hints:[],overlap:0,remainder:""},Ha=({inputToMatch:e,lastWord:t,isLastWordCompleted:n},o)=>{if(n||e==="")return Lp;let r=$a({wordList:o,inputToMatch:e,overlapThreshold:1});return Pp(t,r)},Pp=(e,t)=>{let n=t[0]??"",o=dr(e.toLowerCase(),n.toLowerCase()),[r,s]=n.split(":"),d=o<(r??"").length,l=!!s,p=(l&&d?r:n)+(l&&d?":":" "),f=p.slice(o);return{hint:p,hints:t,overlap:o,remainder:f}}});import{useSyncExternalStore as ub}from"react";var cr,Dp,Fp,ye,Ze,Oe=y(()=>{"use strict";cr={logLevel:"info",autoSyncIntervalMs:null,attachmentMaxKb:null,autoSync:null,preferredEditor:null,userName:null,userId:null,viewMode:null},Dp=new Set,Fp=()=>{for(let e of Dp)e()},ye=()=>cr,Ze=e=>(cr={...cr,...e},Fp(),cr)});function Ga(e){return!e||!Op.test(e)?i(`Invalid hex rank: ${e}`):c("Converted rank to bigint",BigInt("0x"+e))}function Ke(e,t=Fn){if(e<0n)return i("Negative rank not allowed");let n=e.toString(16);return c("Converted bigint to hex rank",n.padStart(Number(t),"0"))}function _e(e,t){if(!e&&!t)return Ke(st/2n,Fn);let n=e?Ga(e):c("Resolved lower bound",0n);if(a(n))return n;let o=t?Ga(t):c("Resolved upper bound",st);if(a(o))return o;let r=n.value,s=o.value;if(s<=r)return Ke(st/2n,Fn);let d=(r+s)/2n;return d===r||d===s?i("No rank space available between neighbors"):Ke(d,Fn)}function qa(e){if(e<=0)return c("Resolved empty rank list",[]);let t=BigInt(e),n=[];for(let o=0;o<e;o++){let r=st*BigInt(o+1)/(t+1n),s=Ke(r,Fn);if(a(s))return s;n.push(s.value)}return c("Resolved evenly spaced ranks",n)}var Fn,Bp,st,Op,Bn=y(()=>{"use strict";A();Fn=24n,Bp=Fn*4n,st=(1n<<Bp)-1n,Op=/^[0-9a-f]+$/});import{ulid as _p}from"ulid";var Bs,Va=y(()=>{"use strict";A();ht();Bn();Bs=(e,t)=>{let n=ce(e),o=qa(n.length);if(a(o))return o;let r={};for(let s=0;s<n.length;s++){let d=n[s],l=o.value[s];if(!d||!l)return i("Unable to assign rebalance rank");r[d.id]=l}return c("Created rebalance event",{id:_p(),action:"rebalance.children",payload:{parent:e,ranks:r},...t})}});import io from"node:fs";import{ulid as Up}from"ulid";import{z as lr}from"zod";var $p,jp,ur,At,ao,Ka,Tt=y(()=>{"use strict";A();le();$p="__epiq_state__",jp=lr.object({projectId:lr.string().min(1),stateBranch:lr.string().min(1),createdAt:lr.iso.datetime()}),ur=()=>({projectId:Up(),stateBranch:$p,createdAt:new Date().toISOString()}),At=e=>{let t=mr(e);if(!io.existsSync(t))return i("Missing .epiq/project.json");try{let n=io.readFileSync(t,"utf8"),o=JSON.parse(n),r=jp.safeParse(o);return r.success?c("Read project.json",r.data):i(`Invalid .epiq/project.json: ${r.error.issues.map(s=>`${s.path.join(".")}: ${s.message}`).join(", ")}`)}catch(n){return i(n instanceof Error?`Failed to read .epiq/project.json: ${n.message}`:"Failed to read .epiq/project.json")}},ao=e=>{let t=At(e);return a(t)?i(t.message):c("Read projectId",t.value.projectId)},Ka=({repoRoot:e,fileContents:t})=>{let n=co(e),o=mr(e);try{if(io.mkdirSync(n,{recursive:!0}),io.existsSync(o)){let r=At(e);return a(r)?i(r.message):c("Project already initialized",null)}return io.writeFileSync(o,JSON.stringify(t,null,2)+`
3
+ `,"utf8"),c("Created project.json",null)}catch(r){return i(r instanceof Error?`Failed to initialize project: ${r.message}`:"Failed to initialize project")}}});import Hp from"node:os";import Wp from"node:path";var it,mn,pr=y(()=>{"use strict";it=".epiq-global",mn=()=>process.env.EPIQ_GLOBAL_DIR??Wp.join(Hp.homedir(),it)});var Os,za=y(()=>{"use strict";A();Os=(e,t)=>{let n=new Map,o=t??((...s)=>JSON.stringify(s)),r=((...s)=>{let d=o(...s);if(!n.has(d)){let l=e(...s).then(u=>(a(u)&&n.delete(d),u));n.set(d,l)}return n.get(d)});return r.clear=()=>n.clear(),r}});var he,gr=y(()=>{"use strict";at();he={stage:({cwd:e,pathspec:t})=>j({args:["add",...t],cwd:e}),commit:({cwd:e,message:t,allowEmpty:n=!1,pathspec:o})=>j({args:["commit","--no-verify",...n?["--allow-empty"]:[],"-m",t,...o?.length?["--",...o]:[]],cwd:e}),fetch:({cwd:e,remote:t,branch:n})=>j({args:["fetch",t,`+refs/heads/${n}:refs/remotes/${t}/${n}`],cwd:e}),rebaseOnto:({cwd:e,ref:t})=>j({args:["-c","rebase.autoStash=true","rebase",t],cwd:e}),checkout:({cwd:e,branch:t})=>j({args:["checkout",t],cwd:e}),push:({cwd:e,remote:t,branch:n,setUpstream:o=!1})=>{let r=t&&n?["push","--no-verify",...o?["-u"]:[],t,n]:["push","--no-verify"];return j({args:r,cwd:e})},setUpstream:({cwd:e,branch:t,upstream:n})=>j({args:["branch","--set-upstream-to",n,t],cwd:e}),worktreeAdd:({cwd:e,worktreeRoot:t,branch:n})=>j({args:["worktree","add",t,n],cwd:e}),worktreeRemove:({cwd:e,worktreeRoot:t})=>j({args:["worktree","remove","--force",t],cwd:e}),worktreePrune:({cwd:e})=>j({args:["worktree","prune"],cwd:e})}});var Wt,et,lo=y(()=>{"use strict";Tt();A();le();Wt=e=>{let t=ze(e);if(a(t))return i("Unable to resolve epiq project root");let n=At(t.value);return a(n)?i("Unable to read project.json"):c("Resolved state branch",n.value.stateBranch)},et="origin"});import{spawn as Gp}from"node:child_process";import pn from"node:fs";import gn from"node:path";var Ya,qp,Vp,Kp,Ja,j,Ue,On,_s,zp,fr,Us,$s,hr,uo,Qa,js,vr,Za,ed,Yp,Xa,Hs,Xp,Ws,td,nd,od,rd,at=y(()=>{"use strict";A();gr();lo();Ya=1e4,qp=()=>{let e=process.platform==="win32"?["git.exe","git"]:["git"];for(let t of(process.env.PATH??"").split(gn.delimiter))if(t)for(let n of e){let o=gn.join(t,n);try{if(!pn.statSync(o).isFile())continue;return pn.accessSync(o,pn.constants.X_OK),o}catch{continue}}return"git"},Vp=qp(),Kp={...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:"echo",GIT_SSH_COMMAND:process.env.GIT_SSH_COMMAND??"ssh -o BatchMode=yes -o ConnectTimeout=10"},Ja=({args:e,cwd:t,allowFail:n})=>new Promise(o=>{if(!pn.existsSync(t)){let p=`Git cwd does not exist: ${t}`;if(n){o({stdout:"",stderr:p,exitCode:1});return}o(i(p));return}let r=Gp(Vp,e,{cwd:t,stdio:["ignore","pipe","pipe"],env:Kp}),s=!1,d="",l="",u=p=>{s||(s=!0,clearTimeout(m),o(p))},m=setTimeout(()=>{r.kill("SIGTERM");let p=[`git ${e.join(" ")}`,`cwd=${t}`,`Git command timed out after ${Ya}ms`].join(`
4
+ `);u(n?{stdout:d,stderr:p,exitCode:124}:i(p))},Ya);r.stdout.setEncoding("utf8"),r.stderr.setEncoding("utf8"),r.stdout.on("data",p=>{d+=p}),r.stderr.on("data",p=>{l+=p}),r.on("error",p=>{if(n){u({stdout:d,stderr:p.message,exitCode:1});return}u(i([`git ${e.join(" ")}`,`cwd=${t}`,p.message].join(`
5
+ `)))}),r.on("close",p=>{let f=p??1;if(n){u({stdout:d,stderr:l,exitCode:f});return}if(f!==0){u(i([`git ${e.join(" ")}`,l.trim()||d.trim()||"Git command failed"].filter(Boolean).join(`
6
+ `)));return}u(c("Git command succeeded",{stdout:d,stderr:l,exitCode:f}))})}),j=({args:e,cwd:t})=>Ja({args:e,cwd:t,allowFail:!1}),Ue=({args:e,cwd:t})=>Ja({args:e,cwd:t,allowFail:!0}),On=async({cwd:e,message:t,pathspec:n})=>{let o=await he.commit({cwd:e,message:t,pathspec:n});if(a(o))return i(`Failed to create commit
7
+ ${o.message}`);let r=await j({args:["rev-parse","HEAD"],cwd:e});return a(r)?i(`Commit created, but failed to read HEAD SHA
8
+ ${r.message}`):c("Created commit and resolved SHA",r.value.stdout.trim())},_s=async e=>{let t=await j({cwd:e,args:["rev-parse","--git-dir"]});if(a(t))return i(t.message);let n=t.value.stdout.trim();return c("Resolved git dir",gn.isAbsolute(n)?n:gn.resolve(e,n))},zp=async e=>{let t=await _s(e);if(a(t))return i(t.message);let n=t.value,o={MERGE_HEAD:"merge in progress"};for(let[s,d]of Object.entries(o))if(pn.existsSync(gn.join(n,s)))return c("Checked for in-progress Git operation",d);let r={"rebase-merge":"rebase in progress","rebase-apply":"rebase in progress"};for(let[s,d]of Object.entries(r))if(pn.existsSync(gn.join(n,s)))return c("Checked for in-progress Git operation",d);return c("Checked for in-progress Git operation",null)},fr=async e=>{let t=await zp(e);return a(t)?i(t.message):c("Checked for in-progress Git operation",t.value!==null)},Us=async({repoRoot:e})=>{let n=(await Ue({args:["remote","get-url",et],cwd:e})).exitCode===0;return c(`Checked remote ${n}`,n)},$s=async({repoRoot:e,branch:t})=>{let n=await Ue({args:["ls-remote","--heads",et,t],cwd:e});return n.exitCode!==0?i(n.stderr.trim()||`Unable to inspect remote branch ${et}/${t}`):c("Checked remote branch",n.stdout.trim().length>0)},hr=async({repoRoot:e,branch:t})=>{let n=await Ue({args:["show-ref","--verify","--quiet",`refs/heads/${t}`],cwd:e});return n.exitCode===0?c("Local branch exists",!0):n.exitCode===1?c("Local branch missing",!1):i(n.stderr.trim()||`Unable to inspect branch ${t}`)},uo=e=>{try{return pn.realpathSync.native(e)}catch{return gn.resolve(e)}},Qa=async({repoRoot:e,worktreeRoot:t})=>{let n=await j({args:["worktree","list","--porcelain"],cwd:e});if(a(n))return i(n.message);let o=uo(t),r=n.value.stdout.split(`
9
+ `).filter(s=>s.startsWith("worktree ")).map(s=>s.slice(9)).map(uo).includes(o);return c("Checked worktree registration",r)},js=async e=>{let t=await Ue({args:["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],cwd:e});return c("Checked upstream",t.exitCode===0&&t.stdout.trim().length>0)},vr=async e=>{let t=await j({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return a(t)?i(t.message):c("Resolved current branch",t.value.stdout.trim())},Za=async e=>{let t=await j({args:["rev-parse","--short","HEAD"],cwd:e});return a(t)?i(t.message):c("Resolved short HEAD sha",t.value.stdout.trim())},ed=e=>e.includes("fetch first")||e.includes("non-fast-forward"),Yp=async e=>(await Ue({cwd:e,args:["rebase","--abort"]})).exitCode===0?c("Aborted stale rebase",!0):c("No rebase to abort",!1),Xa=async e=>{let t=await Ue({args:["rev-parse","HEAD"],cwd:e});return t.exitCode===0?t.stdout.trim():null},Hs=e=>/could not resolve host/i.test(e)||/connection refused|connection timed out|operation timed out/i.test(e)||/network is unreachable|no route to host/i.test(e)||/failed to connect to/i.test(e)||/git command timed out after/i.test(e),Xp=e=>e.includes("couldn't find remote ref")||e.includes("Could not find remote branch"),Ws=async({cwd:e,branch:t})=>{let n=await Yp(e);if(a(n))return i(n.message);let o=await Xa(e),r=await he.fetch({cwd:e,remote:et,branch:t});if(a(r))return Xp(r.message)?c("Remote branch missing, skipped pull",!1):i(`Failed to fetch ${t}
10
+ ${r.message}`);let s=await he.rebaseOnto({cwd:e,ref:`${et}/${t}`});if(a(s))return i(`Failed during rebase
11
+ ${s.message}`);let d=await Xa(e),l=o!==null&&d!==null&&o!==d;return c(l?"Pulled with rebase":"Already up to date",l)},td=async e=>{let t=await Ue({args:["rev-list","--count","@{u}..HEAD"],cwd:e});return t.exitCode!==0?c("No upstream to compare against",!1):c("Compared against upstream",Number(t.stdout.trim())>0)},nd=async e=>{let t=await Ue({args:["status","--porcelain","--untracked-files=all"],cwd:e});return t.exitCode!==0?i(t.stderr.trim()||"Unable to inspect the worktree for changes"):c("Inspected worktree for changes",t.stdout.trim().length>0)},od=async(e,t)=>{let n=await Ue({args:["diff","--cached","--quiet",...t?.length?["--",...t]:[]],cwd:e});return n.exitCode===0?c("No staged changes",!1):n.exitCode===1?c("Has staged changes",!0):i(n.stderr.trim()||"Unable to inspect staged changes")},rd=async e=>{let t=await vr(e);return a(t)?i(t.message):c("Checked detached HEAD state",t.value==="HEAD")}});import Gt from"node:fs";import tt from"node:path";var id,ad,dd,cd,yr,Ne,Jp,sd,mo,br,ld,Gs,qs,ud,md,dt,ix,ct=y(()=>{"use strict";Tt();A();pr();le();za();wt();at();id="4b825dc642cb6eb9a060e54bf8d69288fbee4904",ad=e=>tt.join(Ye,fn,e),dd=()=>tt.join(Ye,Vs),cd=mn,yr=()=>tt.join(cd(),"worktrees"),Ne=({repoRoot:e})=>{let t=ao(e);return a(t)?i(t.message):c("Resolved state branch root",tt.join(yr(),t.value))},Jp=e=>tt.join(e,Ye),sd=e=>tt.join(Jp(e),fn),mo=e=>{try{return Gt.mkdirSync(e,{recursive:!0}),c("Ensured directory",void 0)}catch(t){return i(t instanceof Error?t.message:String(t))}},br=()=>{let e=cd(),t=yr(),n=!Gt.existsSync(e)||!Gt.existsSync(t),o=mo(e);if(a(o))return i(`Ensure epiq home failed.
12
+ `+o.message);let r=mo(t);return a(r)?i(`Ensure worktrees dir failed.
13
+ `+r.message):c("Ensured epiq storage",n)},ld=e=>{Gt.existsSync(e)&&(Y.debug("[sync] remove path",e),Gt.rmSync(e,{recursive:!0,force:!0}))},Gs=`*.jsonl merge=union
14
+ `,qs=()=>tt.join(Ye,fn,".gitattributes"),ud=(e,t)=>{for(let o of[sd(e),sd(t)]){let r=mo(o);if(a(r))return i(r.message)}let n=tt.join(t,qs());try{Gt.readFileSync(n,"utf8")!==Gs&&Gt.writeFileSync(n,Gs)}catch{Gt.writeFileSync(n,Gs)}return c("Ensured state branch",void 0)},md=async e=>{let t=await j({args:["ls-tree","--name-only","HEAD"],cwd:e});if(a(t))return i(`ensure state branch is storage only failed
13
15
  `+t.message);let o=t.value.stdout.trim().split(`
14
- `).filter(Boolean).filter(d=>d!==lt);if(o.length===0)return c("State branch is storage-only",!1);let r=await _({args:["rm","-r","--ignore-unmatch","--",...o],cwd:e});if(a(r))return i(`Failed to clean storage branch
15
- ${r.message}`);let s=await Cn({cwd:e,message:"[epiq:repair-storage-branch]"});return a(s)?i(s.message):c("Cleaned storage branch",!0)},dt=as(async(e=process.cwd())=>{let t=await _({args:["rev-parse","--show-toplevel"],cwd:e});return a(t)?i("Not inside a Git repository"):c("Resolved repo root",t.value.stdout.trim())},e=>at.resolve(e)),ry=as(async e=>{let t=await _({args:["rev-parse","--git-dir"],cwd:e});if(a(t))return i(t.message);let n=t.value.stdout.trim(),o=at.isAbsolute(n)?n:at.join(e,n);return c("Resolved git dir",o)},e=>at.resolve(e))});import Zn from"node:fs";import ut from"node:path";var uy,lt,Yo,ps,fm,Gn,$o,eo,gs,ba,vm,fs,Xo,hm,et,Ia,mt,me=y(()=>{"use strict";A();ct();is();uy=process.env.IS_LOCAL==="true",lt=".epiq",Yo="events",ps="media",fm="project.json",Gn=e=>ut.join(e,lt),$o=e=>ut.join(Gn(e),fm),eo=e=>ut.join(Gn(e),Yo),gs=e=>ut.join(Gn(e),ps),ba=e=>ut.join(e,lt),vm=e=>{let t=ut.join(e,lt);return Zn.existsSync(t)&&Zn.statSync(t).isDirectory()},fs=e=>{let t=$o(e);return Zn.existsSync(t)&&Zn.statSync(t).isFile()},Xo=e=>{let t=ut.resolve(e);for(;;){if(vm(t))return c("Resolved closest .epiq root",t);let n=ut.dirname(t);if(n===t)return i("No .epiq directory found in any parent");t=n}},hm="No .epiq/project.json found in any parent",et=e=>{let t=ut.resolve(e);for(;;){if(fs(t))return c("Resolved closest epiq project root",t);let n=ut.dirname(t);if(n===t)return i(hm);t=n}},Ia=e=>{let t=eo(e);try{return Zn.mkdirSync(t,{recursive:!0}),c("Resolved events dir",t)}catch(n){return i(n instanceof Error?`Failed to ensure events dir: ${n.message}`:"Failed to ensure events dir")}},mt=async()=>{let e=await dt(process.cwd());if(a(e))return e;let t=De({repoRoot:e.value});return a(t)?t:c("Resolved persist root",t.value)}});import to from"fs";import bs from"path";import ym from"util";function Im(){let e=Na();if(!e||!to.existsSync(e))return;let n=to.readFileSync(e,"utf8").split(`
16
- `);if(n[n.length-1]===""&&n.pop(),n.length<=xa)return;let o=n.slice(-xa).join(`
16
+ `).filter(Boolean).filter(d=>d!==Ye);if(o.length===0)return c("State branch is storage-only",!1);let r=await j({args:["rm","-r","--ignore-unmatch","--",...o],cwd:e});if(a(r))return i(`Failed to clean storage branch
17
+ ${r.message}`);let s=await On({cwd:e,message:"[epiq:repair-storage-branch]"});return a(s)?i(s.message):c("Cleaned storage branch",!0)},dt=Os(async(e=process.cwd())=>{let t=await j({args:["rev-parse","--show-toplevel"],cwd:e});return a(t)?i("Not inside a Git repository"):c("Resolved repo root",t.value.stdout.trim())},e=>tt.resolve(e)),ix=Os(async e=>{let t=await j({args:["rev-parse","--git-dir"],cwd:e});if(a(t))return i(t.message);let n=t.value.stdout.trim(),o=tt.isAbsolute(n)?n:tt.join(e,n);return c("Resolved git dir",o)},e=>tt.resolve(e))});import po from"node:fs";import vt from"node:path";var px,Ye,fn,Vs,Qp,co,mr,go,Ks,pd,Zp,fo,xr,eg,ze,gd,yt,le=y(()=>{"use strict";A();ct();pr();px=process.env.IS_LOCAL==="true",Ye=".epiq",fn="events",Vs="media",Qp="project.json",co=e=>vt.join(e,Ye),mr=e=>vt.join(co(e),Qp),go=e=>vt.join(co(e),fn),Ks=e=>vt.join(co(e),Vs),pd=e=>vt.join(e,Ye),Zp=e=>{let t=vt.join(e,Ye);return po.existsSync(t)&&po.statSync(t).isDirectory()},fo=e=>{let t=mr(e);return po.existsSync(t)&&po.statSync(t).isFile()},xr=e=>{let t=vt.resolve(e);for(;;){if(Zp(t))return c("Resolved closest .epiq root",t);let n=vt.dirname(t);if(n===t)return i("No .epiq directory found in any parent");t=n}},eg="No .epiq/project.json found in any parent",ze=e=>{let t=vt.resolve(e);for(;;){if(fo(t))return c("Resolved closest epiq project root",t);let n=vt.dirname(t);if(n===t)return i(eg);t=n}},gd=e=>{let t=go(e);try{return po.mkdirSync(t,{recursive:!0}),c("Resolved events dir",t)}catch(n){return i(n instanceof Error?`Failed to ensure events dir: ${n.message}`:"Failed to ensure events dir")}},yt=async()=>{let e=await dt(process.cwd());if(a(e))return e;let t=Ne({repoRoot:e.value});return a(t)?t:c("Resolved persist root",t.value)}});import ho from"fs";import Js from"path";import tg from"util";function og(){let e=vd();if(!e||!ho.existsSync(e))return;let n=ho.readFileSync(e,"utf8").split(`
18
+ `);if(n[n.length-1]===""&&n.pop(),n.length<=fd)return;let o=n.slice(-fd).join(`
17
19
  `)+`
18
- `;to.writeFileSync(e,o,"utf8")}function hs(e,t,n=!1){let o=Na();if(!o)return;let r=ym.format(...t),s=new Date,l=`[${n?s.toISOString().slice(11,19):s.toISOString()}] ${e} ${r}
19
- `;to.mkdirSync(bs.dirname(o),{recursive:!0}),to.appendFileSync(o,l,"utf8"),vs++,vs>=bm&&(vs=0,Im())}var xa,bm,vs,Ea,Na,ys,J,Bt=y(()=>{"use strict";A();me();xa=1e3,bm=50,vs=0,Ea=()=>process.env.EPIQ_MCP==="true",Na=()=>{let e=process.cwd(),t=Xo(e);return a(t)?Ea()?bs.join(process.cwd(),".epiq-mcp.log"):void 0:bs.join(t.value,lt,"log","epiq.log")};ys=()=>Ea()?process.env.EPIQ_MCP_LOG_LEVEL??"error":process.env.EPIQ_LOG_LEVEL??"debug",J={info(...e){let t=ys();(t==="info"||t==="debug")&&hs("[Info]",e,!1)},debug(...e){ys()==="debug"&&hs("[Debug]",e,!0)},error(...e){let t=ys();if(t==="error"||t==="info"||t==="debug"){let o=e.some(r=>r instanceof Error)?void 0:new Error().stack;hs("[Error]",[...e,o].filter(Boolean),!1)}}};globalThis.logger=J});var Q,Sn=y(()=>{"use strict";Q={DESCRIPTION:"Description",ASSIGNEES:"Assignees",TAGS:"Tags",HISTORY:"History",COMMENTS:"Comments",ATTACHMENTS:"Attachments"}});var nt,Ra,An=y(()=>{"use strict";nt=e=>e.slice(-7).toUpperCase(),Ra=(e,t)=>{let n=t.replace(/-/g,"").trim().toUpperCase();return n?nt(e).includes(n):!0}});var Ne,tn=y(()=>{"use strict";ie();An();Ne={workspace:(e,t,n)=>({id:e,title:t,rank:n,isDeleted:!1,props:{},context:D.WORKSPACE,childRenderAxis:"vertical",parentNodeId:null,readonly:!0,log:[]}),board:(e,t,n,o,r=!1)=>({id:e,title:t,rank:o,isDeleted:!1,props:{ref:nt(e)},context:D.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:r,log:[]}),swimlane:(e,t,n,o)=>({id:e,title:t,rank:o,isDeleted:!1,props:{},context:D.SWIMLANE,childRenderAxis:"vertical",childNavigationAcrossParents:!0,parentNodeId:n,readonly:!1,log:[]}),field:({id:e,name:t,parentNodeId:n,rank:o,props:r={},childRenderAxis:s="horizontal",isVirtual:d=!1})=>({id:e,title:t,rank:o,isDeleted:!1,props:r,context:D.FIELD,childRenderAxis:s,parentNodeId:n,readonly:!1,log:[],isVirtual:d}),fieldList:({id:e,name:t,parentNodeId:n,rank:o,childRenderAxis:r="horizontal",isVirtual:s=!1})=>({id:e,title:t,rank:o,isDeleted:!1,props:{},context:D.FIELD_LIST,childRenderAxis:r,parentNodeId:n,readonly:!1,log:[],isVirtual:s}),ticket:(e,t,n,o)=>({id:e,title:t,rank:o,isDeleted:!1,props:{ref:nt(e)},context:D.TICKET,childRenderAxis:"vertical",parentNodeId:n,readonly:!1,log:[]}),text:({id:e,name:t,parentNodeId:n,rank:o,readonly:r=!0,isVirtual:s=!0})=>({id:e,title:t,rank:o,isDeleted:!1,props:{},context:D.TEXT,childRenderAxis:"vertical",parentNodeId:n,readonly:r,log:[],isVirtual:s}),comment:({id:e,name:t,parentNodeId:n,rank:o,props:r={},readonly:s=!0,isVirtual:d=!0})=>({id:e,title:t,rank:o,isDeleted:!1,props:r,context:D.COMMENT,childRenderAxis:"vertical",parentNodeId:n,readonly:s,log:[],isVirtual:d})}});var xm,ye,Jo,Tn=y(()=>{"use strict";xm=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[ye,Jo]=xm});function Ut(e,t=!1){let n=Tm[e.action];if(!n)return i(`Unknown event action "${e.action}", likely created by a newer epiq version. Evt id: ${e.id}`);let o=n(e);if(a(o))return o;let r=Am(e,t);return r||o}var Is,P,no,nn,on,Ca,Sa,Em,Nm,xs,Rm,Cm,ot,Sm,Am,Tm,Et,Nt=y(()=>{"use strict";Bt();ie();A();Sn();le();tn();w();Es();Tn();Is=(e,t)=>i(`${t.action.split(".").join(" ")+" failed, "+e.toLowerCase()}. Evt id: ${t.id}`),P=(e,t)=>({...Is(e,t),convergence:!0}),no=e=>a(e)&&e.convergence===!0,nn=e=>{let t=e.filter(a);return{fatal:t.filter(n=>!no(n)),skipped:t.filter(no)}},on=e=>{e.length!==0&&J.info(`Skipped ${e.length} event(s) that could not be applied to this state: ${e.map(t=>t.message).join("; ")}`)},Ca=e=>{let t=I.getNode(e);if(!t||!L(t)||t.isDeleted)return null;let n=Qo(t);return a(n)?n:null},Sa=e=>{if(!Zo())return null;for(let t of e){let n=Ca(t);if(n)return n;let o=g().nodes[t]?.parentNodeId;if(!o)continue;let r=Ca(o);if(r)return r}return null},Em=(e,t)=>{let n=I.getNode(e);n&&I.updateNode({...n,log:[...n.log??[],t]})},Nm=e=>{let t=[e],n=g().nodes[e]?.parentNodeId;return n&&t.push(n),t},xs=e=>{switch(e.action){case"add.issue.comment":case"edit.issue.comment":case"delete.issue.comment":case"add.issue.attachment":case"delete.issue.attachment":return[e.payload.issue];case"delete.node":case"edit.description":return Nm(e.payload.id);case"init.workspace":case"add.workspace":case"add.board":case"add.swimlane":case"add.issue":case"add.field":case"edit.title":case"lock.node":case"move.node":case"close.issue":case"reopen.issue":case"add.issue.tag":case"remove.issue.tag":case"add.issue.assignee":case"remove.issue.assignee":return[e.payload.id];case"rebalance.children":return Object.keys(e.payload.ranks);case"create.tag":case"create.contributor":case"rename.contributor":case"link.contributor.user":default:return[]}},Rm=e=>{de(t=>({...t,eventLog:[...t.eventLog,e]}))},Cm=e=>{let t=e.userId,n=e.userName;return!t?.length||!n?.length?Is("Invalid user ID format",e):c("Valid user",null)},ot=null,Sm=e=>{for(let[t,n]of e.nodeLog){let o=I.getNode(t);o&&I.updateNode({...o,log:[...o.log??[],...n]})}return e.appLog.length>0&&de(t=>({...t,eventLog:[...t.eventLog,...e.appLog]})),Sa([...e.virtualNodeIds])},Am=(e,t)=>{let n=Cm(e);if(a(n))return n;let o=[...new Set(xs(e))];if(ot){for(let s of o){if(!t){let d=ot.nodeLog.get(s);d?d.push(e):ot.nodeLog.set(s,[e])}if(Zo()){ot.virtualNodeIds.add(s);let d=g().nodes[s]?.parentNodeId;d&&ot.virtualNodeIds.add(d)}}return t||ot.appLog.push(e),null}t||(o.forEach(s=>Em(s,e)),Rm(e));let r=Sa(o);return r||null},Tm={"init.workspace":e=>{let{id:t,name:n,rank:o}=e.payload,r=Ne.workspace(t,n,o),s=oo(r);if(a(s))return Is(s.message,e);let d=I.createNode(r);return a(d)?P(d.message??"Failed to initialize workspace",e):rs(d.value)?c("Workspace initialized",{action:e.action,result:d.value}):i("Unexpected create node return value")},"add.workspace":e=>{let{id:t,name:n,rank:o}=e.payload,r=I.createNode(Ne.workspace(t,n,o));return a(r)?P(r.message??"Failed to add workspace",e):rs(r.value)?c("Added workspace",{action:e.action,result:r.value}):i("Unexpected create node return value")},"add.board":e=>{let{id:t,name:n,parent:o,rank:r}=e.payload,s=I.createNode(Ne.board(t,n,o,r));return a(s)?P(s.message??"Unable to create board",e):Fo(s.value)?c("Added board",{action:e.action,result:s.value}):i("Unexpected create node return value")},"add.swimlane":e=>{let{id:t,name:n,parent:o,rank:r}=e.payload,s=I.createNode(Ne.swimlane(t,n,o,r));return a(s)?P(s.message??"Unable to create swimlane",e):Zt(s.value)?c("Added swimlane",{action:e.action,result:s.value}):i("Unexpected create node return value")},"add.issue":e=>{let{id:t,name:n,parent:o,rank:r}=e.payload,s=I.createNode(Ne.ticket(t,n,o,r));return a(s)?P(s.message??"Unable to create issue",e):L(s.value)?c("Added issue",{action:e.action,result:s.value}):i("Unexpected create node return value")},"add.field":e=>{let{id:t,name:n,parent:o,val:r,rank:s}=e.payload,d=I.createNode(Ne.field({id:t,name:n,parentNodeId:o,rank:s,props:{value:r},childRenderAxis:n.includes(Q.DESCRIPTION)?"vertical":"horizontal"}));return a(d)?P(d.message??`Unable to create field: ${n}`,e):je(d.value)?c("Added field",{action:e.action,result:d.value}):i("Unexpected create node return value")},"edit.title":e=>{let{id:t,name:n}=e.payload;if(!I.getNode(t))return P(`Unable to locate node with id ${t}`,e);let r=I.renameNode(t,n);return a(r)?P(r.message??"Unable to edit title",e):c("Edited title",{action:e.action,result:r.value})},"delete.node":e=>{let{id:t}=e.payload,n=I.tombstoneNode(t);return a(n)?P(n.message??"Unable to delete node",e):c("Deleted node",{action:e.action,result:n.value})},"create.tag":e=>{let{id:t,name:n}=e.payload,o=I.createTag({id:t,name:n});return a(o)?P(o.message??"Unable to create tag",e):c("Tag added",{action:e.action,result:o.value})},"create.contributor":e=>{let{id:t,name:n}=e.payload,o=I.createContributor({id:t,name:n});return a(o)?P(o.message??"Unable to create contributor",e):c("Contributor created",{action:e.action,result:o.value})},"rename.contributor":e=>{let{id:t,name:n}=e.payload,o=I.renameContributor(t,n);return a(o)?P(o.message??"Unable to rename contributor",e):c("Contributor renamed",{action:e.action,result:o.value})},"tombstone.contributor":e=>{let{id:t}=e.payload,n=I.tombstoneContributor(t);return a(n)?P(n.message??"Unable to remove contributor",e):c("Contributor tombstoned",{action:e.action,result:n.value})},"restore.contributor":e=>{let{id:t,name:n}=e.payload,o=I.restoreContributor(t,n);return a(o)?P(o.message??"Unable to restore contributor",e):c("Contributor restored",{action:e.action,result:o.value})},"add.issue.tag":e=>{let{id:t,tag:n}=e.payload,o=I.tag(t,n);return a(o)?P(o.message??"Unable to tag issue",e):c("Issue tagged",{action:e.action,result:{tag:n}})},"remove.issue.tag":e=>{let{id:t,tag:n}=e.payload,o=I.untag(t,n);return a(o)?P(o.message??"Unable to untag issue",e):c("Issue untagged",{action:e.action,result:{tag:n}})},"add.issue.assignee":e=>{let{id:t,assignee:n}=e.payload,o=I.assign(t,n);return a(o)?P(o.message??"Unable to assign issue",e):c("Assigned successfully",{action:e.action,result:{assignee:n}})},"remove.issue.assignee":e=>{let{id:t,assignee:n}=e.payload,o=I.unassign(t,n);return a(o)?P(o.message??"Unable to unassign issue",e):c("Issue unassigned",{action:e.action,result:{assignee:n}})},"move.node":e=>{let{id:t,parent:n,rank:o}=e.payload,r=I.moveNodeToRank({id:t,parentId:n,rank:o});return a(r)?P(r.message??"Failed to move node",e):c("Moved node",{action:e.action,result:r.value})},"edit.description":e=>{let{id:t,md:n}=e.payload,o=I.editValue(t,n);return a(o)?P(o.message??"Unable to edit description",e):c("Set node value",{action:e.action,result:o.value})},"close.issue":e=>{let{id:t,parent:n,rank:o}=e.payload,r=I.getNode(t);if(!r)return P("Unable to locate issue",e);if(!L(r))return P("Can only close issues",e);let s=I.getNode(ye);if(!s)return P("Unable to locate target swimlane",e);if(n!==s.id)return P("Close target must be closed swimlane",e);let d=I.moveNodeToRank({id:t,parentId:n,rank:o});return a(d)?P(d.message??"Unable to close issue",e):c("Issue closed",{action:e.action,result:{id:t}})},"reopen.issue":e=>{let{id:t,parent:n,rank:o}=e.payload,r=I.getNode(t);if(!r)return P("Unable to locate issue",e);if(!L(r))return P("Can only reopen issues",e);let s=I.getNode(ye);if(!s)return P("Unable to locate closed swimlane",e);if(n===s.id)return P("Cannot reopen issue into closed swimlane",e);if(!I.getNode(n))return P("Reopen parent no longer exists",e);let l=I.moveNodeToRank({id:t,parentId:n,rank:o});return a(l)?P(l.message??"Unable to reopen issue",e):c("Issue reopened",{action:e.action,result:{id:t}})},"lock.node":e=>{let{id:t}=e.payload,n=I.lockNode(t);return a(n)?P(n.message??"Unable to lock node",e):c("Node locked",{action:e.action,result:n.value})},"rebalance.children":e=>{let{parent:t,ranks:n}=e.payload;for(let[o,r]of Object.entries(n)){let s=I.getNode(o);if(!s)return P(`Unable to locate node ${o}`,e);if(s.parentNodeId!==t)return P(`Node ${o} is not child of ${t}`,e);let d=I.updateNode({...s,rank:r});if(a(d))return P(d.message??"Unable to rebalance child",e)}return c("Rebalanced children",{action:e.action,result:{parent:t}})},"add.issue.comment":e=>{let{id:t,issue:n,author:o,md:r}=e.payload,s=I.createComment({id:t,issue:n,authorId:o,authorName:I.getContributor(o)?.name??"Unknown",md:r,deleted:!1});return a(s)?P(s.message??"Unable to add comment",e):c("Comment added",{action:e.action,result:{id:t,issue:n,author:o,md:r}})},"edit.issue.comment":e=>{let{id:t,issue:n,md:o}=e.payload,r=I.getComment(t);if(!r)return P("Unable to locate comment",e);if(r.issue!==n)return P("Comment does not belong to issue",e);let s=I.editComment(t,o);return a(s)?P(s.message??"Unable to edit comment",e):c("Comment edited",{action:e.action,result:{id:t,issue:n,md:o}})},"delete.issue.comment":e=>{let{id:t,issue:n}=e.payload,o=I.getComment(t);if(!o)return P("Unable to locate comment",e);if(o.issue!==n)return P("Comment does not belong to issue",e);let r=I.deleteComment(t);return a(r)?P(r.message??"Unable to delete comment",e):c("Comment deleted",{action:e.action,result:{id:t,issue:n}})},"add.issue.attachment":e=>{let{id:t,issue:n,hash:o,ext:r,name:s,bytes:d}=e.payload,l=I.createAttachment({id:t,issue:n,hash:o,ext:r,name:s,bytes:d,deleted:!1});return a(l)?P(l.message??"Unable to add attachment",e):c("Attachment added",{action:e.action,result:{id:t,issue:n,hash:o}})},"delete.issue.attachment":e=>{let{id:t,issue:n}=e.payload,o=I.getAttachment(t);if(!o)return P("Unable to locate attachment",e);if(o.issue!==n)return P("Attachment does not belong to issue",e);let r=I.deleteAttachment(t);return a(r)?P(r.message??"Unable to delete attachment",e):c("Attachment deleted",{action:e.action,result:{id:t,issue:n}})},"link.contributor.user":e=>{let{contributor:t}=e.payload,n=I.linkUserId({contributorId:t,userId:e.userId});return a(n)?P(n.message??"Unable to link contributor",e):c("Contributor linked to user",{action:e.action,result:{contributor:t,userId:e.userId}})}};Et=e=>{let t=Aa(()=>{let n=ot===null;n&&(ot={appLog:[],nodeLog:new Map,virtualNodeIds:new Set});try{let o=e.map(r=>Ut(r));if(n&&ot){let r=Sm(ot);if(r)return e.map(()=>r)}return o}finally{n&&(ot=null)}});return a(t)?e.map(()=>i(t.message)):t.value}});var Ns,Ta=y(()=>{"use strict";Ns=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown"});var wm,Mm,wa,Ma,Rs=y(()=>{"use strict";wm=["init.workspace","add.workspace","add.board","add.swimlane","add.issue","add.field","edit.title","delete.node","create.tag","create.contributor","rename.contributor","tombstone.contributor","restore.contributor","add.issue.assignee","remove.issue.assignee","add.issue.tag","remove.issue.tag","move.node","edit.description","add.issue.comment","edit.issue.comment","delete.issue.comment","add.issue.attachment","delete.issue.attachment","close.issue","reopen.issue","lock.node","rebalance.children","link.contributor.user"],Mm=new Set(wm),wa=e=>Mm.has(e),Ma=e=>({action:e.action,payload:e.payload})});import er from"node:fs";import Ss from"node:path";import{decodeTime as Lm}from"ulid";import{z as Cs}from"zod";function tr(e){let t=eo(e);if(!er.existsSync(t))return c("No events found",[]);let n=er.readdirSync(t).filter(r=>r.endsWith(".jsonl")).map(r=>Ss.join(t,r)),o=[];for(let r of n){let s=$m(r);if(a(s))return i(s.message);o.push(...s.value)}return c("All events loaded",Wm(o))}function rn(e){let t=tr(e);if(a(t))return i(t.message);let n=[],o=As(t.value,n);return a(o)?i(o.message):(jm=n,c("Loaded merged events",{events:o.value,unreadable:n}))}function Ts(e){let t=tr(e);return a(t)?i(t.message):c("Loaded event actors",t.value.map(({userId:n,userName:o})=>({userId:n,userName:o})))}function wn(e){let t=rn(e);return a(t)?i(t.message):c("Loaded merged events",t.value.events)}function ws(e,t){let n=tr(e);if(a(n))return i(n.message);let{appliedEvents:o,unappliedEvents:r}=Hm(n.value,t),s=As(o);if(a(s))return i(s.message);let d=As(r);return a(d)?i(d.message):c("Loaded merged events before time",{appliedEvents:s.value,unappliedEvents:d.value})}function ka(e=process.cwd()){let t=tr(e);return a(t)?i(t.message):c("Loaded edge reference",t.value.at(-1)?.id?.[0]??null)}var km,La,Pm,Dm,Fm,Om,Bm,Um,_m,As,$m,jm,Wm,Hm,sn=y(()=>{"use strict";Bt();A();me();Rs();rt();km=Cs.object({userId:Cs.string().min(1).default("unknown"),userName:Cs.string().min(1).default("unknown")}),La=e=>{let t=Object.entries(e).filter(([r])=>r!=="id"&&r!=="v"&&r!=="userId"&&r!=="userName");if(t.length!==1)return null;let n=t[0]?.[1];if(typeof n!="object"||n===null)return null;let o=n.id;return typeof o=="string"&&o.length>0?o:null},Pm=/^[0-9a-hjkmnp-tv-z]{26}$/i,Dm=e=>Pm.test(e)?e.toUpperCase():e,Fm=e=>{let t=Ss.basename(e,".jsonl"),n=t.indexOf("."),o=n===-1?t:t.slice(0,n),r=n===-1?void 0:t.slice(n+1),s=km.safeParse({userId:Dm(o),userName:r});return s.success?c("Parsed event file actor",s.data):i(`Invalid event file name ${Ss.basename(e)}: ${s.error.issues.map(d=>d.path.join(".")||d.message).join(", ")}`)},Om=e=>{let t=Object.keys(e).filter(n=>n!=="id"&&n!=="v");return t.length!==1?i(`Invalid persisted event: expected exactly 1 action key, got ${t.length}`):!t[0]||!(t[0]in e)?i("Invalid persisted event: action key is missing or invalid"):c("Resolved persisted action",t[0])},Bm=(e,t)=>t in e,Um=({id:e,action:t,payload:n,userId:o,userName:r})=>({id:e,action:t,payload:n,userId:o,userName:r}),_m=e=>{let{userId:t,userName:n,...o}=e,r=Om(o);if(a(r))return i(r.message);let s=r.value,d=e.id?.[0];return d?Bm(o,s)?c("Decoded persisted event",Um({id:d,action:s,payload:o[s],userId:t,userName:n})):i(`Persisted event is missing payload for action: ${s}`):i("Persisted event is missing id")},As=(e,t)=>{let n=[],o=new Map,r=new Map;for(let s of e){if(!Da(s.v)){r.set(s.v,(r.get(s.v)??0)+1),t?.push({eventId:s.id[0],reason:"unsupported-schema-version",detail:`v${s.v}`,targetNodeId:La(s)});continue}let d=_m(s);if(a(d))return i(`Failed to decode event ${s.id?.[0]??"<unknown>"}: ${d.message}`);let l=d.value.action;if(!wa(l)){o.set(l,(o.get(l)??0)+1),t?.push({eventId:s.id[0],reason:"unknown-action",detail:l,targetNodeId:La(s)});continue}n.push(d.value)}if(o.size>0){let s=[...o.entries()].map(([d,l])=>`${d} (x${l})`).join(", ");J.info(`Skipped events with unknown actions, likely created by a newer epiq version: ${s}. Upgrade to apply them.`)}if(r.size>0){let s=[...r.entries()].map(([d,l])=>`v${d} (x${l})`).join(", ");J.info(`Skipped events with unsupported schema versions, created by a newer epiq version: ${s}. Upgrade to apply them.`)}return c("Decoded reconstructed events",n)},$m=e=>{if(!er.existsSync(e))return c("Event file missing",[]);let t=Fm(e);if(a(t))return i(t.message);let n=er.readFileSync(e,"utf8"),o=[];for(let r of n.split(`
20
- `)){let s=r.trim();if(!s)continue;let d;try{d=JSON.parse(s)}catch{return i(`Failed to parse event JSON from ${e}: ${s}`)}let l=Pa(d);if(a(l))return i(`${l.message} in ${e}: ${s}`);o.push({...l.value,userId:t.value.userId,userName:t.value.userName})}return c("Parsed persisted events file",o)};jm=[];Wm=e=>{let t=new Map,n=new Map;for(let m of e){let p=m.id[0],v=m.id[1]??null;t.set(p,m);let x=n.get(v)??[];x.push(m),n.set(v,x)}for(let m of n.values())m.sort((p,v)=>p.id[0].localeCompare(v.id[0]));let o=[],r=new Set,s=m=>{let p=m.id[0];if(r.has(p))return;o.push(m),r.add(p);let v=n.get(p)??[];for(let x of v)s(x)},d=n.get(null)??[];for(let m of d)s(m);let l=e.filter(m=>{let p=m.id[0],v=m.id[1]??null;return!r.has(p)&&v!==null&&!t.has(v)}).sort((m,p)=>m.id[0].localeCompare(p.id[0]));for(let m of l)s(m);let u=e.filter(m=>!r.has(m.id[0])).sort((m,p)=>m.id[0].localeCompare(p.id[0]));for(let m of u)s(m);return o},Hm=(e,t)=>{let n=new Set,o=[],r=[];for(let s of e){let d=s.id[0],l=s.id[1],u=!1;try{u=Lm(d)<t}catch{u=!1}!u||l&&n.has(l)?(n.add(d),r.push(s)):o.push(s)}return{appliedEvents:o,unappliedEvents:r}}});import Vm from"node:fs";import Km from"node:path";import{decodeTime as qm,monotonicFactory as Gm}from"ulid";import{z as an}from"zod";function nr({event:e,rootDir:t}){try{let n=Ia(t);if(a(n))return n;let o=tp(t,{userId:e.userId,userName:e.userName});if(a(o))return o;let r=ka(t);if(a(r))return i(r.message);let s=r.value?Fa(Math.max(Date.now(),qm(r.value)+1)):Fa(),d=np(Ma(e),[s,r.value]);return a(d)?i(d.message):(Vm.appendFileSync(o.value,`${JSON.stringify(d.value)}
21
- `,"utf8"),c("Event persisted",{path:o.value,entry:d.value}))}catch(n){let o=n instanceof Error?n.message:"Unknown persist error";return i(`Failed to persist event: ${o}`)}}var Oa,Fa,Ba,zm,Ym,Pa,Xm,Jm,Da,Qm,Zm,ep,ce,dn,tp,np,rt=y(()=>{"use strict";A();ke();me();Ta();sn();Rs();Oa=1,Fa=Gm(),Ba=an.tuple([an.string().min(1),an.string().min(1).nullable()]),zm=an.looseObject({v:an.literal(Oa),id:Ba}),Ym=an.looseObject({v:an.number().int().positive(),id:Ba}),Pa=e=>{let t=Ym.safeParse(e);return t.success?c("Parsed persisted event envelope",t.data):i(`Invalid persisted event envelope: ${t.error.issues.map(n=>n.path.join(".")||n.message).join(", ")}`)},Xm=[1],Jm=new Set(Xm),Da=e=>Jm.has(e),Qm=e=>{let t=zm.safeParse(e);return t.success?c("Parsed persisted event",t.data):i(`Invalid persisted event: ${t.error.issues.map(n=>n.path.join(".")||n.message).join(", ")}`)},Zm=e=>/^[0-9A-HJKMNP-TV-Z]{26}$/.test(e),ep=e=>e.trim().length>0&&e.length<=80,ce=()=>{let{userName:e,userId:t}=ae();return e?t?Zm(t)?ep(e)?c("Successfully resolved actor ID",{userId:t,userName:e}):i("Invalid user name in config"):i("Invalid user ID in config"):i("User ID not configured"):i("User name not configured")},dn=({userId:e,userName:t})=>`${Ns(e)}.${Ns(t)}.jsonl`,tp=(e,{userId:t,userName:n})=>{let o=dn({userId:t,userName:n});if(!/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(o))return i(`Invalid event log file name: ${o}`);let s=Km.join(eo(e),o);return c("Successfully resolved event log path",s)},np=(e,t)=>{let n={[e.action]:e.payload,v:Oa,id:t};return Qm(n)}});import{ulid as op}from"ulid";function Ua(e,t){let n=Ut(e);if(n.status!==Pt.Success)return n;let o=nr({event:e,rootDir:t});return a(o)?o:n}function B(e,t){if(e.length===0||!e[0])return i("No events provided");if(g().readOnly)return i(g().readOnlyReason??"Cannot change the board while time travelling");let n=rp(e[0],t);if(a(n))return n;let o=e.map(s=>Ua(s,t)),r=o.filter(a);return r.length>0?i("Materialize and persist failed: "+r.map(s=>s.message).join(", ")):c("Materialization succeeded",o.map(s=>s.value))}var rp,cn=y(()=>{"use strict";A();le();w();Nt();rt();rp=(e,t)=>{if(e.action==="create.contributor"||e.action==="rename.contributor")return c("Contributor write already in flight",void 0);let n=I.getContributor(e.userId),o={id:op(),action:n?"rename.contributor":"create.contributor",payload:{id:e.userId,name:e.userName},userId:e.userId,userName:e.userName};if(n&&(n.tombstoned||n.name===e.userName))return c("Contributor name is current",void 0);let r=Ua(o,t);return a(r)?i(r.message):c("Contributor name recorded",void 0)}});var _a,or,oe,$a,ja,_t,ln,it=y(()=>{"use strict";Qi();cn();A();w();Nn();_a=e=>or(oe(e),{at:"end"}),or=(e,t={at:"end"})=>{let n=r=>a(r)?c("Rank space exhausted",{rank:"",needsRebalance:!0}):c("Resolved rank",{rank:r.value,needsRebalance:!1});if(e.length===0)return n(Pe(void 0,void 0));let o=()=>n(Pe(e[e.length-1]?.rank,void 0));switch(t.at){case"start":{let r=e[0];return r?n(Pe(void 0,r.rank)):i("Unable to resolve first sibling")}case"end":{let r=e[e.length-1];return r?n(Pe(r.rank,void 0)):i("Unable to resolve last sibling")}case"before":{let r=$a(e,t.sibling),s=r<0?void 0:e[r];if(!s)return o();let d=r>0?e[r-1]:void 0;return n(Pe(d?.rank,s.rank))}case"after":{let r=$a(e,t.sibling),s=r<0?void 0:e[r];if(!s)return o();let d=r<e.length-1?e[r+1]:void 0;return n(Pe(s.rank,d?.rank))}}},oe=e=>Object.values(g().nodes).filter(t=>!!t&&!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank)),$a=(e,t)=>e.findIndex(n=>n.id===t),ja=(e,t,n={at:"end"})=>or(oe(t).filter(o=>o.id!==e),n),_t=(e,t,n,o,r)=>{let s=ja(t,e,n);if(a(s))return s;if(!s.value.needsRebalance)return c("Resolved rank",s.value.rank);let d=ss(e,o);if(a(d))return d;let l=B([d.value],r);if(a(l))return l;let u=ja(t,e,n);return a(u)?u:u.value.needsRebalance?i("Rank rebalance failed to create space"):c("Resolved rank after rebalance",u.value.rank)},ln=(e,t,n)=>{let o=_a(e);if(a(o))return o;if(!o.value.needsRebalance)return c("Resolved rank",o.value.rank);let r=ss(e,t);if(a(r))return r;let s=B([r.value],n);if(a(s))return s;let d=_a(e);return a(d)?d:d.value.needsRebalance?i("Rank rebalance failed to create space"):c("Resolved rank after rebalance",d.value.rank)}});var F,Wa,Ha,He=y(()=>{"use strict";w();F={exit(){process.exit(0)},enterChildNode(){let e=g(),t=e.contextNode,n=Math.max(0,e.selectedIndex),o=Z(t.id),r=o[n];r&&(t.context==="FIELD"&&o.length===0||r.context==="COMMENT"||r.context==="TEXT"||F.navigate({contextNode:r,selectedIndex:Z(r.id).length?0:-1}))},enterParentNode(){let{contextNode:e,nodes:t}=g();if(!e.parentNodeId){logger.info("Missing parent node id");return}let n=t[e.parentNodeId];if(!n){logger.error("Parent not found");return}let o=Z(n.id),r=o.findIndex(({id:d})=>d===e.id),s=o.length===0?-1:r>=0?r:0;F.navigate({contextNode:n,selectedIndex:s})},navigateToNextItem:()=>Wa(1),navigateToPreviousItem:()=>Wa(-1),navigateToNextContainer:()=>Ha(1),navigateToPreviousContainer:()=>Ha(-1),navigate:({contextNode:e,selectedIndex:t})=>{E({contextNodeId:e.id,selectedIndex:t})}},Wa=e=>{let{selectedIndex:t,contextNode:n}=g(),o=Z(n.id).length;if(o===0)return;let s=(Math.max(0,t)+e+o)%o;F.navigate({selectedIndex:s,contextNode:n})},Ha=e=>{let{contextNode:t,nodes:n,selectedIndex:o}=g();if(!t.childNavigationAcrossParents)return;if(!t.parentNodeId){logger.error("Missing parent node id");return}let r=n[t.parentNodeId];if(!r)return;let s=Z(r.id),d=s.findIndex(x=>x.id===t.id);if(d<0)return;let l=s.at(d+e)??s.at(0);if(!l)return;let u=Z(l.id),m=Math.max(0,u.length-1),p=Math.min(Math.max(0,o),m),v=u.length?p:-1;F.navigate({contextNode:l,selectedIndex:v})}});var Ka,qa,sp,rr,Ga,Va,ip,za,Ya=y(()=>{"use strict";ie();A();it();w();He();Ka=(e,t)=>t<=0?-1:Math.max(0,Math.min(e,t-1)),qa=()=>{let{contextNode:e,selectedIndex:t,selectedNode:n}=g();return{contextNodeId:e.id,selectedNodeId:n?.id??null,parentNodeId:e.id,selectedIndex:t}},sp=e=>{let t=g().nodes[e];return!!t&&!t.isDeleted&&je(t)&&t.childRenderAxis==="vertical"},rr=(e,t)=>{let{nodes:n}=g(),o=n[e];if(!o||o.isDeleted)return!1;let r=oe(o.id);return F.navigate({contextNode:o,selectedIndex:Ka(t,r.length)}),!0},Ga=e=>{let{nodes:t}=g(),n=t[e];if(!n||n.isDeleted)return!1;let o=n.parentNodeId;if(!o)return rr(n.id,0);let r=t[o];if(!r||r.isDeleted)return!1;let d=oe(r.id).findIndex(l=>l.id===n.id);return d>=0?(F.navigate({contextNode:r,selectedIndex:d}),!0):Ga(r.id)},Va=e=>{let{nodes:t}=g(),n=e,o=new Set;for(;n&&!o.has(n);){if(o.add(n),Ga(n))return!0;n=t[n]?.parentNodeId}return!1},ip=e=>{if(!e)return!1;let t=g().nodes[e];return!!t&&!t.isDeleted},za=e=>{let{nodes:t,rootNodeId:n}=g();if(sp(e.contextNodeId)&&rr(e.contextNodeId,e.selectedIndex))return c("Restored navigation inside text container",null);if(ip(e.selectedNodeId)&&e.selectedNodeId&&Va(e.selectedNodeId))return c("Restored navigation to selected node or ancestor",null);if(rr(e.contextNodeId,e.selectedIndex))return c("Restored navigation to previous container",null);if(e.parentNodeId&&rr(e.parentNodeId,e.selectedIndex))return c("Restored navigation to previous parent",null);if(Va(e.contextNodeId))return c("Restored navigation to previous container or ancestor",null);let o=t[n];if(!o||o.isDeleted)return i("Unable to restore navigation");let r=oe(o.id);return F.navigate({contextNode:o,selectedIndex:Ka(e.selectedIndex,r.length)}),c("Restored navigation to root",null)}});import{monotonicFactory as ap,ulid as pt}from"ulid";function dp(){let e=Oe();if(a(e))return i("Unable to boot. State not initialized");let t=e.value,n=Object.values(t.nodes).find(s=>s.context==="WORKSPACE");if(!n)throw new Error("No workspace found in event log");let[o]=Z(n.id),[r]=o?Z(o.id):[];if(r){let s=t.renderedChildrenIndex?.[r.id]??[];return c("Resolved boot nav target",{contextNode:r,selectedIndex:s.length>0?0:-1})}else return o?c("Resolved boot nav target",{contextNode:o,selectedIndex:0}):n?c("Resolved boot nav target",{contextNode:n,selectedIndex:0}):c("Resolved boot nav target",{contextNode:t.nodes[t.rootNodeId],selectedIndex:0})}function cp(){let e=dp();return a(e)?e:F.navigate(e.value)}function Xa({userId:e,userName:t}){let n=ro(),o=ro(),r=ro(),s=ro(),d=ro(),l=Pe(void 0,void 0);if(a(l))return l;let u=Pe(void 0,void 0);if(a(u))return u;let m=Pe(u.value,void 0);if(a(m))return m;let p=Pe(void 0,void 0);if(a(p))return p;let v=Pe(p.value,void 0);if(a(v))return v;let x=Pe(v.value,void 0);if(a(x))return x;let R=Pe(void 0,void 0);return a(R)?R:c("Created default events",[{id:pt(),userId:e,userName:t,action:"init.workspace",payload:{id:n,name:"Workspace",rank:l.value}},{id:pt(),userId:e,userName:t,action:"create.contributor",payload:{id:e,name:t}},{id:pt(),userId:e,userName:t,action:"add.board",payload:{id:o,name:"Default",parent:n,rank:u.value}},{id:pt(),userId:e,userName:t,action:"add.swimlane",payload:{id:r,name:"Todo",parent:o,rank:p.value}},{id:pt(),userId:e,userName:t,action:"add.swimlane",payload:{id:s,name:"In progress",parent:o,rank:v.value}},{id:pt(),userId:e,userName:t,action:"add.swimlane",payload:{id:d,name:"Done",parent:o,rank:x.value}},{id:pt(),userId:e,userName:t,action:"add.board",payload:{id:Jo,name:"Closed",parent:n,rank:m.value}},{id:pt(),userId:e,userName:t,action:"add.swimlane",payload:{id:ye,name:"Closed",parent:Jo,rank:R.value}},{id:pt(),userId:e,userName:t,action:"lock.node",payload:{id:Jo}},{id:pt(),userId:e,userName:t,action:"lock.node",payload:{id:ye}}])}function Mn(e,t=[]){if(lp())return c("Skipped boot while checked out at a historical point",null);if(!e.length){let s=Ne.workspace("temporary-uninitialized-workspace","Workspace","a0"),d=oo(s);return a(d)?d:(E({hasProjectDefinition:!1,mode:f.DEFAULT}),c("Booted uninitialized workspace placeholder",null))}if(!e.some(s=>s.action==="init.workspace"))return i("Initialized Epiq project has no workspace init event");let n=Et(e),{fatal:o,skipped:r}=nn(n);return o.length>0?i(`Materializing failed:
20
+ `;ho.writeFileSync(e,o,"utf8")}function Ys(e,t,n=!1){let o=vd();if(!o)return;let r=tg.format(...t),s=new Date,l=`[${n?s.toISOString().slice(11,19):s.toISOString()}] ${e} ${r}
21
+ `;ho.mkdirSync(Js.dirname(o),{recursive:!0}),ho.appendFileSync(o,l,"utf8"),zs++,zs>=ng&&(zs=0,og())}var fd,ng,zs,hd,vd,Xs,Y,wt=y(()=>{"use strict";A();le();fd=1e3,ng=50,zs=0,hd=()=>process.env.EPIQ_MCP==="true",vd=()=>{let e=process.cwd(),t=xr(e);return a(t)?hd()?Js.join(process.cwd(),".epiq-mcp.log"):void 0:Js.join(t.value,Ye,"log","epiq.log")};Xs=()=>hd()?process.env.EPIQ_MCP_LOG_LEVEL??"error":process.env.EPIQ_LOG_LEVEL??"debug",Y={info(...e){let t=Xs();(t==="info"||t==="debug")&&Ys("[Info]",e,!1)},debug(...e){Xs()==="debug"&&Ys("[Debug]",e,!0)},error(...e){let t=Xs();if(t==="error"||t==="info"||t==="debug"){let o=e.some(r=>r instanceof Error)?void 0:new Error().stack;Ys("[Error]",[...e,o].filter(Boolean),!1)}}};globalThis.logger=Y});var ne,_n=y(()=>{"use strict";ne={DESCRIPTION:"Description",ASSIGNEES:"Assignees",TAGS:"Tags",HISTORY:"History",COMMENTS:"Comments",ATTACHMENTS:"Attachments"}});var V,vo,qt=y(()=>{"use strict";V=e=>e.slice(-7).toUpperCase(),vo=(e,t)=>{let n=t.replace(/-/g,"").trim().toUpperCase();return n?V(e).includes(n):!0}});var Se,hn=y(()=>{"use strict";pe();qt();Se={workspace:(e,t,n)=>({id:e,title:t,rank:n,isDeleted:!1,props:{},context:F.WORKSPACE,childRenderAxis:"vertical",parentNodeId:null,readonly:!0,log:[]}),board:(e,t,n,o,r=!1)=>({id:e,title:t,rank:o,isDeleted:!1,props:{ref:V(e)},context:F.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:r,log:[]}),swimlane:(e,t,n,o)=>({id:e,title:t,rank:o,isDeleted:!1,props:{},context:F.SWIMLANE,childRenderAxis:"vertical",childNavigationAcrossParents:!0,parentNodeId:n,readonly:!1,log:[]}),field:({id:e,name:t,parentNodeId:n,rank:o,props:r={},childRenderAxis:s="horizontal",isVirtual:d=!1})=>({id:e,title:t,rank:o,isDeleted:!1,props:r,context:F.FIELD,childRenderAxis:s,parentNodeId:n,readonly:!1,log:[],isVirtual:d}),fieldList:({id:e,name:t,parentNodeId:n,rank:o,childRenderAxis:r="horizontal",isVirtual:s=!1})=>({id:e,title:t,rank:o,isDeleted:!1,props:{},context:F.FIELD_LIST,childRenderAxis:r,parentNodeId:n,readonly:!1,log:[],isVirtual:s}),ticket:(e,t,n,o)=>({id:e,title:t,rank:o,isDeleted:!1,props:{ref:V(e)},context:F.TICKET,childRenderAxis:"vertical",parentNodeId:n,readonly:!1,log:[]}),text:({id:e,name:t,parentNodeId:n,rank:o,readonly:r=!0,isVirtual:s=!0})=>({id:e,title:t,rank:o,isDeleted:!1,props:{},context:F.TEXT,childRenderAxis:"vertical",parentNodeId:n,readonly:r,log:[],isVirtual:s}),comment:({id:e,name:t,parentNodeId:n,rank:o,props:r={},readonly:s=!0,isVirtual:d=!0})=>({id:e,title:t,rank:o,isDeleted:!1,props:r,context:F.COMMENT,childRenderAxis:"vertical",parentNodeId:n,readonly:s,log:[],isVirtual:d})}});var rg,be,Ir,Un=y(()=>{"use strict";rg=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[be,Ir]=rg});function Vt(e,t=!1){let n=ug[e.action];if(!n)return i(`Unknown event action "${e.action}", likely created by a newer epiq version. Evt id: ${e.id}`);if(!bt()&&e.action!=="init.workspace")return P(`${e.action} arrived before the workspace was initialized`,e);let o=n(e);if(a(o))return o;let r=lg(e,t);return r||o}var Qs,P,yo,vn,yn,yd,bd,sg,ig,Zs,ag,dg,lt,cg,lg,ug,Mt,kt=y(()=>{"use strict";wt();pe();A();_n();ge();hn();M();ei();Un();Qs=(e,t)=>i(`${t.action.split(".").join(" ")+" failed, "+e.toLowerCase()}. Evt id: ${t.id}`),P=(e,t)=>({...Qs(e,t),convergence:!0}),yo=e=>a(e)&&e.convergence===!0,vn=e=>{let t=e.filter(a);return{fatal:t.filter(n=>!yo(n)),skipped:t.filter(yo)}},yn=e=>{e.length!==0&&Y.info(`Skipped ${e.length} event(s) that could not be applied to this state: ${e.map(t=>t.message).join("; ")}`)},yd=e=>{let t=x.getNode(e);if(!t||!k(t)||t.isDeleted)return null;let n=Er(t);return a(n)?n:null},bd=e=>{if(!Rr())return null;for(let t of e){let n=yd(t);if(n)return n;let o=g().nodes[t]?.parentNodeId;if(!o)continue;let r=yd(o);if(r)return r}return null},sg=(e,t)=>{let n=x.getNode(e);n&&x.updateNode({...n,log:[...n.log??[],t]})},ig=e=>{let t=[e],n=g().nodes[e]?.parentNodeId;return n&&t.push(n),t},Zs=e=>{switch(e.action){case"add.issue.comment":case"edit.issue.comment":case"delete.issue.comment":case"add.issue.attachment":case"delete.issue.attachment":return[e.payload.issue];case"delete.node":case"edit.description":return ig(e.payload.id);case"init.workspace":case"add.workspace":case"add.board":case"add.swimlane":case"add.issue":case"add.field":case"edit.title":case"lock.node":case"move.node":case"close.issue":case"reopen.issue":case"add.issue.tag":case"remove.issue.tag":case"add.issue.assignee":case"remove.issue.assignee":return[e.payload.id];case"rebalance.children":return Object.keys(e.payload.ranks);case"create.tag":case"tombstone.tag":case"restore.tag":case"create.contributor":case"rename.contributor":case"link.contributor.user":default:return[]}},ag=e=>{oe(t=>({...t,eventLog:[...t.eventLog,e]}))},dg=e=>{let t=e.userId,n=e.userName;return!t?.length||!n?.length?Qs("Invalid user ID format",e):c("Valid user",null)},lt=null,cg=e=>{for(let[t,n]of e.nodeLog){let o=x.getNode(t);o&&x.updateNode({...o,log:[...o.log??[],...n]})}return e.appLog.length>0&&oe(t=>({...t,eventLog:[...t.eventLog,...e.appLog]})),bd([...e.virtualNodeIds])},lg=(e,t)=>{let n=dg(e);if(a(n))return n;let o=[...new Set(Zs(e))];if(lt){for(let s of o){if(!t){let d=lt.nodeLog.get(s);d?d.push(e):lt.nodeLog.set(s,[e])}if(Rr()){lt.virtualNodeIds.add(s);let d=g().nodes[s]?.parentNodeId;d&&lt.virtualNodeIds.add(d)}}return t||lt.appLog.push(e),null}t||(o.forEach(s=>sg(s,e)),ag(e));let r=bd(o);return r||null},ug={"init.workspace":e=>{let{id:t,name:n,rank:o}=e.payload,r=Se.workspace(t,n,o),s=bo(r);if(a(s))return Qs(s.message,e);let d=x.createNode(r);return a(d)?P(d.message??"Failed to initialize workspace",e):Fs(d.value)?c("Workspace initialized",{action:e.action,result:d.value}):i("Unexpected create node return value")},"add.workspace":e=>{let{id:t,name:n,rank:o}=e.payload,r=x.createNode(Se.workspace(t,n,o));return a(r)?P(r.message??"Failed to add workspace",e):Fs(r.value)?c("Added workspace",{action:e.action,result:r.value}):i("Unexpected create node return value")},"add.board":e=>{let{id:t,name:n,parent:o,rank:r}=e.payload,s=x.createNode(Se.board(t,n,o,r));return a(s)?P(s.message??"Unable to create board",e):ar(s.value)?c("Added board",{action:e.action,result:s.value}):i("Unexpected create node return value")},"add.swimlane":e=>{let{id:t,name:n,parent:o,rank:r}=e.payload,s=x.createNode(Se.swimlane(t,n,o,r));return a(s)?P(s.message??"Unable to create swimlane",e):ln(s.value)?c("Added swimlane",{action:e.action,result:s.value}):i("Unexpected create node return value")},"add.issue":e=>{let{id:t,name:n,parent:o,rank:r}=e.payload,s=x.createNode(Se.ticket(t,n,o,r));return a(s)?P(s.message??"Unable to create issue",e):k(s.value)?c("Added issue",{action:e.action,result:s.value}):i("Unexpected create node return value")},"add.field":e=>{let{id:t,name:n,parent:o,val:r,rank:s}=e.payload,d=x.createNode(Se.field({id:t,name:n,parentNodeId:o,rank:s,props:{value:r},childRenderAxis:n.includes(ne.DESCRIPTION)?"vertical":"horizontal"}));return a(d)?P(d.message??`Unable to create field: ${n}`,e):Ve(d.value)?c("Added field",{action:e.action,result:d.value}):i("Unexpected create node return value")},"edit.title":e=>{let{id:t,name:n}=e.payload;if(!x.getNode(t))return P(`Unable to locate node with id ${t}`,e);let r=x.renameNode(t,n);return a(r)?P(r.message??"Unable to edit title",e):c("Edited title",{action:e.action,result:r.value})},"delete.node":e=>{let{id:t}=e.payload,n=x.tombstoneNode(t);return a(n)?P(n.message??"Unable to delete node",e):c("Deleted node",{action:e.action,result:n.value})},"create.tag":e=>{let{id:t,name:n}=e.payload,o=x.createTag({id:t,name:n});return a(o)?P(o.message??"Unable to create tag",e):c("Tag added",{action:e.action,result:o.value})},"tombstone.tag":e=>{let{id:t}=e.payload,n=x.tombstoneTag(t);return a(n)?P(n.message??"Unable to delete tag",e):c("Tag tombstoned",{action:e.action,result:n.value})},"restore.tag":e=>{let{id:t,name:n}=e.payload,o=x.restoreTag(t,n);return a(o)?P(o.message??"Unable to restore tag",e):c("Tag restored",{action:e.action,result:o.value})},"create.contributor":e=>{let{id:t,name:n}=e.payload,o=x.createContributor({id:t,name:n});return a(o)?P(o.message??"Unable to create contributor",e):c("Contributor created",{action:e.action,result:o.value})},"rename.contributor":e=>{let{id:t,name:n}=e.payload,o=x.renameContributor(t,n);return a(o)?P(o.message??"Unable to rename contributor",e):c("Contributor renamed",{action:e.action,result:o.value})},"tombstone.contributor":e=>{let{id:t}=e.payload,n=x.tombstoneContributor(t);return a(n)?P(n.message??"Unable to remove contributor",e):c("Contributor tombstoned",{action:e.action,result:n.value})},"restore.contributor":e=>{let{id:t,name:n}=e.payload,o=x.restoreContributor(t,n);return a(o)?P(o.message??"Unable to restore contributor",e):c("Contributor restored",{action:e.action,result:o.value})},"add.issue.tag":e=>{let{id:t,tag:n}=e.payload,o=x.tag(t,n);return a(o)?P(o.message??"Unable to tag issue",e):c("Issue tagged",{action:e.action,result:{tag:n}})},"remove.issue.tag":e=>{let{id:t,tag:n}=e.payload,o=x.untag(t,n);return a(o)?P(o.message??"Unable to untag issue",e):c("Issue untagged",{action:e.action,result:{tag:n}})},"add.issue.assignee":e=>{let{id:t,assignee:n}=e.payload,o=x.assign(t,n);return a(o)?P(o.message??"Unable to assign issue",e):c("Assigned successfully",{action:e.action,result:{assignee:n}})},"remove.issue.assignee":e=>{let{id:t,assignee:n}=e.payload,o=x.unassign(t,n);return a(o)?P(o.message??"Unable to unassign issue",e):c("Issue unassigned",{action:e.action,result:{assignee:n}})},"move.node":e=>{let{id:t,parent:n,rank:o}=e.payload,r=x.moveNodeToRank({id:t,parentId:n,rank:o});return a(r)?P(r.message??"Failed to move node",e):c("Moved node",{action:e.action,result:r.value})},"edit.description":e=>{let{id:t,md:n}=e.payload,o=x.editValue(t,n);return a(o)?P(o.message??"Unable to edit description",e):c("Set node value",{action:e.action,result:o.value})},"close.issue":e=>{let{id:t,parent:n,rank:o}=e.payload,r=x.getNode(t);if(!r)return P("Unable to locate issue",e);if(!k(r))return P("Can only close issues",e);let s=x.getNode(be);if(!s)return P("Unable to locate target swimlane",e);if(n!==s.id)return P("Close target must be closed swimlane",e);let d=x.moveNodeToRank({id:t,parentId:n,rank:o});return a(d)?P(d.message??"Unable to close issue",e):c("Issue closed",{action:e.action,result:{id:t}})},"reopen.issue":e=>{let{id:t,parent:n,rank:o}=e.payload,r=x.getNode(t);if(!r)return P("Unable to locate issue",e);if(!k(r))return P("Can only reopen issues",e);let s=x.getNode(be);if(!s)return P("Unable to locate closed swimlane",e);if(n===s.id)return P("Cannot reopen issue into closed swimlane",e);if(!x.getNode(n))return P("Reopen parent no longer exists",e);let l=x.moveNodeToRank({id:t,parentId:n,rank:o});return a(l)?P(l.message??"Unable to reopen issue",e):c("Issue reopened",{action:e.action,result:{id:t}})},"lock.node":e=>{let{id:t}=e.payload,n=x.lockNode(t);return a(n)?P(n.message??"Unable to lock node",e):c("Node locked",{action:e.action,result:n.value})},"rebalance.children":e=>{let{parent:t,ranks:n}=e.payload;for(let[o,r]of Object.entries(n)){let s=x.getNode(o);if(!s)return P(`Unable to locate node ${o}`,e);if(s.parentNodeId!==t)return P(`Node ${o} is not child of ${t}`,e);let d=x.updateNode({...s,rank:r});if(a(d))return P(d.message??"Unable to rebalance child",e)}return c("Rebalanced children",{action:e.action,result:{parent:t}})},"add.issue.comment":e=>{let{id:t,issue:n,author:o,md:r}=e.payload,s=x.createComment({id:t,issue:n,authorId:o,authorName:x.getContributor(o)?.name??"Unknown",md:r,deleted:!1});return a(s)?P(s.message??"Unable to add comment",e):c("Comment added",{action:e.action,result:{id:t,issue:n,author:o,md:r}})},"edit.issue.comment":e=>{let{id:t,issue:n,md:o}=e.payload,r=x.getComment(t);if(!r)return P("Unable to locate comment",e);if(r.issue!==n)return P("Comment does not belong to issue",e);let s=x.editComment(t,o);return a(s)?P(s.message??"Unable to edit comment",e):c("Comment edited",{action:e.action,result:{id:t,issue:n,md:o}})},"delete.issue.comment":e=>{let{id:t,issue:n}=e.payload,o=x.getComment(t);if(!o)return P("Unable to locate comment",e);if(o.issue!==n)return P("Comment does not belong to issue",e);let r=x.deleteComment(t);return a(r)?P(r.message??"Unable to delete comment",e):c("Comment deleted",{action:e.action,result:{id:t,issue:n}})},"add.issue.attachment":e=>{let{id:t,issue:n,hash:o,ext:r,name:s,bytes:d}=e.payload,l=x.createAttachment({id:t,issue:n,hash:o,ext:r,name:s,bytes:d,deleted:!1});return a(l)?P(l.message??"Unable to add attachment",e):c("Attachment added",{action:e.action,result:{id:t,issue:n,hash:o}})},"delete.issue.attachment":e=>{let{id:t,issue:n}=e.payload,o=x.getAttachment(t);if(!o)return P("Unable to locate attachment",e);if(o.issue!==n)return P("Attachment does not belong to issue",e);let r=x.deleteAttachment(t);return a(r)?P(r.message??"Unable to delete attachment",e):c("Attachment deleted",{action:e.action,result:{id:t,issue:n}})},"link.contributor.user":e=>{let{contributor:t}=e.payload,n=x.linkUserId({contributorId:t,userId:e.userId});return a(n)?P(n.message??"Unable to link contributor",e):c("Contributor linked to user",{action:e.action,result:{contributor:t,userId:e.userId}})}};Mt=e=>{let t=xd(()=>{let n=lt===null;n&&(lt={appLog:[],nodeLog:new Map,virtualNodeIds:new Set});try{let o=e.map(r=>Vt(r));if(n&&lt){let r=cg(lt);if(r)return e.map(()=>r)}return o}finally{n&&(lt=null)}});return a(t)?e.map(()=>i(t.message)):t.value}});import mg from"node:crypto";var $n,Nr,Id,pg,Ed,ti,ni,Sr,gg,Rd,Cr=y(()=>{"use strict";A();$n="EPIQ_USER_NAME",Nr="EPIQ_USER_ID",Id="0123456789ABCDEFGHJKMNPQRSTVWXYZ",pg=26,Ed=80,ti=e=>/^[0-9A-HJKMNP-TV-Z]{26}$/.test(e),ni=e=>e.trim().length>0&&e.length<=Ed,Sr=e=>e.trim().toLowerCase(),gg=e=>{let t=mg.createHash("sha256").update(`epiq:actor:${Sr(e)}`).digest(),n="";for(let o=0;o<pg;o++)n+=Id[(t[o]??0)%Id.length];return n},Rd=(e,t=process.env)=>{let n=(t[$n]??"").trim(),o=(t[Nr]??"").trim();return n?ni(n)?!o&&e.userId&&e.userName&&Sr(e.userName)===Sr(n)?c("Actor override names the configured user",{userId:e.userId,userName:e.userName}):o&&!ti(o)?i(`${Nr} must be 26 characters of Crockford base32`):o&&e.userId&&o===e.userId?i(`${Nr} is the configured user's own id; using it under a different name would rename them on the board`):c("Resolved actor from environment",{userId:o||gg(n),userName:o?n:Sr(n)}):i(`${$n} must be 1-${Ed} characters of text`):o?i(`${Nr} is set without ${$n}`):c("No actor override",null)}});var oi,Nd=y(()=>{"use strict";oi=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/\.jsonl/g,"-jsonl").replace(/^-+|-+$/g,"")||"unknown"});var fg,hg,Sd,Cd,ri=y(()=>{"use strict";fg=["init.workspace","add.workspace","add.board","add.swimlane","add.issue","add.field","edit.title","delete.node","create.tag","tombstone.tag","restore.tag","create.contributor","rename.contributor","tombstone.contributor","restore.contributor","add.issue.assignee","remove.issue.assignee","add.issue.tag","remove.issue.tag","move.node","edit.description","add.issue.comment","edit.issue.comment","delete.issue.comment","add.issue.attachment","delete.issue.attachment","close.issue","reopen.issue","lock.node","rebalance.children","link.contributor.user"],hg=new Set(fg),Sd=e=>hg.has(e),Cd=e=>({action:e.action,payload:e.payload})});import Ar from"node:fs";import Tr from"node:path";import{decodeTime as vg}from"ulid";import{z as si}from"zod";function wr(e,t){let n=go(e);if(!Ar.existsSync(n))return c("No events found",[]);let o=Ar.readdirSync(n).filter(s=>s.endsWith(".jsonl")).map(s=>Tr.join(n,s)),r=[];for(let s of o){let d=Cg(s,t);if(a(d))return i(d.message);r.push(...d.value)}return c("All events loaded",Tg(r))}function Lt(e){let t=[],n=wr(e,t);if(a(n))return i(n.message);let o=ai(n.value,t);return a(o)?i(o.message):(Ag=t,c("Loaded merged events",{events:o.value,unreadable:t}))}function di(e){let t=wr(e);return a(t)?i(t.message):c("Loaded event actors",t.value.map(({userId:n,userName:o})=>({userId:n,userName:o})))}function jn(e){let t=Lt(e);return a(t)?i(t.message):c("Loaded merged events",t.value.events)}function ci(e,t){let n=wr(e);if(a(n))return i(n.message);let{appliedEvents:o,unappliedEvents:r}=wg(n.value,t),s=ai(o);if(a(s))return i(s.message);let d=ai(r);return a(d)?i(d.message):c("Loaded merged events before time",{appliedEvents:s.value,unappliedEvents:d.value})}function Td(e=process.cwd()){let t=wr(e);return a(t)?i(t.message):c("Loaded edge reference",t.value.at(-1)?.id?.[0]??null)}var yg,Ad,bg,xg,Ig,Eg,Rg,Ng,Sg,ai,Cg,Ag,ii,Tg,wg,Kt=y(()=>{"use strict";wt();A();le();ri();ut();yg=si.object({userId:si.string().min(1).default("unknown"),userName:si.string().min(1).default("unknown")}),Ad=e=>{let t=Object.entries(e).filter(([r])=>r!=="id"&&r!=="v"&&r!=="userId"&&r!=="userName");if(t.length!==1)return null;let n=t[0]?.[1];if(typeof n!="object"||n===null)return null;let o=n.id;return typeof o=="string"&&o.length>0?o:null},bg=/^[0-9a-hjkmnp-tv-z]{26}$/i,xg=e=>bg.test(e)?e.toUpperCase():e,Ig=e=>{let t=Tr.basename(e,".jsonl"),n=t.indexOf("."),o=n===-1?t:t.slice(0,n),r=n===-1?void 0:t.slice(n+1),s=yg.safeParse({userId:xg(o),userName:r});return s.success?c("Parsed event file actor",s.data):i(`Invalid event file name ${Tr.basename(e)}: ${s.error.issues.map(d=>d.path.join(".")||d.message).join(", ")}`)},Eg=e=>{let t=Object.keys(e).filter(n=>n!=="id"&&n!=="v");return t.length!==1?i(`Invalid persisted event: expected exactly 1 action key, got ${t.length}`):!t[0]||!(t[0]in e)?i("Invalid persisted event: action key is missing or invalid"):c("Resolved persisted action",t[0])},Rg=(e,t)=>t in e,Ng=({id:e,action:t,payload:n,userId:o,userName:r})=>({id:e,action:t,payload:n,userId:o,userName:r}),Sg=e=>{let{userId:t,userName:n,...o}=e,r=Eg(o);if(a(r))return i(r.message);let s=r.value,d=e.id?.[0];return d?Rg(o,s)?c("Decoded persisted event",Ng({id:d,action:s,payload:o[s],userId:t,userName:n})):i(`Persisted event is missing payload for action: ${s}`):i("Persisted event is missing id")},ai=(e,t)=>{let n=[],o=new Map,r=new Map;for(let s of e){if(!Md(s.v)){r.set(s.v,(r.get(s.v)??0)+1),t?.push({eventId:s.id[0],reason:"unsupported-schema-version",detail:`v${s.v}`,targetNodeId:Ad(s)});continue}let d=Sg(s);if(a(d))return i(`Failed to decode event ${s.id?.[0]??"<unknown>"}: ${d.message}`);let l=d.value.action;if(!Sd(l)){o.set(l,(o.get(l)??0)+1),t?.push({eventId:s.id[0],reason:"unknown-action",detail:l,targetNodeId:Ad(s)});continue}n.push(d.value)}if(o.size>0){let s=[...o.entries()].map(([d,l])=>`${d} (x${l})`).join(", ");Y.info(`Skipped events with unknown actions, likely created by a newer epiq version: ${s}. Upgrade to apply them.`)}if(r.size>0){let s=[...r.entries()].map(([d,l])=>`v${d} (x${l})`).join(", ");Y.info(`Skipped events with unsupported schema versions, created by a newer epiq version: ${s}. Upgrade to apply them.`)}return c("Decoded reconstructed events",n)},Cg=(e,t)=>{if(!Ar.existsSync(e))return c("Event file missing",[]);let n=Ig(e);if(a(n))return i(n.message);let o=Ar.readFileSync(e,"utf8"),r=[],s=Tr.basename(e),d=(l,u)=>{t?.push({eventId:null,reason:"corrupt-line",detail:`${s}:${l} (${u})`,targetNodeId:null})};for(let[l,u]of o.split(`
22
+ `).entries()){let m=u.trim();if(!m)continue;let p;try{p=JSON.parse(m)}catch{d(l+1,"invalid JSON");continue}let f=wd(p);if(a(f)){d(l+1,f.message);continue}r.push({...f.value,userId:n.value.userId,userName:n.value.userName})}return c("Parsed persisted events file",r)};Ag=[];ii=(e,t)=>{let n=e.id[0].localeCompare(t.id[0]);return n!==0?n:JSON.stringify(e).localeCompare(JSON.stringify(t))},Tg=e=>{let t=new Map,n=new Map;for(let m of e){let p=m.id[0],f=m.id[1]??null;t.set(p,m);let I=n.get(f)??[];I.push(m),n.set(f,I)}for(let m of n.values())m.sort(ii);let o=[],r=new Set,s=m=>{let p=[m];for(;p.length>0;){let f=p.pop(),I=f.id[0];if(r.has(I))continue;o.push(f),r.add(I);let N=n.get(I)??[];for(let T=N.length-1;T>=0;T--)p.push(N[T])}},d=n.get(null)??[];for(let m of d)s(m);let l=e.filter(m=>{let p=m.id[0],f=m.id[1]??null;return!r.has(p)&&f!==null&&!t.has(f)}).sort(ii);for(let m of l)s(m);let u=e.filter(m=>!r.has(m.id[0])).sort(ii);for(let m of u)s(m);return o},wg=(e,t)=>{let n=new Set,o=[],r=[];for(let s of e){let d=s.id[0],l=s.id[1],u=!1;try{u=vg(d)<t}catch{u=!1}!u||l&&n.has(l)?(n.add(d),r.push(s)):o.push(s)}return{appliedEvents:o,unappliedEvents:r}}});import Mg from"node:fs";import kg from"node:path";import{decodeTime as Lg,monotonicFactory as Pg}from"ulid";import{z as bn}from"zod";function Mr({event:e,rootDir:t}){try{let n=gd(t);if(a(n))return n;let o=jg(t,{userId:e.userId,userName:e.userName});if(a(o))return o;let r=Td(t);if(a(r))return i(r.message);let s=r.value?kd(Fg(r.value)):kd(),d=Hg(Cd(e),[s,r.value]);return a(d)?i(d.message):(Mg.appendFileSync(o.value,`${JSON.stringify(d.value)}
23
+ `,"utf8"),c("Event persisted",{path:o.value,entry:d.value}))}catch(n){let o=n instanceof Error?n.message:"Unknown persist error";return i(`Failed to persist event: ${o}`)}}var Ld,kd,Dg,Fg,Pd,Bg,Og,wd,_g,Ug,Md,$g,fe,xn,jg,Hg,ut=y(()=>{"use strict";Cr();A();Oe();le();Nd();Kt();ri();Ld=1,kd=Pg(),Dg=0xffffffffffff,Fg=e=>{let t=Date.now(),n;try{n=Lg(e)}catch{return t}return n>=Dg?t:Math.max(t,n+1)},Pd=bn.tuple([bn.string().min(1),bn.string().min(1).nullable()]),Bg=bn.looseObject({v:bn.literal(Ld),id:Pd}),Og=bn.looseObject({v:bn.number().int().positive(),id:Pd}),wd=e=>{let t=Og.safeParse(e);return t.success?c("Parsed persisted event envelope",t.data):i(`Invalid persisted event envelope: ${t.error.issues.map(n=>n.path.join(".")||n.message).join(", ")}`)},_g=[1],Ug=new Set(_g),Md=e=>Ug.has(e),$g=e=>{let t=Bg.safeParse(e);return t.success?c("Parsed persisted event",t.data):i(`Invalid persisted event: ${t.error.issues.map(n=>n.path.join(".")||n.message).join(", ")}`)},fe=()=>{let{userName:e,userId:t}=ye();return e?t?ti(t)?ni(e)?c("Successfully resolved actor ID",{userId:t,userName:e}):i("Invalid user name in config"):i("Invalid user ID in config"):i("User ID not configured"):i("User name not configured")},xn=({userId:e,userName:t})=>`${oi(e)}.${oi(t)}.jsonl`,jg=(e,{userId:t,userName:n})=>{let o=xn({userId:t,userName:n});if(!/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(o))return i(`Invalid event log file name: ${o}`);let s=kg.join(go(e),o);return c("Successfully resolved event log path",s)},Hg=(e,t)=>{let n={[e.action]:e.payload,v:Ld,id:t};return $g(n)}});import{ulid as Wg}from"ulid";function Dd(e,t){let n=Vt(e);if(n.status!==jt.Success)return n;let o=Mr({event:e,rootDir:t});return a(o)?o:n}function B(e,t){if(e.length===0||!e[0])return i("No events provided");if(g().readOnly)return i(g().readOnlyReason??"Cannot change the board while time travelling");let n=Gg(e[0],t);if(a(n))return n;let o=e.map(s=>Dd(s,t)),r=o.filter(a);return r.length>0?i("Materialize and persist failed: "+r.map(s=>s.message).join(", ")):c("Materialization succeeded",o.map(s=>s.value))}var Gg,In=y(()=>{"use strict";A();ge();M();kt();ut();Gg=(e,t)=>{if(e.action==="create.contributor"||e.action==="rename.contributor")return c("Contributor write already in flight",void 0);let n=x.getContributor(e.userId),o={id:Wg(),action:n?"rename.contributor":"create.contributor",payload:{id:e.userId,name:e.userName},userId:e.userId,userName:e.userName};if(n&&(n.tombstoned||n.name===e.userName))return c("Contributor name is current",void 0);let r=Dd(o,t);return a(r)?i(r.message):c("Contributor name recorded",void 0)}});var Fd,kr,ce,Bd,Od,zt,En,ht=y(()=>{"use strict";Va();In();A();M();Bn();Fd=e=>kr(ce(e),{at:"end"}),kr=(e,t={at:"end"})=>{let n=r=>a(r)?c("Rank space exhausted",{rank:"",needsRebalance:!0}):c("Resolved rank",{rank:r.value,needsRebalance:!1});if(e.length===0)return n(_e(void 0,void 0));let o=()=>n(_e(e[e.length-1]?.rank,void 0));switch(t.at){case"start":{let r=e[0];return r?n(_e(void 0,r.rank)):i("Unable to resolve first sibling")}case"end":{let r=e[e.length-1];return r?n(_e(r.rank,void 0)):i("Unable to resolve last sibling")}case"before":{let r=Bd(e,t.sibling),s=r<0?void 0:e[r];if(!s)return o();let d=r>0?e[r-1]:void 0;return n(_e(d?.rank,s.rank))}case"after":{let r=Bd(e,t.sibling),s=r<0?void 0:e[r];if(!s)return o();let d=r<e.length-1?e[r+1]:void 0;return n(_e(s.rank,d?.rank))}}},ce=e=>Object.values(g().nodes).filter(t=>!!t&&!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank)),Bd=(e,t)=>e.findIndex(n=>n.id===t),Od=(e,t,n={at:"end"})=>kr(ce(t).filter(o=>o.id!==e),n),zt=(e,t,n,o,r)=>{let s=Od(t,e,n);if(a(s))return s;if(!s.value.needsRebalance)return c("Resolved rank",s.value.rank);let d=Bs(e,o);if(a(d))return d;let l=B([d.value],r);if(a(l))return l;let u=Od(t,e,n);return a(u)?u:u.value.needsRebalance?i("Rank rebalance failed to create space"):c("Resolved rank after rebalance",u.value.rank)},En=(e,t,n)=>{let o=Fd(e);if(a(o))return o;if(!o.value.needsRebalance)return c("Resolved rank",o.value.rank);let r=Bs(e,t);if(a(r))return r;let s=B([r.value],n);if(a(s))return s;let d=Fd(e);return a(d)?d:d.value.needsRebalance?i("Rank rebalance failed to create space"):c("Resolved rank after rebalance",d.value.rank)}});var O,_d,Ud,Xe=y(()=>{"use strict";M();O={exit(){process.exit(0)},enterChildNode(){let e=g(),t=e.contextNode,n=Math.max(0,e.selectedIndex),o=re(t.id),r=o[n];r&&(t.context==="FIELD"&&o.length===0||r.context==="COMMENT"||r.context==="TEXT"||O.navigate({contextNode:r,selectedIndex:re(r.id).length?0:-1}))},enterParentNode(){let{contextNode:e,nodes:t}=g();if(!e.parentNodeId){logger.info("Missing parent node id");return}let n=t[e.parentNodeId];if(!n){logger.error("Parent not found");return}let o=re(n.id),r=o.findIndex(({id:d})=>d===e.id),s=o.length===0?-1:r>=0?r:0;O.navigate({contextNode:n,selectedIndex:s})},navigateToNextItem:()=>_d(1),navigateToPreviousItem:()=>_d(-1),navigateToNextContainer:()=>Ud(1),navigateToPreviousContainer:()=>Ud(-1),navigate:({contextNode:e,selectedIndex:t})=>{E({contextNodeId:e.id,selectedIndex:t})}},_d=e=>{let{selectedIndex:t,contextNode:n}=g(),o=re(n.id).length;if(o===0)return;let s=(Math.max(0,t)+e+o)%o;O.navigate({selectedIndex:s,contextNode:n})},Ud=e=>{let{contextNode:t,nodes:n,selectedIndex:o}=g();if(!t.childNavigationAcrossParents)return;if(!t.parentNodeId){logger.error("Missing parent node id");return}let r=n[t.parentNodeId];if(!r)return;let s=re(r.id),d=s.findIndex(I=>I.id===t.id);if(d<0)return;let l=s.at(d+e)??s.at(0);if(!l)return;let u=re(l.id),m=Math.max(0,u.length-1),p=Math.min(Math.max(0,o),m),f=u.length?p:-1;O.navigate({contextNode:l,selectedIndex:f})}});var jd,Hd,qg,Lr,Wd,$d,Vg,Gd,qd=y(()=>{"use strict";pe();A();ht();M();Xe();jd=(e,t)=>t<=0?-1:Math.max(0,Math.min(e,t-1)),Hd=()=>{let{contextNode:e,selectedIndex:t,selectedNode:n}=g();return{contextNodeId:e.id,selectedNodeId:n?.id??null,parentNodeId:e.id,selectedIndex:t}},qg=e=>{let t=g().nodes[e];return!!t&&!t.isDeleted&&Ve(t)&&t.childRenderAxis==="vertical"},Lr=(e,t)=>{let{nodes:n}=g(),o=n[e];if(!o||o.isDeleted)return!1;let r=ce(o.id);return O.navigate({contextNode:o,selectedIndex:jd(t,r.length)}),!0},Wd=e=>{let{nodes:t}=g(),n=t[e];if(!n||n.isDeleted)return!1;let o=n.parentNodeId;if(!o)return Lr(n.id,0);let r=t[o];if(!r||r.isDeleted)return!1;let d=ce(r.id).findIndex(l=>l.id===n.id);return d>=0?(O.navigate({contextNode:r,selectedIndex:d}),!0):Wd(r.id)},$d=e=>{let{nodes:t}=g(),n=e,o=new Set;for(;n&&!o.has(n);){if(o.add(n),Wd(n))return!0;n=t[n]?.parentNodeId}return!1},Vg=e=>{if(!e)return!1;let t=g().nodes[e];return!!t&&!t.isDeleted},Gd=e=>{let{nodes:t,rootNodeId:n}=g();if(qg(e.contextNodeId)&&Lr(e.contextNodeId,e.selectedIndex))return c("Restored navigation inside text container",null);if(Vg(e.selectedNodeId)&&e.selectedNodeId&&$d(e.selectedNodeId))return c("Restored navigation to selected node or ancestor",null);if(Lr(e.contextNodeId,e.selectedIndex))return c("Restored navigation to previous container",null);if(e.parentNodeId&&Lr(e.parentNodeId,e.selectedIndex))return c("Restored navigation to previous parent",null);if($d(e.contextNodeId))return c("Restored navigation to previous container or ancestor",null);let o=t[n];if(!o||o.isDeleted)return i("Unable to restore navigation");let r=ce(o.id);return O.navigate({contextNode:o,selectedIndex:jd(e.selectedIndex,r.length)}),c("Restored navigation to root",null)}});import{monotonicFactory as Kg,ulid as xt}from"ulid";function zg(){let e=$e();if(a(e))return i("Unable to boot. State not initialized");let t=e.value,n=Object.values(t.nodes).find(s=>s.context==="WORKSPACE");if(!n)return i("No workspace found in event log");let[o]=re(n.id),[r]=o?re(o.id):[];if(r){let s=t.renderedChildrenIndex?.[r.id]??[];return c("Resolved boot nav target",{contextNode:r,selectedIndex:s.length>0?0:-1})}else return o?c("Resolved boot nav target",{contextNode:o,selectedIndex:0}):c("Resolved boot nav target",{contextNode:n,selectedIndex:0})}function Yg(){let e=zg();return a(e)?e:O.navigate(e.value)}function Vd({userId:e,userName:t}){let n=xo(),o=xo(),r=xo(),s=xo(),d=xo(),l=_e(void 0,void 0);if(a(l))return l;let u=_e(void 0,void 0);if(a(u))return u;let m=_e(u.value,void 0);if(a(m))return m;let p=_e(void 0,void 0);if(a(p))return p;let f=_e(p.value,void 0);if(a(f))return f;let I=_e(f.value,void 0);if(a(I))return I;let N=_e(void 0,void 0);return a(N)?N:c("Created default events",[{id:xt(),userId:e,userName:t,action:"init.workspace",payload:{id:n,name:"Workspace",rank:l.value}},{id:xt(),userId:e,userName:t,action:"create.contributor",payload:{id:e,name:t}},{id:xt(),userId:e,userName:t,action:"add.board",payload:{id:o,name:"Default",parent:n,rank:u.value}},{id:xt(),userId:e,userName:t,action:"add.swimlane",payload:{id:r,name:"Todo",parent:o,rank:p.value}},{id:xt(),userId:e,userName:t,action:"add.swimlane",payload:{id:s,name:"In progress",parent:o,rank:f.value}},{id:xt(),userId:e,userName:t,action:"add.swimlane",payload:{id:d,name:"Done",parent:o,rank:I.value}},{id:xt(),userId:e,userName:t,action:"add.board",payload:{id:Ir,name:"Closed",parent:n,rank:m.value}},{id:xt(),userId:e,userName:t,action:"add.swimlane",payload:{id:be,name:"Closed",parent:Ir,rank:N.value}},{id:xt(),userId:e,userName:t,action:"lock.node",payload:{id:Ir}},{id:xt(),userId:e,userName:t,action:"lock.node",payload:{id:be}}])}function Yt(e,t=[]){if(Xg())return c("Skipped boot while checked out at a historical point",null);if(!e.length){let s=Se.workspace("temporary-uninitialized-workspace","Workspace","a0"),d=bo(s);return a(d)?d:(E({hasProjectDefinition:!1,mode:h.DEFAULT}),c("Booted uninitialized workspace placeholder",null))}if(!e.some(s=>s.action==="init.workspace"))return i("Initialized Epiq project has no workspace init event");let n=Mt(e),{fatal:o,skipped:r}=vn(n);return o.length>0?i(`Materializing failed:
22
24
  ${o.map(s=>s.message).join(`
23
- `)}`):(on(r),cp(),E({hasProjectDefinition:!0}),up(t),c("State booted successfully",null))}var ro,lp,up,sr=y(()=>{"use strict";Bt();He();ne();A();tn();w();Nn();Nt();Tn();ro=ap();lp=()=>{let e=Oe();if(a(e))return!1;let{timeMode:t}=e.value;return t==="peek"||t==="replay"},up=e=>{if(e.length===0)return;let t=[...new Set(e.map(n=>n.detail))].join(", ");J.info(`This build cannot read ${e.length} event(s) in the log (${t}). They are skipped, so anything they changed may be out of date until you upgrade.`)}});import{WebSocket as mp}from"ws";var pp,Ja,Qa=y(()=>{"use strict";pp=new Set,Ja=e=>{let t=JSON.stringify(e);for(let n of pp)n.readyState===mp.OPEN&&n.send(t)}});var ir,ar,dr,Ms,Za,Ve,cr=y(()=>{"use strict";Qa();A();w();ir=e=>{$t()&&(E({syncStatus:e}),Ja({type:"sync-status",payload:e}))},ar=(e="Syncing...")=>{ir({status:"syncing",msg:e})},dr=(e="Synced")=>{ir({status:"synced",msg:e})},Ms=e=>{ir({status:"failed",msg:e})},Za=e=>{ir({status:"offline",msg:e})},Ve=e=>(Ms(e),i(e))});var z,Ls=y(()=>{"use strict";A();z=(e,t)=>(a(t)&&logger.info(`[${e}]:failed`,t.message),t)});import un from"node:fs";import lr from"node:path";var gp,td,ed,fp,ks,vp,hp,yp,so,bp,Ip,ur,nd,od,io,rd,mr=y(()=>{"use strict";A();Bt();jo();Wo();ct();Ot();gp="[epiq:init-repo]",td=async e=>{let t=await tt({args:["rev-parse","--verify","--quiet","HEAD"],cwd:e});if(t.exitCode===0)return c("Initial commit already exists",!1);if(!(t.exitCode===1&&t.stdout.trim()===""&&t.stderr.trim()===""))return i(["Could not determine whether the repository has any commits, so nothing was written.",`git rev-parse exited ${t.exitCode}`,t.stderr.trim()].filter(Boolean).join(`
24
- `));J.info("Creating initial commit");let o=await _({args:["hash-object","-w","-t","tree","/dev/null"],cwd:e});if(a(o))return i(o.message);let r=await _({args:["commit-tree",o.value.stdout.trim(),"-m",gp],cwd:e});if(a(r))return i(r.message);let s=await _({args:["update-ref","HEAD",r.value.stdout.trim()],cwd:e});return a(s)?i(s.message):c("Created initial commit",!0)},ed=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",fp=async e=>{let t=await qo(e);if(a(t))return i(t.message);let n=await ia(e);return a(n)?i(n.message):c("Built sync commit message",`[sync|branch:${ed(t.value)}:sha:${ed(n.value)}]`)},ks=async({repoRoot:e,stateBranchName:t})=>{J.info(`Creating ${t}`);let n=await _({args:["commit-tree",ma,"-m","[epiq:init-state-branch]"],cwd:e});if(a(n))return i(`Failed to create state branch commit
25
- ${n.message}`);let o=n.value.stdout.trim(),r=await _({args:["update-ref",`refs/heads/${t}`,o],cwd:e});return a(r)?i(`Failed to create ${t}
26
- ${r.message}`):c("Created state branch",!0)},vp=async({repoRoot:e,stateBranchName:t})=>{let n=await Ko({repoRoot:e,branch:t});if(a(n))return i(`Ensure local state branch failed
27
- `+n.message);if(n.value)return c("Local state branch already exists",!1);let o=await ds({repoRoot:e});if(a(o))return i(`Ensure local state branch failed
28
- `+o.message);let r=o.value,s=r?await cs({repoRoot:e,branch:t}):c("No remote, no remote state branch",!1);if(a(s))return i(`Ensure local state branch failed
29
- `+s.message);let d=s.value;if(r&&d){let l=await he.fetch({cwd:e,remote:Ze,branch:t});if(a(l))return i(`Failed to fetch ${t} from remote
30
- ${l.message}`)}if(d){let l=await _({args:["branch","--track",t,`${Ze}/${t}`],cwd:e});return a(l)?i(`Failed to create local ${t} from remote
31
- ${l.message}`):c("Created local state branch from remote",!0)}return ks({repoRoot:e,stateBranchName:t})},hp=async({repoRoot:e,branch:t})=>{let n=await _({args:["worktree","list","--porcelain"],cwd:e});if(a(n))return i(n.message);let o=n.value.stdout.split(`
32
- `),r=null;for(let s of o){if(s.startsWith("worktree ")){r=s.slice(9);continue}if(s===`branch refs/heads/${t}`&&r)return c("Found worktree for branch",r)}return c("No worktree found for branch",null)},yp=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let o=Qn(lr.dirname(t));if(a(o))return i(`Failed to create state branch worktree
33
- `+o.message);un.existsSync(t)&&!un.existsSync(lr.join(t,".git"))&&(J.info("Removing broken state branch worktree path"),va(t)),J.info("Creating state branch worktree");let r=await he.worktreeAdd({cwd:e,worktreeRoot:t,branch:n});return a(r)?i(`Failed to create state branch worktree
34
- ${r.message}`):c("Created state branch worktree",!0)},so=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let o=await hp({repoRoot:e,branch:n});if(a(o))return i(o.message);let r=Xn(t),s=o.value?Xn(o.value):null;if(s&&s===r&&un.existsSync(s))return c("State branch already checked out in expected worktree",!1);if(s&&s!==r){J.info("Moving state branch worktree to expected location");let u=await he.worktreeRemove({cwd:e,worktreeRoot:s});if(a(u))return i(`Failed to remove existing state branch worktree
35
- ${u.message}`)}if(s&&!un.existsSync(s)){J.info("Pruning stale state branch worktree");let u=await he.worktreePrune({cwd:e});if(a(u))return i(`Failed to prune stale worktrees
36
- ${u.message}`)}let d=await sa({repoRoot:e,worktreeRoot:t});if(a(d))return i(d.message);let l=un.existsSync(t);if(d.value&&l)return c("State branch worktree already exists",!1);if(d.value&&!l){J.info("Pruning missing registered state branch worktree");let u=await he.worktreePrune({cwd:e});if(a(u))return i(`Failed to prune stale worktrees
37
- ${u.message}`)}return yp({repoRoot:e,stateBranchRoot:t,stateBranchName:n})},bp=async({stateBranchRoot:e,stateBranchName:t})=>{let n=await qo(e);if(a(n))return i(n.message);if(n.value===t)return c("State branch already checked out",!1);(await tt({cwd:e,args:["rebase","--abort"]})).exitCode===0&&J.info("Aborted stale state branch rebase");let r=await he.checkout({cwd:e,branch:t});return a(r)?i(`Failed to checkout ${t}
38
- ${r.message}`):c("Checked out state branch",!0)},Ip=async({repoRoot:e,stateBranchRoot:t})=>{let n=await ls(t);if(a(n))return i(n.message);if(n.value)return c("State branch upstream already configured",!1);let o=await ds({repoRoot:t});if(a(o))return i(o.message);if(!o.value)return c("No remote available for state branch upstream",!1);let r=Rn(e);if(a(r))return r;let s=r.value,d=await cs({repoRoot:t,branch:s});if(a(d))return i(d.message);if(!d.value)return c("Remote state branch missing; upstream will be configured on first push",!1);J.info(`Configuring ${s} upstream`);let l=await he.fetch({cwd:t,remote:Ze,branch:s});if(a(l))return i(`Failed to fetch ${s}
39
- ${l.message}`);let u=await he.setUpstream({cwd:t,branch:s,upstream:`${Ze}/${s}`});return a(u)?i(`Failed to set state branch upstream
40
- ${u.message}`):c("Configured state branch upstream",!0)},ur=async({stateBranchRoot:e,eventFileName:t})=>{let n=pa(t),o=lr.join(e,n);if(!un.existsSync(o))return c("No event file to stage",null);let r=await he.stage({cwd:e,pathspec:[n]});return a(r)?i(`Failed to stage state branch event file
41
- ${r.message}`):c("Staged state branch event file",n)},nd=async({stateBranchRoot:e})=>{let t=ga(),n=lr.join(e,t);if(!un.existsSync(n))return c("No media directory to stage",null);let o=await he.stage({cwd:e,pathspec:[t]});return a(o)?i(`Failed to stage state branch media files
42
- ${o.message}`):c("Staged state branch media files",t)},od=async({repoRoot:e,stateBranchRoot:t,pathspec:n})=>{let o=await fp(e);return a(o)?i(`Create state branch sync commit failed
43
- `+o.message):Cn({cwd:t,message:o.value,pathspec:n})},io=async({repoRoot:e,stateBranchRoot:t})=>{let n=await ls(t);if(a(n))return i(n.message);let o=Rn(e);if(a(o))return o;let r=o.value,s=n.value?await he.push({cwd:t}):await he.push({cwd:t,remote:Ze,branch:r,setUpstream:!0});if(a(s))return i(`Failed during state branch push
44
- ${s.message}`);let d=!`${s.value.stdout}${s.value.stderr}`.includes("Everything up-to-date");return c(d?"Pushed state branch":"Remote already up to date",d)},rd=async({repoRoot:e,stateBranchRoot:t,ensureUpstream:n})=>{let o=!1,r=Rn(e);if(a(r))return r;let s=r.value,d=[zo(),await vp({repoRoot:e,stateBranchName:s}),await so({repoRoot:e,stateBranchRoot:t,stateBranchName:s}),await bp({stateBranchRoot:t,stateBranchName:s}),await ya(t),n?await Ip({stateBranchRoot:t,repoRoot:e}):c("Skipped state branch upstream bootstrap",!1)];for(let l of d){if(a(l))return i(l.message);o=o||!!l.value}return c(n?"Bootstrapped state storage":"Bootstrapped state storage readonly",o)}});var xp,Ep,sd,pr,Ps=y(()=>{"use strict";A();cr();Ls();Wo();ct();Ot();mr();xp=async({cwd:e,ensureUpstream:t})=>{logger.debug("[sync] ensureSyncReady:start",{cwd:e,ensureUpstream:t});let n=z("getRepoRootDir",await dt(e));if(a(n))return i(n.message);let o=n.value;logger.debug("[sync] repo root",o);let r=z("getStateBranchRoot",De({repoRoot:o}));if(a(r))return i(r.message);let s=r.value;logger.debug("[sync] state branch root",s),logger.debug("[sync] bootstrapping state branch storage",{repoRoot:o,stateBranchRoot:s,ensureUpstream:t});let d=z("bootstrapStateBranchStorage",await rd({repoRoot:o,stateBranchRoot:s,ensureUpstream:t}));if(a(d))return i(d.message);logger.debug("[sync] bootstrap result",{bootstrapped:d.value,stateBranchRoot:s}),logger.debug("[sync] checking state branch git operation",{stateBranchRoot:s});let l=z("hasInProgressGitOperation(stateBranchRoot)",await Vo(s));if(a(l))return i(l.message);if(logger.debug("[sync] state branch git operation check result",{inProgress:l.value}),l.value)return logger.info("[sync] state branch git operation in progress"),i("Cannot sync while a git operation is in progress in the state branch");logger.debug("[sync] ensuring state branch layout",{repoRoot:o,stateBranchRoot:s});let u=z("ensureStateBranchLayout",ha(o,s));return a(u)?i(u.message):(logger.debug("[sync] state branch layout ready"),logger.debug("[sync] ensureSyncReady:done",{repoRoot:o,stateBranchRoot:s,bootstrapped:d.value}),c("Sync preconditions satisfied",{repoRoot:o,stateBranchRoot:s,bootstrapped:d.value}))},Ep=async({repoRoot:e,stateBranchRoot:t,ownEventFileName:n})=>{logger.debug("[sync] committing own event file from state branch",{ownEventFileName:n,stateBranchRoot:t}),logger.debug("[sync] staging own event file",{stateBranchRoot:t,ownEventFileName:n});let o=z("stageStateBranchOwnEventFile",await ur({stateBranchRoot:t,eventFileName:n}));if(a(o))return i(o.message);let r=z("stageStateBranchMediaFiles",await nd({stateBranchRoot:t}));if(a(r))return i(r.message);let s=[o.value,r.value].filter(u=>u!==null);if(s.length===0)return c("Nothing to stage",{createdCommit:!1});let d=z("hasStagedChanges(after stage)",await ca(t,s));if(a(d))return i(d.message);if(logger.debug("[sync] state branch change check after stage result",{changed:d.value}),!d.value)return logger.info("[sync] no own event file changes to commit"),c("No own event file changes to commit",{createdCommit:!1});logger.debug("[sync] creating sync commit");let l=z("createStateBranchSyncCommit",await od({repoRoot:e,stateBranchRoot:t,pathspec:s}));return a(l)?i(l.message):(logger.debug("[sync] created sync commit",l.value),c("Committed own event file",{createdCommit:!0,commitSha:l.value}))},sd=e=>{let t=e.createdCommit?"Committed locally, offline":"Offline";return Za(t),c(t,{...e,pulled:!1,pushed:!1,offline:!0})},pr=async({cwd:e=process.cwd(),ownEventFileName:t})=>{if(logger.debug("[sync] syncEpiqWithRemote:start",{cwd:e,ownEventFileName:t}),t.includes("/")||t.includes("\\"))return logger.error("[sync] invalid own event file name: contains path separator",{ownEventFileName:t}),i("Own event file must be a file name, not a path");if(!t.endsWith(".jsonl"))return logger.error("[sync] invalid own event file name: missing .jsonl suffix",{ownEventFileName:t}),i("Own event file must end with .jsonl");ar();let n=z("ensureSyncReady",await xp({cwd:e,ensureUpstream:!0}));if(a(n))return Ve(n.message);let{repoRoot:o,stateBranchRoot:r,bootstrapped:s}=n.value,d=z("isDetachedHead(stateBranchRoot)",await la(r));if(a(d))return Ve(d.message);if(logger.debug("[sync] detached state branch check result",{detached:d.value}),d.value)return Ve("Cannot run :sync while the state branch is in detached HEAD state");let l=!1,u,m=!1,p=!1,v=z("getStateBranch",Rn(o));if(a(v))return Ve(v.message);let x=v.value;logger.debug("[sync] resolved state branch",{stateBranch:x,stateBranchRoot:r});let R=z("commitOwnEventFileToStateBranch",await Ep({repoRoot:o,stateBranchRoot:r,ownEventFileName:t}));if(a(R))return Ve(R.message);l=R.value.createdCommit,u=R.value.commitSha;let S=z("pullBranchRebaseIfPresent",await ms({cwd:r,branch:x}));if(a(S))return us(S.message)?sd({repoRoot:o,stateBranchRoot:r,createdCommit:l,commitSha:u,bootstrapped:s}):Ve(S.message);m=S.value;let T=z("isAheadOfUpstream",await da(r));if(a(T))return Ve(T.message);if(l||s||T.value){logger.info("[sync] pushing state branch",{createdCommit:l,bootstrapped:s,stateBranchRoot:r});let O=z("pushStateBranch",await io({stateBranchRoot:r,repoRoot:o}));if(a(O)&&aa(O.message)){let $=z("pullBranchRebaseIfPresent(retry)",await ms({cwd:r,branch:x}));if(a($))return Ve($.message);m=m||$.value,O=z("pushStateBranch(retry)",await io({stateBranchRoot:r,repoRoot:o}))}if(a(O))return us(O.message)?sd({repoRoot:o,stateBranchRoot:r,createdCommit:l,commitSha:u,bootstrapped:s}):Ve(O.message);p=O.value}if(l){logger.debug("[sync] resolving final sync commit sha",{stateBranchRoot:r});let O=z("git rev-parse HEAD",await _({args:["rev-parse","HEAD"],cwd:r}));if(a(O))return Ve(O.message);u=O.value.stdout.trim(),logger.debug("[sync] final sync commit sha",u)}return dr(p?"Synced and pushed":m||l?"Synced local state":"Already synced"),logger.debug("[sync] syncEpiqWithRemote:done"),c("Synced event logs with state branch",{repoRoot:o,stateBranchRoot:r,createdCommit:l,commitSha:u,pulled:m,pushed:p,bootstrapped:s,offline:!1})}});var gt,gr,Np,id,Ds=y(()=>{"use strict";Ya();sr();sn();rt();ne();A();w();cr();Ls();Ps();gt=null,gr=async()=>{if(logger.debug("[sync] syncAndReloadState enter",{hasPromise:!!gt,currentStatus:g().syncStatus?.status,currentMessage:g().syncStatus?.msg}),gt)return logger.debug("[sync] syncAndReloadState joining existing promise"),gt;logger.debug("[sync] syncAndReloadState creating promise"),gt=Np();try{let e=await gt;return logger.debug("[sync] syncAndReloadState promise resolved",{success:!a(e),message:(a(e),e.message),statusAfterResolve:g().syncStatus?.status,statusMessageAfterResolve:g().syncStatus?.msg}),a(e)&&g().syncStatus?.status==="syncing"&&(logger.debug("[sync] syncAndReloadState correcting stale syncing status"),E({syncStatus:{msg:e.message,status:"failed"}})),e}catch(e){let t=e instanceof Error?e.message:String(e);return logger.error("[sync] syncAndReloadState promise threw",{message:t,error:e}),gt||i(t)}finally{logger.debug("[sync] syncAndReloadState clearing promise",{statusBeforeClear:g().syncStatus?.status,statusMessageBeforeClear:g().syncStatus?.msg}),gt=null}},Np=async()=>{logger.debug("[sync] syncAndReloadStateUnsafe:start",{mode:g().mode,syncStatus:g().syncStatus});let e=id();if(e)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by mode",{mode:g().mode,message:e.message,syncStatus:g().syncStatus}),e;if(gt)return gt;logger.debug("[sync] syncAndReloadState:start");let t=z("resolveActorId",ce());if(a(t)||!t.value)return logger.info("[sync] unable to resolve actor id",{message:a(t)?t.message:"Missing actor id"}),i("Unable to resolve event log path");E({syncStatus:{msg:"Reloading synced state",status:"syncing"}}),logger.debug("[sync] sync status patched to syncing",{syncStatus:g().syncStatus});let n=dn(t.value);logger.debug("[sync] resolved own event file name",{ownEventFileName:n}),logger.debug("[sync] syncEpiqWithRemote:start");let o=z("syncEpiqWithRemote",await pr({ownEventFileName:n}));if(logger.debug("[sync] syncEpiqWithRemote:result",{success:!a(o),message:(a(o),o.message)}),a(o))return logger.error("[sync] syncAndReloadState:sync failed",o.message),E({syncStatus:{msg:"Sync failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after sync failure",{syncStatus:g().syncStatus}),Ve(`Unable to sync state. ${o.message}`);let{stateBranchRoot:r,offline:s}=o.value;logger.debug("[sync] loading merged events after sync",{stateBranchRoot:r});let d=z("loadMergedEvents",rn(r));if(logger.debug("[sync] loadMergedEvents:result",{success:!a(d),message:(a(d),d.message),count:a(d)?void 0:d.value.events.length}),a(d))return E({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after load failure",{syncStatus:g().syncStatus}),i(`Unable to load events. ${d.message}`);logger.debug("[sync] loaded merged events after sync",{count:d.value.events.length});let l=id();if(l)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by late mode check",{mode:g().mode,message:l.message,syncStatus:g().syncStatus}),l;let u=qa(),m=g().filters;if(logger.debug("[sync] captured navigation anchor",{navigationAnchor:u,selectedNodeId:g().selectedNode?.id,contextNodeId:g().contextNode?.id,selectedNodeIsVirtual:g().selectedNode?.isVirtual,contextNodeIsVirtual:g().contextNode?.isVirtual}),!g().selectedNode?.isVirtual&&!g().contextNode?.isVirtual){logger.debug("[sync] bootStateFromEventLog:start",{eventCount:d.value.events.length});let v=z("bootStateFromEventLog",Mn(d.value.events,d.value.unreadable));if(logger.debug("[sync] bootStateFromEventLog:result",{success:!a(v),message:(a(v),v.message)}),a(v))return E({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after boot failure",{syncStatus:g().syncStatus}),i(`Unable to boot synced state. ${v.message}`)}else logger.debug("[sync] skipped bootStateFromEventLog for virtual node",{selectedNodeIsVirtual:g().selectedNode?.isVirtual,contextNodeIsVirtual:g().contextNode?.isVirtual});logger.debug("[sync] booted state from synced events"),E({filters:m}),logger.debug("[sync] restoreNavigationAnchor:start");let p=z("restoreNavigationAnchor",za(u));return logger.debug("[sync] restoreNavigationAnchor:result",{success:!a(p),message:a(p)?p.message:"Navigation restored",selectedNodeId:g().selectedNode?.id,contextNodeId:g().contextNode?.id}),a(p)?(E({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after restore failure",{syncStatus:g().syncStatus}),p):(E({hasProjectDefinition:!0,syncStatus:s?{msg:"Committed locally, offline",status:"offline"}:{msg:"Synced",status:"synced"}}),logger.debug("[sync] syncAndReloadState:done",{syncStatus:g().syncStatus}),c("Synced",!0))},id=()=>g().mode===f.DEFAULT?null:(logger.debug("[sync] failReloadIfNotDefaultMode",{mode:g().mode,syncStatus:g().syncStatus}),E({syncStatus:{msg:"Reload skipped while editing",status:"pending"}}),i("Will not re-materialize if not in default mode, to not lose edit data"))});var Ln,ad,dd,Fs,Os,ao,Bs,Rp,cd,Cp,ld,fr=y(()=>{"use strict";A();ke();w();Ds();Ln=3e3,ad=e=>{let t=Number(e.trim());return!Number.isFinite(t)||!Number.isInteger(t)||t<Ln?null:t},dd=0,Os=!1,ao=!1,Bs=()=>{if(Os)return!0;let e=Oe();return a(e)?!1:e.value.syncStatus.status==="syncing"},Rp=()=>{let e=ae().autoSyncIntervalMs??1e4,t=Date.now()-dd;return Math.max(0,e-t)},cd=()=>{Fs||(Fs=setTimeout(async()=>{if(Fs=void 0,!!$t()){if(Bs()){ao=!0;return}ao=!1,await Cp()}},Rp()))},Cp=async()=>{if(g().readOnly||g().timeMode==="peek"||g().timeMode==="replay")return i("Cannot auto-sync while peeking");if(!$t())return i("Cannot auto-sync before state is initialized");if(Bs())return ao=!0,i("Sync already in progress");Os=!0,dd=Date.now(),E({syncStatus:{msg:"Auto-syncing",status:"syncing"}});try{return await gr()}finally{Os=!1,ao&&cd()}},ld=()=>{$t()&&(ao=!0,!Bs()&&cd())}});var vr,ud,md,pd,co=y(()=>{"use strict";A();Ft();ke();me();vr=()=>{let e=ae(),t=!!e.userName?.trim(),n=!!e.preferredEditor?.trim(),o=e.autoSync===!0||e.autoSync===!1;return{isSetupDone:n&&t&&o,isSetPreferredEditor:n,isSetUserName:t,userName:e.userName,preferredEditor:e.preferredEditor,autoSync:e.autoSync===void 0?null:e.autoSync,isSetAutoSync:o}},ud=()=>{let e=et(process.cwd());if(a(e))return!1;let t=xt(e.value);return bt(t)},md=e=>e===!0?"on":e===!1?"off":null,pd=e=>e==="on"?!0:e==="off"?!1:null});var Te,C,Fe=y(()=>{"use strict";Te={bg:"#1a1b26",fg:"#c8d3ff",grayDark:"#3a3e54",gray:"#46507a",grayLight:"#969bb5",cyan:"#88d5ee",cyanSoft:"#8fe6fb",blue:"#5b8cff",magenta:"#a78bfa",magentaSoft:"#c4b5fd",green:"#8fdc8c",yellow:"#f1c27d",red:"#ff7a90",white:"#ffffff"},C={accent:Te.cyan,accent2:Te.magenta,primary:Te.white,secondary:Te.grayDark,secondary2:Te.grayLight,gray:Te.gray,green:Te.green,yellow:Te.yellow,red:Te.red}});var N,kn,hr=y(()=>{"use strict";Fe();N={red:Te.red,yellow:Te.yellow,green:Te.green,blue:Te.blue,magenta:Te.magenta,cyan:Te.cyan},kn={urgent:N.red,critical:N.red,important:N.red,blocker:N.red,asap:N.red,immediate:N.red,fail:N.red,failure:N.red,broken:N.red,bug:N.red,error:N.red,incident:N.red,outage:N.red,production:N.red,crash:N.red,security:N.red,warning:N.yellow,warn:N.yellow,risky:N.yellow,risk:N.yellow,attention:N.yellow,pending:N.yellow,review:N.yellow,"needs-review":N.yellow,qa:N.yellow,testing:N.yellow,test:N.yellow,validate:N.yellow,verification:N.yellow,staging:N.yellow,check:N.yellow,"follow-up":N.yellow,followup:N.yellow,waiting:N.yellow,blocked:N.yellow,hold:N.yellow,done:N.green,complete:N.green,completed:N.green,success:N.green,ok:N.green,stable:N.green,resolved:N.green,fixed:N.green,closed:N.green,merged:N.green,released:N.green,deployed:N.green,approved:N.green,verified:N.green,working:N.green,healthy:N.green,pass:N.green,passing:N.green,info:N.blue,information:N.blue,note:N.blue,docs:N.blue,documentation:N.blue,doc:N.blue,guide:N.blue,help:N.blue,explanation:N.blue,detail:N.blue,details:N.blue,context:N.blue,design:N.blue,discussion:N.blue,proposal:N.blue,idea:N.blue,feature:N.magenta,enhancement:N.magenta,improvement:N.magenta,refactor:N.magenta,refactoring:N.magenta,cleanup:N.magenta,optimize:N.magenta,optimization:N.magenta,perf:N.magenta,performance:N.magenta,upgrade:N.magenta,migration:N.magenta,modernize:N.magenta,debt:N.magenta,todo:N.cyan,next:N.cyan,planned:N.cyan,plan:N.cyan,future:N.cyan,backlog:N.cyan,investigate:N.cyan,explore:N.cyan,prototype:N.cyan}});var Sp,Ap,jt,Wt,yr,br,lo=y(()=>{"use strict";ie();A();le();w();Sp=e=>e.props.tags??[],Ap=e=>e.props.assignees??[],jt=e=>Sp(e).map(t=>I.getTag(t)).filter(t=>!!t),Wt=e=>Ap(e).map(t=>I.getContributor(t)).filter(t=>!!t),yr=()=>{let{breadCrumb:e,selectedNode:t}=g(),n=[...e,t].find(o=>o?.context==="TICKET");return!n||!L(n)?i("Invalid untag target"):c("Retrieved tags from ticket in breadcrumb",jt(n))},br=()=>{let{breadCrumb:e,selectedNode:t}=g(),n=[...e,t].find(o=>o?.context==="TICKET");return!n||!L(n)?i("Invalid unassign target"):c("Retrieved assignees from ticket in breadcrumb",Wt(n))}});var h,mn=y(()=>{"use strict";h={PALETTE:"?",EXIT:"exit",INIT:"init",HELP:"help",NEW:"new",TAG:"tag",UNTAG:"untag",MOVE:"move",PEEK:"peek",REPLAY:"replay",FILTER:"filter",ASSIGN:"assign",UNASSIGN:"unassign",DELETE:"delete",CLOSE_ISSUE:"close",RE_OPEN_ISSUE:"reopen",COMMENT:"comment",CONFIG:"config",EDIT:"edit",YANK:"yank",SYNC:"sync",EXPORT:"export",COFFEE:"coffee",NONE:""}});var Tp,wp,Mp,Lp,kp,pn,gd,Ir,xr,fd,Pp,Us,uo=y(()=>{"use strict";Tp=/^(\d+)(h|d|w|mo|y)$/,wp=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,Mp=({year:e,month:t,day:n,hour:o=0,minute:r=0})=>{let s=new Date(e,t-1,n,o,r);return s.getFullYear()===e&&s.getMonth()===t-1&&s.getDate()===n&&s.getHours()===o&&s.getMinutes()===r},Lp=(e,t=new Date)=>{let n=e.match(Tp);if(!n)return null;let[,o,r]=n,s=Number(o);if(!Number.isInteger(s)||s<=0)return null;let d=new Date(t);switch(r){case"h":return d.setHours(d.getHours()-s),d;case"d":return d.setDate(d.getDate()-s),d;case"w":return d.setDate(d.getDate()-s*7),d;case"mo":return d.setMonth(d.getMonth()-s),d;case"y":return d.setFullYear(d.getFullYear()-s),d;default:return null}},kp=e=>{let t=e.match(wp);if(!t)return null;let[,n,o,r,s,d]=t,l=Number(n),u=Number(o),m=Number(r),p=s?Number(s):0,v=d?Number(d):0;return Mp({year:l,month:u,day:m,hour:p,minute:v})?new Date(l,u-1,m,p,v):null},pn=e=>{let t=e.trim().toLowerCase();return Lp(t)??kp(t)},gd=/^(\d+)(s|m)?$/,Ir=e=>{let t=e.trim().toLowerCase().match(gd);if(!t)return null;let n=Number(t[1]);return!Number.isInteger(n)||n<=0?null:t[2]==="m"?n*6e4:n*1e3},xr=(e,t)=>{let n=(t??"").trim().split(/\s+/).filter(Boolean),o=n.length>0&&gd.test(n.at(-1))?n.pop():"";return{dateInput:e||n.join(" "),durationInput:o}},fd=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,Pp=[{unit:"h",from:1,to:24},{unit:"d",from:1,to:7},{unit:"w",from:1,to:52},{unit:"mo",from:1,to:12},{unit:"y",from:1,to:5}],Us=(e=Pp)=>{let t=[];for(let{unit:n,from:o,to:r}of e)for(let s=o;s<=r;s++)t.push(`${s}${n}`);return t}});var Dp,re,Ke,be,Fp,Op,$s,js,yd,gn,Er,_s,vd,Bp,Up,mo,hd,_p,$p,jp,pe,Ht=y(()=>{"use strict";fr();co();Tn();ie();le();w();hr();lo();mn();uo();Dp=["BOARD","TICKET","SWIMLANE","COMMENT"],re={EDITOR:"editor",VIEW:"view",USERNAME:"username",AUTOSYNC:"autoSync",SYNC_DEBOUNCE_MS:"syncDebounceMs",ATTACHMENT_MAX_KB:"attachmentMaxKb",LOG_LEVEL:"logLevel"},Ke={TITLE:"title",DESCRIPTION:"description",COMMENT:"comment"},be={REF:"ref",TITLE:"title",DESCRIPTION:"description",TAGS:"tags",ASSIGNEES:"assignees"},Fp=[re.EDITOR,re.VIEW,re.USERNAME,re.AUTOSYNC,re.SYNC_DEBOUNCE_MS,re.ATTACHMENT_MAX_KB,re.LOG_LEVEL],Op=(e=g().selectedNode?.context)=>{switch(e){case"TICKET":return[Ke.TITLE,Ke.DESCRIPTION];case"BOARD":case"SWIMLANE":return[Ke.TITLE];case"COMMENT":return[Ke.COMMENT];default:return[]}},$s=[String(Ln),"5000","15000","30000","60000"],js=["250","500","1000"],yd=["10s","20s","30s","45s"],gn=[h.COFFEE,h.EXIT,h.SYNC,h.HELP,h.EXPORT,h.CONFIG,h.YANK],Er=[h.NEW,h.EDIT,h.DELETE,h.MOVE],_s=[h.TAG,h.UNTAG,h.ASSIGN,h.UNASSIGN,h.CLOSE_ISSUE,h.RE_OPEN_ISSUE,h.EDIT,h.COMMENT],vd=[h.FILTER,h.PEEK,h.REPLAY],Bp={WORKSPACE:[...gn,...Er],BOARD:[...vd,...gn,...Er],SWIMLANE:[...vd,...gn,...Er],TICKET:[...gn,...Er,..._s],FIELD:[...gn,..._s],FIELD_LIST:[...gn,..._s],TEXT:[...gn],COMMENT:[h.EDIT,h.DELETE,h.YANK]},Up=e=>e==="WORKSPACE"?["board"]:["issue","swimlane","board"],mo=({breadCrumb:e,selectedNode:t})=>[...e,t].find(n=>n!=null&&L(n)),hd=e=>e.parentNodeId===ye,_p=({selectedNode:e,breadCrumb:t})=>{let n=Op(e?.context);return mo({breadCrumb:t,selectedNode:e})?n.includes(Ke.DESCRIPTION)?n:[...n,Ke.DESCRIPTION]:n},$p=({selectedNode:e,breadCrumb:t})=>{let n=mo({breadCrumb:t,selectedNode:e});return n?[be.REF,be.TITLE,...n.props?.description?.trim()?[be.DESCRIPTION]:[],...jt(n).length>0?[be.TAGS]:[],...Wt(n).length>0?[be.ASSIGNEES]:[]]:e?[be.REF,be.TITLE]:[]},jp=({selectedNode:e,readOnly:t,breadCrumb:n})=>{let{isSetupDone:o}=vr();if(!o)return[h.HELP,h.CONFIG];if(!ud())return[h.HELP,h.INIT];if(t)return[h.HELP,h.PEEK,h.REPLAY,h.EXPORT,h.CONFIG,h.YANK];let r=e?.context,s=r&&Dp.includes(r),d=[...new Set([...n,e].map(u=>u?.context).flatMap(u=>u?Bp[u]:[]))],l=mo({breadCrumb:n,selectedNode:e});return d.filter(u=>u===h.MOVE?!1:u===h.YANK?!!(l??e):u===h.EDIT?s||!!l:u===h.DELETE?s:u===h.UNTAG?!!(l&&jt(l).length>0):u===h.UNASSIGN?!!(l&&Wt(l).length>0):u===h.RE_OPEN_ISSUE?!!(l&&hd(l)):u===h.CLOSE_ISSUE?!!(l&&!hd(l)):!0)},pe=(e,{contextNode:t,selectedNode:n,readOnly:o,breadCrumb:r}=g())=>{let s=t.context??"WORKSPACE";return{[h.NONE]:jp({breadCrumb:r,readOnly:o,selectedNode:n}),[h.EXIT]:["confirm"],[h.EXPORT]:[],[h.SYNC]:[],[h.INIT]:[],[h.HELP]:[],[h.PEEK]:[...Us(),"now","prev","next"],[h.REPLAY]:[...Us()],[h.EDIT]:_p({selectedNode:n,breadCrumb:r}),[h.YANK]:$p({selectedNode:n,breadCrumb:r}),[h.COMMENT]:[],[h.DELETE]:["confirm"],[h.RE_OPEN_ISSUE]:["confirm"],[h.CLOSE_ISSUE]:["confirm"],[h.MOVE]:["start","confirm","next","previous","to-next","to-previous","cancel"],[h.FILTER]:["tag","assignee","description","title","ref","clear"],[h.TAG]:[...new Set([...Object.keys(kn),...I.getExistingTags()])],[h.UNTAG]:[...yr()?.value?.map(({name:l})=>l)??[]],[h.UNASSIGN]:[...br()?.value?.map(({name:l})=>l)??[]],[h.ASSIGN]:I.getExistingAssignees(),[h.NEW]:Up(s),[h.CONFIG]:[...Fp],[h.COFFEE]:["1","3","5","20","custom"]}[e]??[]}});var bd,Id=y(()=>{"use strict";bd=["vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"]});import{decodeTime as xd}from"ulid";var Ed,fn,po=y(()=>{"use strict";A();Ed=e=>{try{return c("Decoded date",new Date(xd(e)))}catch(t){return i("Decoding failed + "+t.message)}},fn=e=>{if(!e?.id)return null;try{return xd(e.id)}catch{return null}}});import{accessSync as Wp,copyFileSync as Hp,existsSync as Nr,mkdirSync as Nd,readdirSync as Rd,readFileSync as Vp,renameSync as Kp,rmSync as qp,statSync as Cd,unlinkSync as Gp,writeFileSync as zp}from"node:fs";import Pn from"node:path";var Ws,Be,Rr=y(()=>{"use strict";Ws=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string",Be={writeToFile:(e,t)=>{try{let n=Pn.dirname(e);Nr(n)||Nd(n,{recursive:!0});let o=typeof t=="string"?t:JSON.stringify(t,null,2);zp(e,o,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return Vp(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=Be.readFile(e);return t===null?null:JSON.parse(t)}catch(t){return logger.error(`Failed to read JSON at ${e}:`,t),null}},dirExists:e=>{try{return Nr(e)&&Cd(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await Wp(e),!0}catch{return!1}},mkDir:e=>Nd(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=Pn.parse(t);for(;;){let o=Pn.join(t,e);try{if(Nr(o)&&Cd(o).isDirectory())return o}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=Pn.dirname(t)}return null},readFirstJSON(e){try{if(!Be.dirExists(e))return null;let t=Rd(e).filter(o=>o.endsWith(".json")).sort()[0];if(!t)return null;let n=Pn.join(e,t);return Be.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return Be.dirExists(e)?Rd(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{Gp(e)}catch(t){(!Ws(t)||t.code!=="ENOENT")&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{qp(e,{recursive:!0,force:!0})}catch(t){(!Ws(t)||t.code!=="ENOENT")&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(Pn.dirname(t)),!n?.overwrite&&Nr(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{Kp(e,t)}catch(o){if(Ws(o)&&o.code==="EXDEV"){Hp(e,t),this.rmFile(e);return}throw o}}}});import Yp from"node:path";import{z as Rt}from"zod";var Xp,Sd,Jp,Ad,Hs,Vs,Qp,Td,wd,Ye,Md,vn=y(()=>{"use strict";me();A();Rr();Xp={logLevel:"info",userId:"",userName:"",preferredEditor:"",autoSync:!1},Sd=Rt.object({logLevel:Rt.enum(["info","error","debug"]),preferredEditor:Rt.string().optional(),userName:Rt.string().optional(),userId:Rt.string().optional(),autoSync:Rt.boolean().nullable().optional(),autoSyncDebounceMs:Rt.number().optional(),attachmentMaxKb:Rt.number().optional(),viewMode:Rt.enum(["dense","wide"]).optional()}).partial(),Jp="config.json",Ad=zn,Hs=()=>Yp.join(Ad(),Jp),Vs=()=>{try{return Be.mkDir(Ad()),c(`Ensured ~/${Qe} exists`,null)}catch{return i(`Unable to create ~/${Qe}`)}},Qp=e=>{let t;try{t=JSON.parse(e)}catch{return i(`Invalid ~/${Qe}/config.json JSON`)}let n=Sd.safeParse(t??{});return n.success?c("Parsed config",n.data):i(`Invalid ~/${Qe}/config.json shape: ${n.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`)},Td=()=>{let e=Vs();if(a(e))return i(e.message);let t=Hs(),n=Be.readFile(t);return n==null||n.trim()===""?c("No config found, using empty config",{logLevel:"info",autoSync:null,preferredEditor:"",userId:"",userName:"",autoSyncIntervalMs:1e4}):Qp(n)},wd=e=>{let t=Vs();if(a(t))return i(t.message);let n=Sd.safeParse(e);if(!n.success)return i(`Invalid config: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`);let o=Hs();try{return Be.writeToFile(o,JSON.stringify(n.data,null,2)+`
45
- `),c("Config written",null)}catch{return i(`Unable to write ~/${Qe}/config.json`)}},Ye=e=>{let t=Td();if(a(t))return i("Failed to read existing config");let n={...t.value,...e};return wd(n)},Md=()=>{let e=Hs(),t=Vs();if(a(t))return i(`Unable to create ~/${Qe}`);if(!(Be.readFile(e)!==null)){let x=wd(Xp);if(a(x))throw new Error(`Unable to create ~/${Qe}/config.json`)}let o=Td();if(a(o))throw new Error(o.message||"Unable to load settings");let{preferredEditor:r,userName:s,userId:d,autoSync:l,autoSyncDebounceMs:u,attachmentMaxKb:m,logLevel:p,viewMode:v}=o.value;return!s||!d?i(`User name or ID not configured in ~/${Qe}/config.json`):(process.env.EPIQ_LOG_LEVEL=p,c("successfully loaded settings",{logLevel:p??"debug",preferredEditor:r??"",userName:s,userId:d,autoSync:l??!1,autoSyncIntervalMs:u??1e4,attachmentMaxKb:m??null,viewMode:v??"dense"}))}});var go,Ks,fo=y(()=>{"use strict";st();A();me();go=500,Ks=(e,t)=>`${e}.${t}`});import Zp from"zod";var vo,ho,Ld,qs=y(()=>{"use strict";vn();fo();ne();A();Ie();ke();w();vo=50,ho=5e3,Ld=()=>{let e=ee().commandMeta.inputString,t=Zp.coerce.number().int().min(vo).max(ho).safeParse(e);if(!t.success)return i(`Attachment size cap must be ${vo}-${ho} KB (default ${go})`);let n=Ye({attachmentMaxKb:t.data});return a(n)?n:(ze({attachmentMaxKb:t.data}),E({mode:f.DEFAULT}),c(`Attachment size cap set to ${t.data} KB`,null))}});import kd from"chalk";var zs,Pd,Gs,Dd,eg,tg,Fd,ng,og,yo,we,Od,Bd,Cr,rg,sg,Sr,ft=y(()=>{"use strict";hr();zs={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},Pd=(e,t,n)=>Math.max(t,Math.min(n,e)),Gs=(e,t,n)=>e+(t-e)*n,Dd=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},eg=e=>e.toLowerCase().trim(),tg=(e,t,n)=>{let o=t/100,r=n/100,s=(1-Math.abs(2*r-1))*o,d=e/60,l=s*(1-Math.abs(d%2-1)),u=0,m=0,p=0;d>=0&&d<1?(u=s,m=l):d>=1&&d<2?(u=l,m=s):d>=2&&d<3?(m=s,p=l):d>=3&&d<4?(m=l,p=s):d>=4&&d<5?(u=l,p=s):(u=s,p=l);let v=r-s/2;return[Math.round((u+v)*255),Math.round((m+v)*255),Math.round((p+v)*255)]},Fd=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`,ng=(e,t,n)=>{let o=Pd(n,0,1);return[Math.round(Gs(e[0],t[0],o)),Math.round(Gs(e[1],t[1],o)),Math.round(Gs(e[2],t[2],o))]},og=(e,t,n)=>ng(e,t,n),yo=e=>{let t=Dd(e)%360,n=tg(t,zs.stringColor.saturation,zs.stringColor.lightness);return Fd(n)},we=(e,t=kn)=>{let n=eg(e);return n&&t[n]?t[n]:yo(n)},Od=e=>{let t=zs.gradient.stops,n=Pd(e,0,1);if(t.length===0)return[0,0,0];if(t.length===1)return t[0];let o=t.length-1,r=n*o,s=Math.min(Math.floor(r),o-1),d=r-s;return og(t[s],t[s+1],d)},Bd=e=>Fd(Od(e)),Cr=e=>Dd(e.toLowerCase().trim())/4294967295,rg=e=>{let t=Cr(e);return Od(t)},sg=e=>{let[t,n,o]=rg(e);return{normal:r=>kd.bgRgb(t,n,o).black(r),cursor:r=>kd.bgRgb(t,n,o).white.bold(r)}},Sr=e=>sg(e).normal(` ${e} `)});var Ar=y(()=>{"use strict"});import{createHash as ig}from"node:crypto";var ag,dg,Re,Dn=y(()=>{"use strict";ag="0123456789ABCDEFGHJKMNPQRSTVWXYZ",dg=e=>{let t=ig("sha256").update(e).digest(),n=0n;for(let r=0;r<16;r++)n=n<<8n|BigInt(t[r]);let o="";for(let r=0;r<26;r++){let s=BigInt((25-r)*5);o+=ag[Number(n>>s&31n)]}return o},Re=(e,t)=>dg(`${e}:virtual:${t}`)});import Ud from"chalk";var te,Ce,Se,_d=y(()=>{"use strict";ft();Fe();te=e=>Ud.dim(e),Ce=e=>Ud.hex(C.primary)(e),Se=({prefix:e="",wordList:t,postfix:n="",noOfHints:o=100,inputString:r,minLengthForHints:s=1})=>{let d=r.trim();if(d.length<s)return"";let p=[...t.filter(Boolean).filter(v=>v.startsWith(d))].sort((v,x)=>Cr(v)-Cr(x)).slice(0,o).map(v=>Sr(v)).join(" ");return p?`${te(e)}${p}${te(n)}`:""}});var Vt,Tr=y(()=>{"use strict";Vt={None:"none",Invalid:"invalid",Valid:"valid"}});import Wd from"chalk";var cg,$d,se,K,U,Mr,jd,wr,Ys,lg,hn,ug,mg,pg,gg,Hd,Vd=y(()=>{"use strict";fr();co();Id();po();st();A();le();ke();qs();fo();w();ft();Ar();lo();Dn();_d();mn();Tr();Ht();uo();cg=["BOARD","TICKET","SWIMLANE"],$d=()=>{let e=g().selectedNode;if(!e?.context)return U({message:te("Missing target context")});if(cg.includes(e.context))return K();if(e.parentNodeId){let t=g().nodes[e.parentNodeId];if(t?.id===Re(t?.parentNodeId??"","comments"))return K()}return U({message:te("Command not available in this context")})},se="<ENTER> to confirm",K=(e="",t=[])=>({message:te(e),validity:Vt.Valid,completionWordList:t}),U=({message:e,completionWordList:t=[]})=>({validity:Vt.Invalid,message:e,completionWordList:t}),Mr=e=>e.length===0,jd=(e,t)=>{let n=$e(g().breadCrumb,"BOARD");if(a(n))return U({message:Ce("Command is not applicable in this context")});let o=Ed(n.value.id);return a(o)?U({message:Ce(`Unable to ${t}: board id is not a valid ULID`)}):fd({date:e,horizonDate:o.value})?null:U({message:Ce(`nothing to ${t} before ${o.value.toISOString().slice(0,16).replace("T"," ")}`)})},wr=e=>` ${Wd.hex("#000").bgHex(we(e))(` ${e} `)} `,Ys=({modifier:e})=>{let t="confirm";return e===t?K(se):U({message:Mr(e)?te("if you are certain, enter ")+Sr(t):"",completionWordList:[t]})},lg=({list:e,hint:t,onValue:n})=>({modifier:o,inputString:r})=>e.includes(o)?r.trim().length<1?U({message:te(n)}):K():U({message:Mr(o)?t:"",completionWordList:[...e]}),hn=({hint:e,onOk:t})=>({modifier:n,inputString:o})=>Mr(n)&&Mr(o)?U({message:e,completionWordList:[]}):K(t??se),ug=({modifier:e,inputString:t})=>{let n=pe(h.CONFIG);if(!n.includes(e))return U({message:Se({prefix:"... ",wordList:n,inputString:e,minLengthForHints:0}),completionWordList:n});switch(e){case re.EDITOR:{let o=[...bd];return t.trim()?o.includes(t.trim())?K(se):U({message:Se({prefix:"editors: ",wordList:o,inputString:t,minLengthForHints:0}),completionWordList:o}):U({message:Se({prefix:"editors: ",wordList:o,inputString:t,minLengthForHints:0}),completionWordList:o})}case re.VIEW:{let o=["dense","wide"];return o.includes(t.trim())?K(se):U({message:Se({prefix:"view... ",wordList:o,inputString:t,minLengthForHints:0}),completionWordList:o})}case re.USERNAME:return t.trim()?K(se):U({message:Ce("Enter a user name. Saved in ")+Wd.bgBlack("~/.epiq-global/config.json")});case re.LOG_LEVEL:{let o=["debug","error","info"],r=t.trim();return o.includes(r)?K(se):U({message:Se({prefix:"one of: ",wordList:[...o],inputString:r,postfix:" persisted in ~/.epiq-global/config.json",minLengthForHints:0}),completionWordList:[...o]})}case re.AUTOSYNC:{let o=["on","off"],r=ae().autoSync;if(!o.includes(t.trim())){let s=md(r);return U({message:Se({prefix:`should auto-sync (recommended)${s!==null?", currently: "+s:""} `,wordList:o,noOfHints:3,inputString:t,minLengthForHints:0}),completionWordList:o})}return K(se)}case re.ATTACHMENT_MAX_KB:{let o=ae().attachmentMaxKb,r=Number.parseInt(t.trim(),10);if(!t.trim()||Number.isNaN(r)||r<vo||r>ho){let s=Se({prefix:" examples: ",wordList:js,minLengthForHints:0,inputString:t});return U({message:Ce(`provide a size cap in KB (${vo}-${ho}). current: ${o??go} KB.`)+s,completionWordList:js})}return K(se)}case re.SYNC_DEBOUNCE_MS:{let o=ae().autoSyncIntervalMs,r=ad(t);if(!t.trim()||r===null||r<Ln){let s=Se({prefix:" examples: ",wordList:$s,minLengthForHints:0,inputString:t});return U({message:Ce(`provide duration above ${Ln}ms. current duration: ${o}ms.`)+s,completionWordList:$s})}return K(se)}default:return U({message:Ce("Unknown config option"),completionWordList:n})}},mg=({modifier:e,inputString:t})=>{let n=pe(h.EDIT);if(!n.length)return U({message:Ce("Command not available in this context")});if(!n.includes(e)){let o=Se({prefix:"edit... ",wordList:n,inputString:e,minLengthForHints:0});return U({message:o||Ce("Unknown edit option"),completionWordList:n})}switch(e){case Ke.COMMENT:return t.trim()?K(se):U({message:te("write a comment...")});case Ke.TITLE:return K(se);case Ke.DESCRIPTION:{let{preferredEditor:o}=ae();return o?K(te("<ENTER> to edit in ")+o):U({message:"No editor selected"})}default:return U({message:Ce("Unknown edit option"),completionWordList:n})}},pg=({modifier:e})=>{let t=pe(h.YANK);return t.length?t.includes(e)?K(se+te(" and copy to clipboard")):U({message:Se({prefix:"yank... ",wordList:t,inputString:e,minLengthForHints:0}),completionWordList:t}):U({message:Ce("Nothing selected to copy from")})},gg={[h.EXPORT]:()=>K(se+te(", and create export markdown file")),[h.PEEK]:e=>{let t=e.modifier;if(t==="now"||t==="prev"||t==="next")return K(se);let n={message:te("historical state from: '1h', '2d', '23h', '1mo', '2y', 'prev', 'next' or full date as YYYY-MM-DD")},o=t||e.inputString.trim(),r=pn(o);if(!o||!r)return U(n);let s=jd(r,"peek");return s||K(se)},[h.REPLAY]:e=>{let{dateInput:t,durationInput:n}=xr(e.modifier,e.inputString),o={message:te("replay forward from: '1h', '2d', '1mo', '2y' or full date as YYYY-MM-DD, with optional duration (e.g. '2y 30s')")},r=pn(t);if(!t||!r)return U(o);let s=jd(r,"replay");return s||(n&&Ir(n)===null?U({message:Ce("duration must be positive (e.g. 30s, 2m, or a number of seconds)")}):K("<ENTER> to replay board history",n?yd:[]))},[h.EXIT]:()=>K(se+te(" and exit the application")),[h.INIT]:()=>K(se),[h.PALETTE]:()=>K(se),[h.FILTER]:e=>{if(e.modifier==="clear")return K(se);let t=s=>pe(h.FILTER).includes(s);if(!e.modifier||!t(e.modifier))return U({message:Se({wordList:pe(h.FILTER),inputString:e.inputString,minLengthForHints:0}),completionWordList:pe(h.FILTER)});let n=Object.values(g().tags).map(s=>s.name),o=Object.values(g().contributors).map(s=>s.name),r=e.modifier==="tag"?n:e.modifier==="assignee"?o:[];return e.inputString?r.length&&!r.includes(e.inputString.trim())?U({message:Se({prefix:`existing ${e.modifier}s... `,wordList:r,noOfHints:10,inputString:e.inputString,minLengthForHints:0}),completionWordList:r}):K():U({message:Se({prefix:"one of... ",wordList:r,noOfHints:10,inputString:e.inputString,minLengthForHints:0}),completionWordList:r})},[h.NONE]:e=>{let t=pe(h.NONE);return U({message:Se({prefix:"... ",wordList:t,inputString:e.inputString,minLengthForHints:0}),completionWordList:t})},[h.NEW]:e=>lg({list:pe(h.NEW),hint:Se({wordList:pe(h.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[h.HELP]:()=>K(se),[h.EDIT]:mg,[h.COMMENT]:e=>{let t=hn({hint:te(`write a comment (max ${4e3} char)...`),onOk:te(`(${e.inputString.length}/${4e3})`)})(e);return t.validity===Vt.Invalid?t:e.inputString.length>4e3?K(Ce("max input exceeded")):t},[h.CONFIG]:ug,[h.YANK]:pg,[h.DELETE]:e=>{let t=$d();return t.validity==="invalid"?t:Ys(e)},[h.CLOSE_ISSUE]:e=>Ys(e),[h.RE_OPEN_ISSUE]:e=>Ys(e),[h.MOVE]:e=>{let t=$d();return t.validity==="invalid"?t:hn({hint:Se({prefix:"hey hacker! These commands are blocked for you... ",wordList:pe(h.MOVE),noOfHints:10,inputString:e.inputString})})(e)},[h.TAG]:e=>{let n=I.getExistingTags().slice(0,10).map(wr).join("");return hn({hint:n.length?te("create tag or reuse:")+n+te(""):te("create tag ...")})(e)},[h.UNTAG]:e=>{let t=yr();if(a(t))return U({message:Ce("Invalid untag target"),completionWordList:[]});let n=t.value.map(({name:o})=>o).map(wr).slice(0,10);return n.length?hn({hint:te(" ... ")+n.join("")})(e):U({message:Ce("Issue has no tags"),completionWordList:[]})},[h.ASSIGN]:e=>{let t=I.getExistingAssignees().map(wr).slice(0,10);return hn({hint:te("assignees... ")+t.join("")})(e)},[h.UNASSIGN]:e=>{let t=br();if(a(t))return U({message:Ce("Invalid unassign target"),completionWordList:[]});let n=t.value.map(({name:o})=>o).map(wr).slice(0,10);return n.length?hn({hint:te("remove assignee... ")+n.join("")})(e):U({message:Ce("Issue has no assignees"),completionWordList:[]})},[h.SYNC]:()=>K(se),[h.COFFEE]:e=>{let{modifier:t}=e,n=pe(h.COFFEE);return t.length&&t.length<=1&&!n.includes(t)?U({message:te("enter an amount ... "),completionWordList:n.filter(o=>o.startsWith(t))}):hn({hint:Se({prefix:"fuel continued development with ... $ ",wordList:["1"," 3 ","5","20","custom"],inputString:"",minLengthForHints:0}),onOk:"Thank you for your support! \u{1FAE1}"})(e)}},Hd=Object.fromEntries(Object.entries(gg).map(([e,t])=>[e,{validate:(n,o,r)=>t({modifier:o,command:n,inputString:r})}]))});var Lr,Kd=y(()=>{"use strict";Lr=["add","fix","bug","log","run","api","cli","ui","ux","test","mock","stub","sync","hash","sign","fork","push","pull","lock","warn","leak","hang","node","seed","lint","edit","save","load","read","send","drop","swap","wrap","port","host","role","user","auth","flag","diff","perf","docs","todo","task","team","epic","spec","remove","update","change","improve","enhance","refactor","rewrite","redesign","implement","build","create","delete","rename","migrate","upgrade","downgrade","revert","rollback","restore","replace","deprecate","cleanup","simplify","optimize","stabilize","harden","document","clarify","investigate","debug","reproduce","triage","mitigate","remediate","resolve","escalate","verify","validate","benchmark","profile","audit","monitor","instrument","configure","provision","deploy","release","publish","integrate","automate","support","enable","disable","prevent","handle","ensure","prioritize","estimate","schedule","track","install","uninstall","enforce","expose","extract","inject","override","extend","customize","localize","translate","redirect","forward","dispatch","broadcast","subscribe","unsubscribe","register","allocate","reserve","persist","retrieve","archive","expire","refresh","reload","reset","recover","replay","retry","scaffold","bootstrap","finalize","terminate","suspend","resume","cancel","abort","notify","alert","trigger","debounce","frontend","backend","fullstack","infrastructure","architecture","integration","application","environment","framework","platform","service","component","module","gateway","pipeline","container","orchestrator","middleware","endpoint","interface","database","datastore","cache","queue","scheduler","worker","daemon","runtime","library","package","plugin","extension","webhook","microservice","monolith","repository","namespace","cluster","sandbox","tenant","dashboard","console","portal","client","server","browser","mobile","desktop","kernel","driver","protocol","schema","migration","fixture","template","snippet","config","manifest","bundle","exception","incident","defect","regression","degradation","malfunction","instability","intermittent","workaround","failure","outage","crash","freeze","corruption","inconsistency","severity","criticality","diagnostics","analysis","blocker","flaky","timeout","mismatch","misconfiguration","boundary","overflow","underflow","panic","stacktrace","breakage","breaking","oversight","ambiguity","discrepancy","anomaly","authorize","authenticate","confidentiality","availability","accessibility","reliability","compliance","governance","encrypt","decrypt","integrity","traceability","accountability","protection","privileges","permissions","sanitize","escape","vulnerability","exposure","secrets","credentials","certificate","session","cookie","identity","tokenization","rotation","scanning","hardening","threat","exploit","payload","injection","phishing","breach","dependency","orchestrate","synchronize","compatibility","incompatibility","interoperability","observability","telemetry","discovery","registration","coordination","distribution","isolation","virtualization","networking","routing","proxy","firewall","balancer","failover","topology","replica","shard","region","capacity","quota","metrics","logging","tracing","alerting","monitoring","heartbeat","liveness","rollover","serialize","deserialize","initialize","instantiate","propagate","aggregate","consolidate","normalize","standardize","transform","reconcile","correlate","index","partition","enrich","filter","stream","batch","parse","encode","decode","compress","decompress","deduplicate","paginate","query","ingest","export","import","backup","snapshot","mapping","record","dataset","metadata","checksum","rollup","lookup","cursor","truncate","concurrency","parallelism","contention","deadlock","throttle","backpressure","fragmentation","saturation","exhaustion","replicate","redundancy","obsolescence","starvation","overload","latency","throughput","scalability","bottleneck","memoize","prefetch","warmup","autoscale","horizontal","vertical","elasticity","recursion","allocation","leakage","garbage","collection","pooling","buffering","caching","eviction","staleness","modularize","encapsulate","abstraction","extensibility","configurability","maintainability","recoverability","readability","testability","debuggability","reusability","simplicity","consistency","linting","formatting","typecheck","coverage","tooling","scaffolding","boilerplate","technical","cleanliness","naming","comments","docstring","testing","unittest","mocking","stubbing","assertion","smoke","sanity","fuzzing","flakiness","harness","scenario","baseline","performance","functionality","requirement","recommendation","improvement","enhancement","description","acceptance","criteria","deliverable","milestone","iteration","backlog","roadmap","followup","hotfix","patch","changelog","rollout","feature","spike","proposal","specification","priority","sprint","story","subtask","assignee","reviewer","reproduction","context","expected","actual","impact","workflow","version","tracking","discussion","decision","tradeoff","feedback","approval","planning","breakdown","scoping"]});var fg,vg,hg,yg,bg,qd,Gd,zd,Yd=y(()=>{"use strict";A();w();Kd();fg=3,vg=new Set(["the","and","for","are","but","not","you","all","any","can","was","one","our","out","use","this","that","with","have","from","will","your","they","them","then","than","when","what","were","been","into","should","would","could","about"]),hg=e=>{let t=[];for(let n of Object.values(e.nodes)){n.title&&t.push(n.title);let o=n.props;typeof o.description=="string"&&t.push(o.description),typeof o.value=="string"&&t.push(o.value)}for(let n of Object.values(e.tags))t.push(n.name);for(let n of Object.values(e.contributors))t.push(n.name);for(let n of Object.values(e.comments))t.push(n.md);return t},yg=e=>e.toLowerCase().split(/[^a-z0-9]+/).filter(t=>t.length>=fg&&!vg.has(t)&&!/^\d+$/.test(t)),bg=e=>{let t=new Map;for(let s of hg(e))for(let d of yg(s))t.set(d,(t.get(d)??0)+1);let n=[...t.entries()].sort((s,d)=>d[1]-s[1]||s[0].localeCompare(d[0])).map(([s])=>s),o=new Set(n),r=Lr.filter(s=>!o.has(s));return[...n,...r]},qd=Lr,Gd=-1,zd=()=>{let e=Oe();if(a(e))return Lr;let t=e.value,n=t.eventLog.length;return n!==Gd&&(qd=bg(t),Gd=n),qd}});var Xd,Jd,Xs=y(()=>{"use strict";Yi();Ht();mn();Vd();Yd();w();ne();Xd=e=>Object.values(h).includes(e),Jd=(e,t)=>{let n=e.command??"",{modifier:o,target:r,inputString:s}=e,{message:d,validity:l,completionWordList:u}=Hd[n].validate(n,o,s),m=n!==h.PEEK&&n!==h.REPLAY,p=r==="command"||r==="modifier"?pe(n):m?zd():[],{mode:v}=g(),x=v===f.COMMAND_LINE?d??"":"",R=[...u,...p];return{validity:l,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:x,autoCompletion:t?zi(e,R):{hint:"",hints:[],remainder:"",overlap:0}}}});var Qd,Ig,xg,Eg,Zd=y(()=>{"use strict";Xs();Ht();Qd=e=>{let t=e.trimStart(),n=xg(t),o=n[0]??"",r=n[1]??"",s=/\s$/.test(e),d=Eg(e),l=Xd(o)?o:null,u=l!==null,m=o!=="",p=l?pe(l)??[]:[],v=l&&p.includes(r)?r:"",x="word";n.length===0||n.length===1&&!s?x="command":(n.length===1&&s||n.length===2&&!s)&&(x="modifier");let R=s?"":d,S=Ig(t,l,v);return{raw:e,trimmedStart:t,words:n,firstWord:o,lastWord:d,hasCommand:m,command:l,isCommandKeyword:u,isLastWordCompleted:s,modifier:v,target:x,inputToMatch:R,inputString:S}},Ig=(e,t,n)=>{let o=e;return t&&o.startsWith(t)&&(o=o.slice(t.length)),o=o.replace(/^\s+/,""),n&&o.startsWith(n)&&(o=o.slice(n.length),o=o.replace(/^\s+/,"")),o},xg=e=>e.trim()?e.trim().split(/\s+/):[],Eg=e=>e.trimEnd().split(/\s+/).at(-1)??""});import{useSyncExternalStore as cN}from"react";var Fn,Js,On,Ng,ec,vt,bo,Qs,Zs,tc,nc,kr,oc,V,rc,sc,ic,ee,ac,Ie=y(()=>{"use strict";Xs();Zd();A();Tr();Fn=e=>e===Js||e===":",Js=" ",On={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:Vt.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},Ng=new Set,ec=()=>{for(let e of Ng)e()},vt=e=>{let n=e(On),o=Qd(n.value),r=n.cursorPosition===n.value.length;On={...n,commandMeta:Jd(o,r)},ec()},bo=({message:e,status:t})=>{let n=structuredClone(On);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,On=n,ec(),c(e,null)},Qs=e=>{vt(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},Zs=e=>{vt(t=>{let{value:n,cursorPosition:o}=t,r=o;if(e==="left"){for(;r>0&&Fn(n[r-1]);)r--;for(;r>0&&!Fn(n[r-1]);)r--}else{for(;r<n.length&&!Fn(n[r]);)r++;for(;r<n.length&&Fn(n[r]);)r++}return{...t,cursorPosition:r}})},tc=()=>{vt(e=>{let t=e.value.slice(e.cursorPosition),n=Math.max(0,e.cursorPosition-1);return{...e,value:e.value.slice(0,n)+t,cursorPosition:n,commandIsPending:!1}})},nc=()=>{vt(e=>{let{value:t,cursorPosition:n}=e,o=n;for(;o>0&&Fn(t[o-1]);)o--;for(;o>0&&!Fn(t[o-1]);)o--;let r=t.slice(n);return{...e,value:t.slice(0,o)+r,cursorPosition:o,commandIsPending:!1}})},kr=e=>{vt(t=>{let n=Math.max(0,Math.min(t.cursorPosition,t.value.length)),o=t.value.slice(0,n),r=t.value.slice(n),s=e(o,t.commandMeta.autoCompletion),d=s+r,l=Math.max(0,Math.min(s.length,d.length));return{...t,value:d,cursorPosition:l,commandIsPending:!1}})},oc=()=>{vt(e=>({...e,commandIsPending:!0}))},V=e=>{vt(t=>({...t,value:e,cursorPosition:e.length,commandIsPending:!1}))},rc=({addToHistory:e=!0})=>{vt(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1,value:"",cursorPosition:0}))},sc=()=>{vt(e=>{let t=Math.min(e.commandHistoryIndex+1,e.commandHistory.length-1),n=e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},ic=()=>{vt(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},ee=()=>On,ac=()=>{let[e,...t]=On.value.split(Js);return t.join(Js).trim()}});var M,en=y(()=>{"use strict";ne();ji();w();Ie();ke();M={NavPreviousItem:"navPreviousItem",NavNextItem:"navNextItem",NavToPreviousContainer:"navToPreviousContainer",NavToNextContainer:"navToNextContainer",MovePreviousItem:"movePreviousItem",MoveNextItem:"moveNextItem",MoveToPreviousContainer:"moveToPreviousContainer",MoveToNextContainer:"moveToNextContainer",Confirm:"confirm",Exit:"exit",ViewHelp:"viewHelp",HideHelp:"hideHelp",InitMove:"initMove",ConfirmMove:"confirmMove",Delete:"Delete",InitCommandPalette:"initCommandPalette",InitCommandLine:"initCommandLine",ExitCommandLine:"exitCommandLine",CaptureInput:"captureInput",EraseInput:"eraseInput",AddItem:"addItem",GetLastCommandFromHistory:"getLastCommandFromHistory",GetNextCommandFromHistory:"getNextCommandFromHistory",AutoCompleteCommand:"autoCompleteCommand",MoveCursorLeft:"MoveCursorLeft",MoveCursorRight:"MoveCursorRight",MoveCursorLeftOfWord:"MoveCursorLeftOfWord",MoveCursorRightOfWord:"MoveCursorRightOfWord",EraseInputWord:"EraseInputWord",None:"None",Edit:"edit",EditTitle:"editTitle",EditDescription:"editDescription",Yank:"yank",SetViewDense:"SetViewDense",SetViewWide:"SetViewWide"}});var dc,k,ei=y(()=>{"use strict";w();mn();dc=e=>{let{context:t}=g().contextNode;if(!t)return k.None;switch(e){case h.EXIT:return k.Exit;case h.EXPORT:return k.Export;case h.COFFEE:return k.Coffee;case h.INIT:return k.Init;case h.DELETE:return k.Delete;case h.EDIT:return k.Edit;case h.COMMENT:return k.Comment;case h.HELP:return k.ViewHelp;case h.RE_OPEN_ISSUE:return k.ReopenIssue;case h.CLOSE_ISSUE:return k.CloseIssue;case h.TAG:return k.TagTicket;case h.UNTAG:return k.UntagTicket;case h.ASSIGN:return k.AssignUserToTicket;case h.UNASSIGN:return k.UnassignUserFromTicket;case h.NEW:return k.NewItem;case h.FILTER:return k.Filter;case h.MOVE:return k.Move;case h.PEEK:return k.Peek;case h.REPLAY:return k.Replay;case h.CONFIG:return k.Config;case h.YANK:return k.Yank;case h.SYNC:return k.Sync;default:return k.None}},k={Exit:"exit",Init:"init",None:"none",ViewHelp:"view-help",Rename:"rename",Edit:"edit",Delete:"delete",Filter:"filter",Move:"move",Peek:"peek",Replay:"replay",Yank:"yank",Config:"config",NewItem:"add-new-item",TagTicket:"ticket-tag",UntagTicket:"ticket-untag",AssignUserToTicket:"ticket-assign-user",UnassignUserFromTicket:"ticket-unassign-user",CloseIssue:"close-issue",ReopenIssue:"re-open-issue",Comment:"comment-issue",Sync:"sync",Export:"export",Coffee:"coffee"}});import{Text as cc}from"ink";import lc,{useEffect as uc,useState as Rg}from"react";var mc,Ue,Bn=y(()=>{"use strict";w();Fe();mc={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"cmd-line":["\u276F "],palette:["\u276F "]},Ue=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=_e(),o=mc[n]??mc.default,[r,s]=Rg(0);if(uc(()=>{s(0)},[o]),uc(()=>{if(!e)return;let l=setInterval(()=>{s(u=>(u+1)%o.length)},500);return()=>clearInterval(l)},[e,o]),!e)return lc.createElement(cc,null,t);let d=o[r]??o[0]??t;return lc.createElement(cc,{color:C.accent,dimColor:r===1},d)}});import{Box as ti,Text as Cg}from"ink";import Pr from"react";var Kt,Io=y(()=>{"use strict";Fe();Kt=({children:e=[],height:t,selectedIndex:n,itemHeight:o=1,scrollByOne:r=!1})=>{if(e.length===0)return null;let s=Math.max(1,Math.floor(t)),d=Math.max(1,Math.ceil(o)),l=Math.max(1,Math.floor(s/d)),u=Math.max(0,Math.min(n,e.length-1)),m=Math.max(0,e.length-l),p=r?Math.min(m,Math.max(0,u-l+1)):Math.min(m,Math.floor(u/l)*l),v=p+l,x=e.slice(p,v),R=e.length>l,S=s,T=R?Math.max(1,Math.floor(l/e.length*S)):S,O=Math.max(0,S-T),$=Math.max(1,e.length-l),W=R?Math.floor(p/$*O):0;return Pr.createElement(ti,{flexDirection:"row",height:s,width:"100%"},Pr.createElement(ti,{flexDirection:"column",flexGrow:1,height:s},x),Pr.createElement(ti,{flexDirection:"column",width:1,height:S},Array.from({length:S}).map((ve,Ee)=>Pr.createElement(Cg,{key:Ee,color:R&&Ee>=W&&Ee<W+T?C.accent:C.secondary},R?"\u2502":" "))))}});var pc,ni,Sg,Dr,oi=y(()=>{"use strict";w();Sg=()=>{let{eventLog:e=[]}=g();if(ni&&pc===e)return ni;let t=new Set;for(let n of e)n?.userId&&t.add(n.userId);return pc=e,ni=t,t},Dr=e=>Sg().has(e)});import{Text as Ag}from"ink";import Tg from"react";var wg,Mg,Un,Fr=y(()=>{"use strict";hr();ft();le();oi();Dt();wg=e=>e.toLowerCase().trim(),Mg=(e,t=kn)=>{let n=wg(e);return t[n]?t[n]:yo(n)},Un=({id:e,isSelected:t,maxWidth:n})=>{let o=I.getContributor(e);if(!o)return;let r=o.name,s=n===void 0?r:It(r,n);return Tg.createElement(Ag,{underline:t,color:Mg(r)},"@"+s,Dr(e)?"":"\u2197")}});import{Text as Lg}from"ink";import kg from"react";var Or,ri=y(()=>{"use strict";le();Fe();ft();Dt();Or=({id:e,isSelected:t,maxWidth:n})=>{let o=I.getTag(e);if(!o)return;let r=n===void 0?o.name:It(o.name,n);return kg.createElement(Lg,{underline:t,backgroundColor:we(o.name),color:C.secondary}," "+r+" ")}});import{useEffect as Pg,useState as Dg}from"react";var Fg,gc,Br,xo,Og,Bg,_n,Ur=y(()=>{"use strict";ft();Fg=80,gc=1400,Br=new Set,xo=null,Og=e=>(Br.add(e),xo||(xo=setInterval(()=>{for(let t of Br)t()},Fg)),()=>{Br.delete(e),Br.size===0&&xo&&(clearInterval(xo),xo=null)}),Bg=()=>{let e=Date.now()%gc/gc;return e<.5?e*2:(1-e)*2},_n=e=>{let[,t]=Dg(0);return Pg(()=>{if(e)return Og(()=>t(n=>n+1))},[e]),Bd(Bg())}});import{Box as Eo,Text as No}from"ink";import Xe from"react";var _g,fc,$g,jg,vc,hc=y(()=>{"use strict";Fe();Dt();oi();An();lo();Fr();ri();Ur();_g=(e,t,n)=>{if(e.length<=t)return[e,null];let o=e.lastIndexOf(" ",t),r=o>0?o:t;return[e.slice(0,r),It(e.slice(r).trim(),n)]},fc=3,$g=2,jg=(e,t)=>{let n=[],o=0;for(let[r,s]of e.entries()){let d=e.length-r-1,l=d>0?String(d).length+1:0;if(o+s.width+l>t)break;o+=s.width,n.push(s)}return{shown:n,hidden:e.length-n.length}},vc=({width:e,ticket:t,isSelected:n,isFlashing:o=!1})=>{let r=_n(o),s=e-4,d=s-7-1,[l,u]=_g(Ge(t.title),d,s),m=u?null:It(Ge(t.props.description),s)||null,p=jt(t),v=Wt(t).map(T=>({...T,name:T.name})),x=Math.max(1,s-fc),{shown:R,hidden:S}=jg([...p.map(T=>({id:T.id,isTag:!0,width:Math.min(T.name.length,x)+fc})),...v.map(T=>({id:T.id,isTag:!1,width:Math.min(T.name.length,x)+$g+(Dr(T.id)?0:1)}))],s);return Xe.createElement(Eo,{borderStyle:"round",height:5,flexDirection:"column",overflow:"hidden",borderDimColor:!n,borderColor:o?r:n?C.accent:C.secondary,justifyContent:"space-between"},Xe.createElement(Eo,{paddingLeft:1,paddingRight:1,flexDirection:"column"},Xe.createElement(Eo,{justifyContent:"space-between"},Xe.createElement(No,{color:C.primary},l),Xe.createElement(No,{color:C.secondary2,dimColor:!0},nt(t.id))),u&&Xe.createElement(No,{color:C.primary},u),m&&Xe.createElement(No,{color:C.secondary2,dimColor:!0},m)),Xe.createElement(Eo,{flexDirection:"row",paddingLeft:1,paddingRight:1},R.map(T=>Xe.createElement(Eo,{paddingRight:1,key:T.id},T.isTag?Xe.createElement(Or,{id:T.id,maxWidth:x}):Xe.createElement(Un,{id:T.id,maxWidth:x}))),S>0&&Xe.createElement(No,{color:C.secondary2,dimColor:!0},"+",S)))}});import{Box as yn,Text as Ro}from"ink";import qe from"react";var Wg,yc,bc=y(()=>{"use strict";ne();le();Fe();ft();Bn();Ur();Wg=(e,t)=>e.length>t?e.slice(0,Math.max(0,t-1))+"\u2026":e,yc=({index:e,labelWidth:t,width:n,ticket:o,isSelected:r,isFlashing:s=!1,mode:d})=>{let l=_n(s),u=(o.props.tags??[]).map(G=>I.getTag(G)).filter(G=>!!G),m=(o.props.assignees??[]).map(G=>I.getContributor(G)).map(G=>G&&{...G,name:G.name}).filter(G=>!!G),p=1,v=u.length*(1+p),x=m.length*(2+p),R=u.map(G=>qe.createElement(yn,{key:G.id,paddingRight:p},qe.createElement(Ro,{color:we(G.name)},"\u25A0"))),S=m.map(G=>qe.createElement(yn,{key:G.id,paddingRight:p},qe.createElement(Ro,{color:yo(G.name)},"@"+G.name.at(0)))),T=s?l:r?C.accent:d===f.MOVE?C.secondary:C.primary,O=I.getCommentsByIssue(o.id),$=O.length?String(O.length).length+2+p:0,W=O.length?qe.createElement(yn,{paddingRight:p},qe.createElement(Ro,{color:C.accent},"[",O.length,"]")):null,ve=v+x+$,Ee=Math.max(1,n-t-ve-(ve>0?1:0));return qe.createElement(yn,{justifyContent:"space-between"},qe.createElement(yn,null,qe.createElement(yn,{width:t},r?qe.createElement(Ue,{isSelected:!0}):qe.createElement(Ro,{color:"gray",dimColor:!0},String(e+1).padStart(t-1)+" ")),qe.createElement(Ro,{wrap:"truncate",color:T},Wg(o.title,Ee))),qe.createElement(yn,null,R,S,W))}});import Hg from"chalk";import{Box as si,Text as Vg}from"ink";import ht from"react";var Kg,Ic,xc=y(()=>{"use strict";ie();w();Fe();Bn();Io();hc();bc();Ur();Kg=({swimlane:e,isSelected:t,width:n,height:o,isDense:r,isFocused:s,listSelectedIndex:d,mode:l})=>{let{renderedChildrenIndex:u,replay:m}=_e(),p=u[e.id]??[],v=m?new Set(m.flashNodeIds):null,x=v?.has(e.id)??!1,R=_n(x),S=`${e.title} ${Hg.hex(C.secondary2).dim("("+p.length+")")}`,T=3,O=r?1:5,$=s&&d===-1,W=n-3-(r?1:0)-($?2:0),ve=Math.max(2,String(p.length).length+1),Ee=o-T-1,G=ht.createElement(si,{borderStyle:"round",borderColor:C.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1,marginRight:r?1:0},ht.createElement(Ue,{isSelected:t}),ht.createElement(Vg,{bold:!0,color:x?R:t?C.accent:C.primary},S," ",e.readonly?"\u{1F512}":"")),q=(H,Jt)=>{let Qt=s&&d===Jt;if(!L(H))return null;let Hn=v?.has(H.id)??!1;return r?ht.createElement(yc,{key:H.id,index:Jt,labelWidth:ve,width:W,ticket:H,isSelected:Qt,isFlashing:Hn,mode:l}):ht.createElement(vc,{key:H.id,width:W,ticket:H,isSelected:Qt,isFlashing:Hn})};return ht.createElement(si,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?C.accent:C.secondary,paddingRight:0,paddingLeft:r?1:0,height:o},G,ht.createElement(si,null,p.length>0&&ht.createElement(Kt,{selectedIndex:d,height:Ee,itemHeight:O},p.map(q)),$&&ht.createElement(Ue,{isSelected:!0})))},Ic=ht.memo(Kg)});var Ec,Nc,ii=y(()=>{"use strict";tn();Ec=e=>{let t=new Set((e.log??[]).filter(n=>n.action==="delete.issue.comment").map(n=>n.payload.id));return(e.log??[]).filter(n=>n.action==="add.issue.comment"&&n.payload.issue===e.id&&!t.has(n.payload.id)).length},Nc=(e,t,n)=>Ne.comment({id:e.id,parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.id,props:{value:e.md},readonly:!1,isVirtual:!0})});var $n,_r=y(()=>{"use strict";$n=e=>{let t=Date.now()-e,n=[{label:"y",ms:1e3*60*60*24*365},{label:"mo",ms:1e3*60*60*24*30},{label:"w",ms:1e3*60*60*24*7},{label:"d",ms:1e3*60*60*24},{label:"h",ms:1e3*60*60},{label:"m",ms:1e3*60},{label:"s",ms:1e3}];for(let{label:o,ms:r}of n){let s=Math.floor(t/r);if(s>=1)return`${s}${o} ago`}return"just now"}});import{Box as jn,Text as St}from"ink";import Me,{useEffect as qg,useMemo as Gg,useRef as zg}from"react";import{decodeTime as ai}from"ulid";function Cc({ticket:e,width:t,height:n}){let o=Gg(()=>Xg(e),[e]),r=zg([]);qg(()=>(Rc(r.current),r.current=Qg(e,o),()=>{Rc(r.current),r.current=[]}),[e,o]);let{selectedIndex:s}=_e(),l=Math.max(1,n-4),u=Math.max(12,t-32);return o.length===0?Me.createElement(jn,{flexDirection:"column",width:t,height:n,padding:1},Me.createElement(St,{color:C.primary},"No attachments yet."),Me.createElement(jn,{paddingTop:1},Me.createElement(St,{color:C.primary},"Attach images from the browser GUI"),Me.createElement(St,{color:C.accent}," epiq gui "),Me.createElement(St,{color:C.primary},"by dropping or pasting them."))):Me.createElement(jn,{flexDirection:"column",width:t,height:n},Me.createElement(jn,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:C.secondary,borderStyle:"single",paddingBottom:1},Me.createElement(St,{color:C.secondary2},"Attachments (",o.length,") \u2014 enter to open"," ")),Me.createElement(Kt,{height:l,itemHeight:2,selectedIndex:s},o.map((m,p)=>{let v=p===s,x=m.name.length>u?m.name.slice(0,u-1)+"\u2026":m.name;return Me.createElement(jn,{key:m.id,flexDirection:"row",paddingX:1,paddingBottom:1},Me.createElement(St,{color:C.accent},v?"\u276F ":" "),Me.createElement(jn,{paddingLeft:1},Me.createElement(St,{color:C.secondary2},`#${p+1} `),Me.createElement(St,{color:v?C.accent:C.primary},x),Me.createElement(St,{color:C.secondary2}," "+Zg(m.bytes)+" "+$n(ai(m.id)))))})))}var Yg,Xg,Rc,Jg,Qg,Zg,Sc=y(()=>{"use strict";He();_r();ie();A();le();tn();w();Fe();Dn();Io();Yg=e=>Re(e,"attachments"),Xg=e=>I.getAttachmentsByIssue(e.id).sort((t,n)=>ai(t.id)-ai(n.id)),Rc=e=>{for(let t of e)I.deleteNode(t.id)},Jg=(e,t,n)=>Ne.field({id:e.id,name:e.name,parentNodeId:n,rank:String(t).padStart(6,"0"),isVirtual:!0}),Qg=(e,t)=>{let n=I.getNode(Yg(e.id));if(!n||!je(n))return[];let o=t.map((r,s)=>Jg(r,s,n.id)).map(r=>I.createNode(r)).filter(bt).map(({value:r})=>r).filter(je);return t.length>0&&g().selectedIndex<0&&F.navigate({contextNode:n,selectedIndex:0}),o},Zg=e=>`${Math.max(1,Math.round(e/1024))} KB`});import{Box as qt,Text as At}from"ink";import xe,{useEffect as ef,useMemo as tf,useRef as nf}from"react";import{decodeTime as di}from"ulid";function Tc({ticket:e,width:t,height:n}){let o=tf(()=>rf(e),[e]),r=nf([]);ef(()=>(Ac(r.current),r.current=sf(e,o),()=>{Ac(r.current),r.current=[]}),[e,o]);let{selectedIndex:s}=_e(),l=Math.max(1,n-4),u=Math.max(20,t-8);return o.length===0?xe.createElement(qt,{flexDirection:"column",width:t,height:n,padding:1},xe.createElement(At,{color:C.primary},"No comments yet."),xe.createElement(qt,{paddingTop:1},xe.createElement(At,{color:C.primary},"Use"),xe.createElement(At,{color:C.accent}," :comment "),xe.createElement(At,{color:C.primary},"to add the first one."))):xe.createElement(qt,{flexDirection:"column",width:t,height:n},xe.createElement(qt,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:C.secondary,borderStyle:"single",paddingBottom:1},xe.createElement(At,{color:C.secondary2},"Comments (",o.length,") ")),xe.createElement(Kt,{height:l,itemHeight:4,selectedIndex:s},o.map((m,p)=>{let v=p===s;return xe.createElement(qt,{key:m.id,flexDirection:"column",paddingX:1,borderLeft:!1,borderBottom:!1,borderRight:!1,borderColor:C.secondary,borderStyle:"single"},xe.createElement(qt,{flexDirection:"row",paddingBottom:1},xe.createElement(At,{color:C.accent},v?"\u276F ":" "),xe.createElement(qt,{paddingLeft:1},xe.createElement(At,{color:C.secondary2},`#${p+1} `),xe.createElement(Un,{id:m.authorId}),xe.createElement(At,{color:C.secondary2}," "+$n(di(m.id))))),xe.createElement(qt,{paddingLeft:3,paddingBottom:1},xe.createElement(At,{color:C.primary},af(m.md,u))))})))}var of,rf,Ac,sf,af,wc=y(()=>{"use strict";He();_r();ie();A();le();w();Fe();Dn();Fr();Io();ii();of=e=>Re(e,"comments"),rf=e=>I.getCommentsByIssue(e.id).sort((t,n)=>di(t.id)-di(n.id)).map(t=>({id:t.id,issue:t.issue,authorId:t.authorId,authorName:t.authorName,md:t.md})),Ac=e=>{for(let t of e)I.deleteNode(t.id)},sf=(e,t)=>{let n=I.getNode(of(e.id));if(!n||!je(n))return[];let o=t.map((r,s)=>Nc(r,s,n.id)).map(I.createNode).filter(bt).map(({value:r})=>r).filter(Kn);return t.length>0&&g().selectedIndex<0&&F.navigate({contextNode:n,selectedIndex:0}),o},af=(e,t)=>{let n=e.replace(/\s+/g," ").trim();return n.length<=t?n:`${n.slice(0,Math.max(0,t-1))}\u2026`}});import{Box as $r,Text as df}from"ink";import Tt from"react";var Mc,Lc=y(()=>{"use strict";ie();le();Sn();w();Fe();Fr();Bn();ri();Mc=({selectedIndex:e,parent:t,selected:n})=>{let{contextNode:o}=_e(),{title:r}=t,s=t.parentNodeId?I.getNode(t.parentNodeId):void 0,d=s&&L(s)?r===Q.ASSIGNEES?s.props.assignees??[]:r===Q.TAGS?s.props.tags??[]:[]:[];return Tt.createElement($r,{alignItems:"center",paddingTop:1},Tt.createElement($r,{minWidth:12},Tt.createElement(Ue,{isSelected:n}),Tt.createElement(df,{color:n?C.accent:C.secondary2},r,":")),Tt.createElement($r,{flexDirection:"row",marginLeft:1,paddingRight:1},d.map((l,u)=>{let m=o.id===t.id&&u===e;return Tt.createElement($r,{key:`${r}-${l}`,paddingRight:2,minHeight:1},Tt.createElement(Ue,{isSelected:m}),r===Q.ASSIGNEES?Tt.createElement(Un,{isSelected:m,id:l}):r===Q.TAGS?Tt.createElement(Or,{isSelected:m,id:l}):null)})))}});import{Box as jr,Text as ci}from"ink";import wt,{useEffect as cf,useMemo as kc}from"react";var lf,Pc,li,Dc,uf,ui,Fc=y(()=>{"use strict";le();A();tn();w();Fe();Dt();Bn();Io();Nn();lf="\u2029",Pc=(e,t)=>`${e}::inline-line::${t}`,li=new Map,Dc=e=>{let t=li.get(e)??[];li.delete(e);for(let n of t)I.deleteNode(n)},uf=(e,t)=>{Dc(e);let n=[];t.forEach((o,r)=>{let s=We(BigInt(r+1));if(!bt(s))return;let d=I.createNode(Ne.text({id:Pc(e,r),name:`Line ${r+1}`,parentNodeId:e,rank:s.value,props:{value:o},readonly:!0,isVirtual:!0}));bt(d)&&n.push(d.value.id)}),li.set(e,n)},ui=({id:e,label:t,text:n,height:o,selected:r,maxWidth:s})=>{let{selectedIndex:d,contextNode:l}=_e(),u=kc(()=>typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[],[n]),m=kc(()=>u.join("\0"),[u]);cf(()=>(uf(e,u),()=>{Dc(e)}),[e,m]);let p=x=>String(x).replace(/\r?\n/g,""),v=u.map((x,R)=>{let S=l.id===e&&d===R;return wt.createElement(jr,{key:Pc(e,R)},wt.createElement(ci,{color:S?C.primary:C.secondary2,dimColor:!S},`${R+1} `.padStart(5,"\xA0")),wt.createElement(ci,{backgroundColor:S?"gray":void 0},p(x.length?It(x,s-10):lf)))});return wt.createElement(jr,{flexDirection:"column",paddingTop:1},wt.createElement(jr,null,wt.createElement(Ue,{isSelected:r}),wt.createElement(ci,{color:r?C.accent:C.secondary2},t)),wt.createElement(jr,{flexDirection:"row",borderStyle:"round",borderColor:C.secondary,paddingLeft:1,marginLeft:1},wt.createElement(Kt,{scrollByOne:!0,height:o-3,selectedIndex:d,itemHeight:1},v)))}});import{Box as bn,Text as mi}from"ink";import Ae,{useMemo as Co}from"react";var mf,pf,gf,ff,Oc,Bc=y(()=>{"use strict";ie();le();w();Fe();ii();Dn();Sc();wc();Bn();Lc();Fc();mf=e=>Re(e,"description"),pf=e=>Re(e,"comments"),gf=e=>Re(e,"history"),ff=e=>Re(e,"attachments"),Oc=({ticket:e,height:t})=>{let n=Co(()=>Ec(e),[e]),{selectedIndex:o,contextNode:r}=_e(),s=process.stdout.columns||120,d=Co(()=>mf(e.id),[e.id]),l=Co(()=>pf(e.id),[e.id]),u=Co(()=>gf(e.id),[e.id]),m=Co(()=>ff(e.id),[e.id]),p=I.getAttachmentsByIssue(e.id).length,v=r.id===e.id,x=r.id===l||r.parentNodeId===l,R=r.id===u||r.parentNodeId===u,S=r.id===m||r.parentNodeId===m,T=Z(e.id);if(x){let H=t-3;return Ae.createElement(bn,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},Ae.createElement(Tc,{ticket:e,width:s,height:H}))}if(S){let H=t-3;return Ae.createElement(bn,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},Ae.createElement(Cc,{ticket:e,width:s,height:H}))}if(R){let q=I.getNode(u),H=q&&je(q)?q.props.value??"":"",Qt=t-3;return Ae.createElement(bn,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},q?Ae.createElement(ui,{id:q.id,label:"Event log",text:H,selected:!1,maxWidth:s,height:Qt}):null)}let O=T.reduce((q,H)=>Vn(H)||H.id===l||H.id===m||H.id===u?q+1:q,0),$=2,W=3,ve=O,Ee=t-W-ve-$,G=(q,H)=>q.id===d?Ae.createElement(ui,{key:q.id,id:d,label:"Description (press e to edit)",text:e.props.description??"",selected:H,maxWidth:s,height:Ee}):Vn(q)?Ae.createElement(Mc,{key:q.id,parent:q,selected:H,selectedIndex:o}):q.id===l?Ae.createElement(bn,{key:q.id,paddingTop:1},Ae.createElement(Ue,{isSelected:H}),Ae.createElement(mi,{backgroundColor:C.secondary,color:H?C.accent:C.primary},` Comments (${n}) \u203A\u203A `)):q.id===m?Ae.createElement(bn,{key:q.id,paddingTop:1},Ae.createElement(Ue,{isSelected:H}),Ae.createElement(mi,{backgroundColor:C.secondary,color:H?C.accent:C.primary},` Attachments (${p}) \u203A\u203A `)):q.id===u?Ae.createElement(bn,{key:q.id,paddingTop:1},Ae.createElement(Ue,{isSelected:H}),Ae.createElement(mi,{backgroundColor:C.secondary,color:H?C.accent:C.primary}," History \u203A\u203A ")):null;return Ae.createElement(bn,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},T.map((q,H)=>G(q,v&&o===H)))}});import{Box as vf}from"ink";import Wr from"react";var hf,Uc,_c=y(()=>{"use strict";ie();xc();Bc();hf=({swimlanes:e,contextNode:t,selectedIndex:n,breadCrumb:o,mode:r,viewMode:s,height:d,width:l})=>{let u=t.context,m=u===D.TICKET||u===D.FIELD_LIST||u===D.FIELD,p=u===D.BOARD||u===D.SWIMLANE,v=u===D.TICKET?t:o.find(O=>O.context===D.TICKET),x=Math.floor(l/3),R=Math.floor(l/Math.max(e.length,1)),S=Math.min(R,x),T=s==="dense";return Wr.createElement(vf,{flexDirection:"row",height:d},p&&e.map((O,$)=>{let W=t.id===O.id,ve=W?n:-1,Ee=t.context===D.BOARD&&n===$;return Wr.createElement(Ic,{key:O.id,height:d,width:S,swimlane:O,isSelected:Ee,isDense:T,isFocused:W,listSelectedIndex:ve,mode:r})}),m&&v&&Wr.createElement(Oc,{height:d,ticket:v}))},Uc=Wr.memo(hf)});import $c from"node:fs";import yf from"node:path";import bf from"react";import{render as If}from"ink";import{Writable as xf}from"node:stream";var So,Ef,Nf,Rf,Cf,jc,Wc=y(()=>{"use strict";_c();ie();A();w();me();ke();So=e=>String(e).padStart(2,"0"),Ef=e=>{let t=e.getUTCFullYear(),n=So(e.getUTCMonth()+1),o=So(e.getUTCDate()),r=So(e.getUTCHours()),s=So(e.getUTCMinutes()),d=So(e.getUTCSeconds());return`${t}-${n}-${o}_${r}-${s}-${d}`},Nf=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^[-.]+|[-.]+$/g,"").toLowerCase()||"board",Rf=async(e,{width:t,height:n})=>{let o="",r=new xf({write(d,l,u){let m=Cf(d.toString()).trimEnd();m.trim().length>0&&m.includes("\u256D")&&(o=m),u()}});r.columns=t,r.rows=n,r.isTTY=!0;let s=If(e,{stdout:r,debug:!1,exitOnCtrlC:!1,patchConsole:!1,incrementalRendering:!1});return await new Promise(d=>setTimeout(d,0)),s.unmount(),o},Cf=e=>e.replace(/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,""),jc=async()=>{let{viewMode:e}=ae(),{contextNode:t,selectedIndex:n,breadCrumb:o,mode:r,renderedChildrenIndex:s}=g(),d=o.find($=>$.context==="BOARD");if(!d)return i("No board found to export");let l=120,u=40,m=await Rf(bf.createElement(Uc,{height:u,width:l,swimlanes:(s[d.id]??[]).filter($=>$!==void 0&&Zt($)),contextNode:t,selectedIndex:n,breadCrumb:o,viewMode:e??"dense",mode:r}),{width:l,height:u});if(!m)return i("Failed to render board export");let p=Xo(process.cwd());if(a(p))return i("Unable to export, epiq root not found");let v=new Date,x=Ef(v),R=`board_${Nf(d.title)}_${x}.md`,S=ba(p.value);$c.mkdirSync(S,{recursive:!0});let T=yf.join(S,R),O=`# Board - ${d.title}
46
- Date: ${v.toISOString()}
25
+ `)}`):(yn(r),Yg(),E({hasProjectDefinition:!0}),Jg(t),c("State booted successfully",null))}var xo,Xg,Jg,Io=y(()=>{"use strict";wt();Xe();de();A();hn();M();Bn();kt();Un();xo=Kg();Xg=()=>{let e=$e();if(a(e))return!1;let{timeMode:t}=e.value;return t==="peek"||t==="replay"},Jg=e=>{if(e.length===0)return;let t=e.filter(o=>o.reason==="corrupt-line"),n=e.filter(o=>o.reason!=="corrupt-line");if(n.length>0){let o=[...new Set(n.map(r=>r.detail))].join(", ");Y.info(`This build cannot read ${n.length} event(s) in the log (${o}). They are skipped, so anything they changed may be out of date until you upgrade.`)}if(t.length>0){let o=[...new Set(t.map(r=>r.detail))].join(", ");Y.info(`Skipped ${t.length} corrupt line(s) in the event log (${o}). The rest of the board loaded normally; those events are unrecoverable.`)}}});import{WebSocket as Qg}from"ws";var Zg,Kd,zd=y(()=>{"use strict";Zg=new Set,Kd=e=>{let t=JSON.stringify(e);for(let n of Zg)n.readyState===Qg.OPEN&&n.send(t)}});var Pr,Dr,Fr,li,Yd,Me,Br=y(()=>{"use strict";zd();A();M();Pr=e=>{bt()&&(E({syncStatus:e}),Kd({type:"sync-status",payload:e}))},Dr=(e="Syncing...")=>{Pr({status:"syncing",msg:e})},Fr=(e="Synced")=>{Pr({status:"synced",msg:e})},li=e=>{Pr({status:"failed",msg:e})},Yd=e=>{Pr({status:"offline",msg:e})},Me=e=>(li(e),i(e))});var Eo,J,Or=y(()=>{"use strict";A();Eo=(e,t)=>(logger.error(`[boot:${e}] ${t}`),i(`[boot:${e}] ${t}`)),J=(e,t)=>(a(t)&&logger.info(`[${e}]:failed`,t.message),t)});import ui from"node:fs";import Xd from"node:path";var _r,Jd,ef,tf,Qd,Zd=y(()=>{"use strict";at();A();le();_r=e=>e.split(`
26
+ `).filter(t=>t.trim().length>0),Jd=e=>{let t=Xd.join(e,Ye,fn);try{if(!ui.existsSync(t))return c("No events directory",[]);let n=ui.readdirSync(t).filter(o=>o.endsWith(".jsonl")).filter(o=>_r(ui.readFileSync(Xd.join(t,o),"utf8")).length>0);return c("Looked for stranded event logs",n)}catch(n){return i(`Unable to check ${t} for event logs before deleting it: ${n instanceof Error?n.message:String(n)}`)}},ef=(e,t)=>{let n=new Set(_r(t));return _r(e).filter(o=>!n.has(o))},tf=(e,t,n)=>[`Refusing to commit ${e}: it is missing ${t.length} of the ${n} event(s) already committed.`,"","The event log is append-only, so a line can never legitimately go","missing. The working copy on disk is damaged; committing it would","publish that damage to everyone who pulls, and the log carries no way","to undo it.","","Nothing has been committed. The committed history is intact \u2014 recover","the file from it before syncing again:",` git show HEAD:${e}`,"","First dropped event:",` ${t[0]?.slice(0,200)??"<none>"}`].join(`
27
+ `),Qd=async({stateBranchRoot:e,relativePath:t,workingContent:n})=>{let o=await Ue({args:["show",`HEAD:${t}`],cwd:e});if(o.exitCode!==0)return c("No committed log to compare against",void 0);let r=ef(o.stdout,n);return r.length>0?i(tf(t,r,_r(o.stdout).length)):c("Event log only grew",void 0)}});import Pt from"node:fs";import Ro from"node:path";var nf,tc,ec,of,mi,pi,rf,sf,Rn,af,df,Ur,nc,oc,rc,No,sc,So=y(()=>{"use strict";A();wt();gr();lo();Zd();ct();at();nf="[epiq:init-repo]",tc=async e=>{let t=await Ue({args:["rev-parse","--verify","--quiet","HEAD"],cwd:e});if(t.exitCode===0)return c("Initial commit already exists",!1);if(!(t.exitCode===1&&t.stdout.trim()===""&&t.stderr.trim()===""))return i(["Could not determine whether the repository has any commits, so nothing was written.",`git rev-parse exited ${t.exitCode}`,t.stderr.trim()].filter(Boolean).join(`
28
+ `));Y.info("Creating initial commit");let o=await j({args:["hash-object","-w","-t","tree","/dev/null"],cwd:e});if(a(o))return i(o.message);let r=await j({args:["commit-tree",o.value.stdout.trim(),"-m",nf],cwd:e});if(a(r))return i(r.message);let s=await j({args:["update-ref","HEAD",r.value.stdout.trim()],cwd:e});return a(s)?i(s.message):c("Created initial commit",!0)},ec=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",of=async e=>{let t=await vr(e);if(a(t))return i(t.message);let n=await Za(e);return a(n)?i(n.message):c("Built sync commit message",`[sync|branch:${ec(t.value)}:sha:${ec(n.value)}]`)},mi=async({repoRoot:e,stateBranchName:t})=>{Y.info(`Creating ${t}`);let n=await j({args:["commit-tree",id,"-m","[epiq:init-state-branch]"],cwd:e});if(a(n))return i(`Failed to create state branch commit
29
+ ${n.message}`);let o=n.value.stdout.trim(),r=await j({args:["update-ref",`refs/heads/${t}`,o],cwd:e});return a(r)?i(`Failed to create ${t}
30
+ ${r.message}`):c("Created state branch",!0)},pi=async({repoRoot:e,stateBranchName:t})=>{let n=await hr({repoRoot:e,branch:t});if(a(n))return i(`Ensure local state branch failed
31
+ `+n.message);if(n.value)return c("Local state branch already exists",!1);let o=await Us({repoRoot:e});if(a(o))return i(`Ensure local state branch failed
32
+ `+o.message);let r=o.value,s=r?await $s({repoRoot:e,branch:t}):c("No remote, no remote state branch",!1);if(a(s))return i(`Ensure local state branch failed
33
+ `+s.message);let d=s.value;if(r&&d){let l=await he.fetch({cwd:e,remote:et,branch:t});if(a(l))return i(`Failed to fetch ${t} from remote
34
+ ${l.message}`)}if(d){let l=await j({args:["branch","--track",t,`${et}/${t}`],cwd:e});return a(l)?i(`Failed to create local ${t} from remote
35
+ ${l.message}`):c("Created local state branch from remote",!0)}return mi({repoRoot:e,stateBranchName:t})},rf=async({repoRoot:e,branch:t})=>{let n=await j({args:["worktree","list","--porcelain"],cwd:e});if(a(n))return i(n.message);let o=n.value.stdout.split(`
36
+ `),r=null;for(let s of o){if(s.startsWith("worktree ")){r=s.slice(9);continue}if(s===`branch refs/heads/${t}`&&r)return c("Found worktree for branch",r)}return c("No worktree found for branch",null)},sf=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let o=mo(Ro.dirname(t));if(a(o))return i(`Failed to create state branch worktree
37
+ `+o.message);if(Pt.existsSync(t)&&!Pt.existsSync(Ro.join(t,".git"))){let s=Jd(t);if(a(s))return i(s.message);if(s.value.length>0)return i([`Refusing to delete ${t}.`,"","It is not a usable worktree \u2014 it has no .git \u2014 but it still holds",`${s.value.length} event log(s) with content:`,...s.value.map(d=>` ${d}`),"","Deleting it would destroy them, and with no .git here there is no","committed copy to recover from. Move the directory aside and","salvage the logs before letting epiq recreate the worktree."].join(`
38
+ `));Y.info("Removing broken state branch worktree path"),ld(t)}Y.info("Creating state branch worktree");let r=await he.worktreeAdd({cwd:e,worktreeRoot:t,branch:n});return a(r)?i(`Failed to create state branch worktree
39
+ ${r.message}`):c("Created state branch worktree",!0)},Rn=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let o=await rf({repoRoot:e,branch:n});if(a(o))return i(o.message);let r=uo(t),s=o.value?uo(o.value):null;if(s&&s===r&&Pt.existsSync(s))return c("State branch already checked out in expected worktree",!1);if(s&&s!==r){let u=await nd(s);if(a(u))return i(u.message);if(u.value)return i([`Refusing to move the state branch worktree away from ${s}.`,"","It holds changes that are not committed yet, which for this","branch means events no sync has published. Removing it would","destroy them outright \u2014 there is no stash or reflog to recover","a deleted worktree from.","",`This worktree is expected at ${r}, so something else is`,"using a different EPIQ_GLOBAL_DIR against the same repository.","Sync from that location first, or point both at the same one."].join(`
40
+ `));Y.info("Moving state branch worktree to expected location");let m=await he.worktreeRemove({cwd:e,worktreeRoot:s});if(a(m))return i(`Failed to remove existing state branch worktree
41
+ ${m.message}`)}if(s&&!Pt.existsSync(s)){Y.info("Pruning stale state branch worktree");let u=await he.worktreePrune({cwd:e});if(a(u))return i(`Failed to prune stale worktrees
42
+ ${u.message}`)}let d=await Qa({repoRoot:e,worktreeRoot:t});if(a(d))return i(d.message);let l=Pt.existsSync(t);if(d.value&&l)return c("State branch worktree already exists",!1);if(d.value&&!l){Y.info("Pruning missing registered state branch worktree");let u=await he.worktreePrune({cwd:e});if(a(u))return i(`Failed to prune stale worktrees
43
+ ${u.message}`)}return sf({repoRoot:e,stateBranchRoot:t,stateBranchName:n})},af=async({stateBranchRoot:e,stateBranchName:t})=>{let n=await vr(e);if(a(n))return i(n.message);if(n.value===t)return c("State branch already checked out",!1);(await Ue({cwd:e,args:["rebase","--abort"]})).exitCode===0&&Y.info("Aborted stale state branch rebase");let r=await he.checkout({cwd:e,branch:t});return a(r)?i(`Failed to checkout ${t}
44
+ ${r.message}`):c("Checked out state branch",!0)},df=async({repoRoot:e,stateBranchRoot:t})=>{let n=await js(t);if(a(n))return i(n.message);if(n.value)return c("State branch upstream already configured",!1);let o=await Us({repoRoot:t});if(a(o))return i(o.message);if(!o.value)return c("No remote available for state branch upstream",!1);let r=Wt(e);if(a(r))return r;let s=r.value,d=await $s({repoRoot:t,branch:s});if(a(d))return i(d.message);if(!d.value)return c("Remote state branch missing; upstream will be configured on first push",!1);Y.info(`Configuring ${s} upstream`);let l=await he.fetch({cwd:t,remote:et,branch:s});if(a(l))return i(`Failed to fetch ${s}
45
+ ${l.message}`);let u=await he.setUpstream({cwd:t,branch:s,upstream:`${et}/${s}`});return a(u)?i(`Failed to set state branch upstream
46
+ ${u.message}`):c("Configured state branch upstream",!0)},Ur=async({stateBranchRoot:e,eventFileName:t})=>{let n=ad(t),o=Ro.join(e,n);if(!Pt.existsSync(o))return c("No event file to stage",null);let r=await Qd({stateBranchRoot:e,relativePath:n,workingContent:Pt.readFileSync(o,"utf8")});if(a(r))return i(r.message);let s=await he.stage({cwd:e,pathspec:[n]});return a(s)?i(`Failed to stage state branch event file
47
+ ${s.message}`):c("Staged state branch event file",n)},nc=async({stateBranchRoot:e})=>{let t=dd(),n=Ro.join(e,t);if(!Pt.existsSync(n))return c("No media directory to stage",null);let o=await he.stage({cwd:e,pathspec:[t]});return a(o)?i(`Failed to stage state branch media files
48
+ ${o.message}`):c("Staged state branch media files",t)},oc=async({stateBranchRoot:e})=>{let t=qs();if(!Pt.existsSync(Ro.join(e,t)))return c("No event log attributes to stage",null);let n=await he.stage({cwd:e,pathspec:[t]});return a(n)?i(`Failed to stage event log attributes
49
+ ${n.message}`):c("Staged event log attributes",t)},rc=async({repoRoot:e,stateBranchRoot:t,pathspec:n})=>{let o=await of(e);return a(o)?i(`Create state branch sync commit failed
50
+ `+o.message):On({cwd:t,message:o.value,pathspec:n})},No=async({repoRoot:e,stateBranchRoot:t})=>{let n=await js(t);if(a(n))return i(n.message);let o=Wt(e);if(a(o))return o;let r=o.value,s=n.value?await he.push({cwd:t}):await he.push({cwd:t,remote:et,branch:r,setUpstream:!0});if(a(s))return i(`Failed during state branch push
51
+ ${s.message}`);let d=!`${s.value.stdout}${s.value.stderr}`.includes("Everything up-to-date");return c(d?"Pushed state branch":"Remote already up to date",d)},sc=async({repoRoot:e,stateBranchRoot:t,ensureUpstream:n})=>{let o=!1,r=Wt(e);if(a(r))return r;let s=r.value,d=[br(),await pi({repoRoot:e,stateBranchName:s}),await Rn({repoRoot:e,stateBranchRoot:t,stateBranchName:s}),await af({stateBranchRoot:t,stateBranchName:s}),await md(t),n?await df({stateBranchRoot:t,repoRoot:e}):c("Skipped state branch upstream bootstrap",!1)];for(let l of d){if(a(l))return i(l.message);o=o||!!l.value}return c(n?"Bootstrapped state storage":"Bootstrapped state storage readonly",o)}});import $r from"node:fs";import fi from"node:os";import cf from"node:path";var lf,ic,uf,mf,pf,dc,gi,ac,gf,cc,lc=y(()=>{"use strict";A();at();wt();lf="epiq-sync.lock",ic=600*1e3,uf=e=>{try{let t=JSON.parse(e);return typeof t.pid!="number"||typeof t.hostname!="string"||typeof t.startedAt!="number"||typeof t.operation!="string"?null:t}catch{return null}},mf=e=>{try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}},pf=e=>e&&(e.hostname!==fi.hostname()||mf(e.pid))?Date.now()-e.startedAt>ic:!0,dc=e=>`${e.operation} (pid ${e.pid} on ${e.hostname}, started ${new Date(e.startedAt).toISOString()})`,gi=e=>{try{return uf($r.readFileSync(e,"utf8"))}catch{return null}},ac=(e,t)=>{let n={pid:process.pid,hostname:fi.hostname(),startedAt:Date.now(),operation:t};try{return $r.writeFileSync(e,JSON.stringify(n),{flag:"wx"}),!0}catch{return!1}},gf=async({worktreeRoot:e,operation:t})=>{let n=await _s(e);if(a(n))return i(n.message);let o=cf.join(n.value,lf),r=()=>{try{let l=gi(o);l&&l.pid===process.pid&&$r.rmSync(o)}catch{}};if(ac(o,t))return c("Acquired sync lock",{acquired:!0,release:r});let s=gi(o);if(!pf(s))return c("Sync lock is held",{acquired:!1,heldBy:s});Y.info(`Breaking an abandoned sync lock: ${s?dc(s):"unreadable lock file"}`);try{$r.rmSync(o,{force:!0})}catch{}if(ac(o,t))return c("Acquired sync lock after breaking a stale one",{acquired:!0,release:r});let d=gi(o);return c("Sync lock taken by another process",{acquired:!1,heldBy:d??{pid:-1,hostname:fi.hostname(),startedAt:Date.now(),operation:"unknown"}})},cc=async({worktreeRoot:e,operation:t,fn:n})=>{let o=await gf({worktreeRoot:e,operation:t});if(a(o))return i(o.message);if(!o.value.acquired)return Y.info(`Skipping ${t}: the state worktree is held by ${dc(o.value.heldBy)}`),c("State worktree is held by another process",null);let{release:r}=o.value;try{return c("Ran under the sync lock",await n())}finally{r()}}});import ff from"node:fs";var hf,vf,uc,mc,jr,hi=y(()=>{"use strict";A();Br();Or();lo();ct();at();So();lc();hf=async({cwd:e,ensureUpstream:t})=>{logger.debug("[sync] ensureSyncReady:start",{cwd:e,ensureUpstream:t});let n=J("getRepoRootDir",await dt(e));if(a(n))return i(n.message);let o=n.value;logger.debug("[sync] repo root",o);let r=J("getStateBranchRoot",Ne({repoRoot:o}));if(a(r))return i(r.message);let s=r.value;logger.debug("[sync] state branch root",s),logger.debug("[sync] bootstrapping state branch storage",{repoRoot:o,stateBranchRoot:s,ensureUpstream:t});let d=J("bootstrapStateBranchStorage",await sc({repoRoot:o,stateBranchRoot:s,ensureUpstream:t}));if(a(d))return i(d.message);logger.debug("[sync] bootstrap result",{bootstrapped:d.value,stateBranchRoot:s}),logger.debug("[sync] checking state branch git operation",{stateBranchRoot:s});let l=J("hasInProgressGitOperation(stateBranchRoot)",await fr(s));if(a(l))return i(l.message);if(logger.debug("[sync] state branch git operation check result",{inProgress:l.value}),l.value)return logger.info("[sync] state branch git operation in progress"),i("Cannot sync while a git operation is in progress in the state branch");logger.debug("[sync] ensuring state branch layout",{repoRoot:o,stateBranchRoot:s});let u=J("ensureStateBranchLayout",ud(o,s));return a(u)?i(u.message):(logger.debug("[sync] state branch layout ready"),logger.debug("[sync] ensureSyncReady:done",{repoRoot:o,stateBranchRoot:s,bootstrapped:d.value}),c("Sync preconditions satisfied",{repoRoot:o,stateBranchRoot:s,bootstrapped:d.value}))},vf=async({repoRoot:e,stateBranchRoot:t,ownEventFileName:n})=>{logger.debug("[sync] committing own event file from state branch",{ownEventFileName:n,stateBranchRoot:t}),logger.debug("[sync] staging own event file",{stateBranchRoot:t,ownEventFileName:n});let o=J("stageStateBranchOwnEventFile",await Ur({stateBranchRoot:t,eventFileName:n}));if(a(o))return i(o.message);let r=J("stageStateBranchMediaFiles",await nc({stateBranchRoot:t}));if(a(r))return i(r.message);let s=J("stageStateBranchEventAttributes",await oc({stateBranchRoot:t}));if(a(s))return i(s.message);let d=[o.value,r.value,s.value].filter(m=>m!==null);if(d.length===0)return c("Nothing to stage",{createdCommit:!1});let l=J("hasStagedChanges(after stage)",await od(t,d));if(a(l))return i(l.message);if(logger.debug("[sync] state branch change check after stage result",{changed:l.value}),!l.value)return logger.info("[sync] no own event file changes to commit"),c("No own event file changes to commit",{createdCommit:!1});logger.debug("[sync] creating sync commit");let u=J("createStateBranchSyncCommit",await rc({repoRoot:e,stateBranchRoot:t,pathspec:d}));return a(u)?i(u.message):(logger.debug("[sync] created sync commit",u.value),c("Committed own event file",{createdCommit:!0,commitSha:u.value}))},uc=e=>{let t=e.createdCommit?"Committed locally, offline":"Offline";return Yd(t),c(t,{...e,pulled:!1,pushed:!1,offline:!0})},mc=async({cwd:e=process.cwd(),ownEventFileName:t})=>{if(logger.debug("[sync] syncEpiqWithRemote:start",{cwd:e,ownEventFileName:t}),t.includes("/")||t.includes("\\"))return logger.error("[sync] invalid own event file name: contains path separator",{ownEventFileName:t}),i("Own event file must be a file name, not a path");if(!t.endsWith(".jsonl"))return logger.error("[sync] invalid own event file name: missing .jsonl suffix",{ownEventFileName:t}),i("Own event file must end with .jsonl");Dr();let n=J("ensureSyncReady",await hf({cwd:e,ensureUpstream:!0}));if(a(n))return Me(n.message);let{repoRoot:o,stateBranchRoot:r,bootstrapped:s}=n.value,d=J("isDetachedHead(stateBranchRoot)",await rd(r));if(a(d))return Me(d.message);if(logger.debug("[sync] detached state branch check result",{detached:d.value}),d.value)return Me("Cannot run :sync while the state branch is in detached HEAD state");let l=!1,u,m=!1,p=!1,f=J("getStateBranch",Wt(o));if(a(f))return Me(f.message);let I=f.value;logger.debug("[sync] resolved state branch",{stateBranch:I,stateBranchRoot:r});let N=J("commitOwnEventFileToStateBranch",await vf({repoRoot:o,stateBranchRoot:r,ownEventFileName:t}));if(a(N))return Me(N.message);l=N.value.createdCommit,u=N.value.commitSha;let T=J("pullBranchRebaseIfPresent",await Ws({cwd:r,branch:I}));if(a(T))return Hs(T.message)?uc({repoRoot:o,stateBranchRoot:r,createdCommit:l,commitSha:u,bootstrapped:s}):Me(T.message);m=T.value;let C=J("isAheadOfUpstream",await td(r));if(a(C))return Me(C.message);if(l||s||C.value){logger.info("[sync] pushing state branch",{createdCommit:l,bootstrapped:s,stateBranchRoot:r});let w=J("pushStateBranch",await No({stateBranchRoot:r,repoRoot:o}));if(a(w)&&ed(w.message)){let $=J("pullBranchRebaseIfPresent(retry)",await Ws({cwd:r,branch:I}));if(a($))return Me($.message);m=m||$.value,w=J("pushStateBranch(retry)",await No({stateBranchRoot:r,repoRoot:o}))}if(a(w))return Hs(w.message)?uc({repoRoot:o,stateBranchRoot:r,createdCommit:l,commitSha:u,bootstrapped:s}):Me(w.message);p=w.value}if(l){logger.debug("[sync] resolving final sync commit sha",{stateBranchRoot:r});let w=J("git rev-parse HEAD",await j({args:["rev-parse","HEAD"],cwd:r}));if(a(w))return Me(w.message);u=w.value.stdout.trim(),logger.debug("[sync] final sync commit sha",u)}return Fr(p?"Synced and pushed":m||l?"Synced local state":"Already synced"),logger.debug("[sync] syncEpiqWithRemote:done"),c("Synced event logs with state branch",{repoRoot:o,stateBranchRoot:r,createdCommit:l,commitSha:u,pulled:m,pushed:p,bootstrapped:s,offline:!1})},jr=async e=>{let t=e.cwd??process.cwd(),n=await dt(t);if(a(n))return Me(n.message);let o=Ne({repoRoot:n.value});if(a(o))return Me(o.message);let r=o.value;if(!ff.existsSync(r))return mc(e);let s=await cc({worktreeRoot:r,operation:"sync",fn:()=>mc(e)});return a(s)?Me(s.message):s.value===null?c("Another process is syncing this board",{repoRoot:n.value,stateBranchRoot:r,createdCommit:!1,pulled:!1,pushed:!1,bootstrapped:!1,offline:!1,skipped:!0}):s.value}});var It,Hr,yf,pc,vi=y(()=>{"use strict";qd();Io();Kt();ut();de();A();M();Br();Or();hi();It=null,Hr=async()=>{if(logger.debug("[sync] syncAndReloadState enter",{hasPromise:!!It,currentStatus:g().syncStatus?.status,currentMessage:g().syncStatus?.msg}),It)return logger.debug("[sync] syncAndReloadState joining existing promise"),It;logger.debug("[sync] syncAndReloadState creating promise"),It=yf();try{let e=await It;return logger.debug("[sync] syncAndReloadState promise resolved",{success:!a(e),message:(a(e),e.message),statusAfterResolve:g().syncStatus?.status,statusMessageAfterResolve:g().syncStatus?.msg}),a(e)&&g().syncStatus?.status==="syncing"&&(logger.debug("[sync] syncAndReloadState correcting stale syncing status"),E({syncStatus:{msg:e.message,status:"failed"}})),e}catch(e){let t=e instanceof Error?e.message:String(e);return logger.error("[sync] syncAndReloadState promise threw",{message:t,error:e}),It||i(t)}finally{logger.debug("[sync] syncAndReloadState clearing promise",{statusBeforeClear:g().syncStatus?.status,statusMessageBeforeClear:g().syncStatus?.msg}),It=null}},yf=async()=>{logger.debug("[sync] syncAndReloadStateUnsafe:start",{mode:g().mode,syncStatus:g().syncStatus});let e=pc();if(e)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by mode",{mode:g().mode,message:e.message,syncStatus:g().syncStatus}),e;if(It)return It;logger.debug("[sync] syncAndReloadState:start");let t=J("resolveActorId",fe());if(a(t)||!t.value)return logger.info("[sync] unable to resolve actor id",{message:a(t)?t.message:"Missing actor id"}),i("Unable to resolve event log path");E({syncStatus:{msg:"Reloading synced state",status:"syncing"}}),logger.debug("[sync] sync status patched to syncing",{syncStatus:g().syncStatus});let n=xn(t.value);logger.debug("[sync] resolved own event file name",{ownEventFileName:n}),logger.debug("[sync] syncEpiqWithRemote:start");let o=J("syncEpiqWithRemote",await jr({ownEventFileName:n}));if(logger.debug("[sync] syncEpiqWithRemote:result",{success:!a(o),message:(a(o),o.message)}),a(o))return logger.error("[sync] syncAndReloadState:sync failed",o.message),E({syncStatus:{msg:"Sync failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after sync failure",{syncStatus:g().syncStatus}),Me(`Unable to sync state. ${o.message}`);let{stateBranchRoot:r,offline:s}=o.value;logger.debug("[sync] loading merged events after sync",{stateBranchRoot:r});let d=J("loadMergedEvents",Lt(r));if(logger.debug("[sync] loadMergedEvents:result",{success:!a(d),message:(a(d),d.message),count:a(d)?void 0:d.value.events.length}),a(d))return E({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after load failure",{syncStatus:g().syncStatus}),i(`Unable to load events. ${d.message}`);logger.debug("[sync] loaded merged events after sync",{count:d.value.events.length});let l=pc();if(l)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by late mode check",{mode:g().mode,message:l.message,syncStatus:g().syncStatus}),l;let u=Hd(),m=g().filters;if(logger.debug("[sync] captured navigation anchor",{navigationAnchor:u,selectedNodeId:g().selectedNode?.id,contextNodeId:g().contextNode?.id,selectedNodeIsVirtual:g().selectedNode?.isVirtual,contextNodeIsVirtual:g().contextNode?.isVirtual}),!g().selectedNode?.isVirtual&&!g().contextNode?.isVirtual){logger.debug("[sync] bootStateFromEventLog:start",{eventCount:d.value.events.length});let f=J("bootStateFromEventLog",Yt(d.value.events,d.value.unreadable));if(logger.debug("[sync] bootStateFromEventLog:result",{success:!a(f),message:(a(f),f.message)}),a(f))return E({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after boot failure",{syncStatus:g().syncStatus}),i(`Unable to boot synced state. ${f.message}`)}else logger.debug("[sync] skipped bootStateFromEventLog for virtual node",{selectedNodeIsVirtual:g().selectedNode?.isVirtual,contextNodeIsVirtual:g().contextNode?.isVirtual});logger.debug("[sync] booted state from synced events"),E({filters:m}),logger.debug("[sync] restoreNavigationAnchor:start");let p=J("restoreNavigationAnchor",Gd(u));return logger.debug("[sync] restoreNavigationAnchor:result",{success:!a(p),message:a(p)?p.message:"Navigation restored",selectedNodeId:g().selectedNode?.id,contextNodeId:g().contextNode?.id}),a(p)?(E({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after restore failure",{syncStatus:g().syncStatus}),p):(E({hasProjectDefinition:!0,syncStatus:s?{msg:"Committed locally, offline",status:"offline"}:{msg:"Synced",status:"synced"}}),logger.debug("[sync] syncAndReloadState:done",{syncStatus:g().syncStatus}),c("Synced",!0))},pc=()=>g().mode===h.DEFAULT?null:(logger.debug("[sync] failReloadIfNotDefaultMode",{mode:g().mode,syncStatus:g().syncStatus}),E({syncStatus:{msg:"Reload skipped while editing",status:"pending"}}),i("Will not re-materialize if not in default mode, to not lose edit data"))});var Hn,gc,fc,yi,bi,Co,xi,bf,hc,xf,vc,Wr=y(()=>{"use strict";A();Oe();M();vi();Hn=3e3,gc=e=>{let t=Number(e.trim());return!Number.isFinite(t)||!Number.isInteger(t)||t<Hn?null:t},fc=0,bi=!1,Co=!1,xi=()=>{if(bi)return!0;let e=$e();return a(e)?!1:e.value.syncStatus.status==="syncing"},bf=()=>{let e=ye().autoSyncIntervalMs??1e4,t=Date.now()-fc;return Math.max(0,e-t)},hc=()=>{yi||(yi=setTimeout(async()=>{if(yi=void 0,!!bt()){if(xi()){Co=!0;return}Co=!1,await xf()}},bf()))},xf=async()=>{if(g().readOnly||g().timeMode==="peek"||g().timeMode==="replay")return i("Cannot auto-sync while peeking");if(!bt())return i("Cannot auto-sync before state is initialized");if(xi())return Co=!0,i("Sync already in progress");bi=!0,fc=Date.now(),E({syncStatus:{msg:"Auto-syncing",status:"syncing"}});try{return await Hr()}finally{bi=!1,Co&&hc()}},vc=()=>{bt()&&(Co=!0,!xi()&&hc())}});import Ao from"node:fs";import To from"node:path";import{z as Wn}from"zod";var Gr,If,Ef,Rf,bc,xc,yc,Ic,Ec,Rc,Nf,qr,Ii,wo=y(()=>{"use strict";A();Tt();pr();le();Gr="recent-projects.json",If=20,Ef=Wn.object({projectId:Wn.string().min(1),root:Wn.string().min(1),lastOpenedAt:Wn.number().finite()}),Rf=Wn.object({projects:Wn.array(Ef)}),bc=()=>To.join(mn(),Gr),xc=e=>To.basename(e)||e,yc=e=>{let t=To.resolve(e);try{return Ao.realpathSync(t)}catch{return t}},Ic=(e,t)=>t.lastOpenedAt-e.lastOpenedAt,Ec=e=>{if(!fo(e.root))return!1;let t=ao(e.root);return!a(t)&&t.value===e.projectId},Rc=()=>{let e=bc();if(!Ao.existsSync(e))return c("No recent projects recorded",[]);let t;try{t=JSON.parse(Ao.readFileSync(e,"utf8"))}catch(o){return i(`Invalid ${Gr}: ${o instanceof Error?o.message:String(o)}`)}let n=Rf.safeParse(t);return n.success?c("Read recent projects",n.data.projects):i(`Invalid ${Gr} shape: ${n.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`)},Nf=e=>{let t=bc();try{Ao.mkdirSync(To.dirname(t),{recursive:!0}),Ao.writeFileSync(t,JSON.stringify({projects:e},null,2)+`
52
+ `,"utf8")}catch(n){return i(`Unable to write ${Gr}: ${n instanceof Error?n.message:String(n)}`)}return c("Recorded recent project",e)},qr=({exclude:e}={})=>{let t=Rc();if(a(t))return t;let n=e===void 0?null:yc(e);return c("Listed recent projects",t.value.filter(o=>n===null||yc(o.root)!==n).filter(Ec).sort(Ic))},Ii=({root:e,now:t=Date.now()})=>{let n=To.resolve(e),o=ao(n);if(a(o))return i(o.message);let r=o.value,s=Rc(),d=a(s)?[]:s.value,l=[{projectId:r,root:n,lastOpenedAt:t},...d.filter(u=>u.projectId!==r&&u.root!==n)].filter(Ec).sort(Ic).slice(0,If);return Nf(l)}});var Vr,Nc,Sc,Cc,Mo=y(()=>{"use strict";A();Tt();Oe();le();Vr=()=>{let e=ye(),t=!!e.userName?.trim(),n=!!e.preferredEditor?.trim(),o=e.autoSync===!0||e.autoSync===!1;return{isSetupDone:n&&t&&o,isSetPreferredEditor:n,isSetUserName:t,userName:e.userName,preferredEditor:e.preferredEditor,autoSync:e.autoSync===void 0?null:e.autoSync,isSetAutoSync:o}},Nc=()=>{let e=ze(process.cwd());if(a(e))return!1;let t=At(e.value);return Ct(t)},Sc=e=>e===!0?"on":e===!1?"off":null,Cc=e=>e==="on"?!0:e==="off"?!1:null});var ke,S,Le=y(()=>{"use strict";ke={bg:"#1a1b26",fg:"#c8d3ff",grayDark:"#3a3e54",gray:"#46507a",grayLight:"#969bb5",cyan:"#88d5ee",cyanSoft:"#8fe6fb",blue:"#5b8cff",magenta:"#a78bfa",magentaSoft:"#c4b5fd",green:"#8fdc8c",yellow:"#f1c27d",red:"#ff7a90",white:"#ffffff"},S={accent:ke.cyan,accent2:ke.magenta,primary:ke.white,secondary:ke.grayDark,secondary2:ke.grayLight,gray:ke.gray,green:ke.green,yellow:ke.yellow,red:ke.red}});var R,Gn,Kr=y(()=>{"use strict";Le();R={red:ke.red,yellow:ke.yellow,green:ke.green,blue:ke.blue,magenta:ke.magenta,cyan:ke.cyan},Gn={urgent:R.red,critical:R.red,important:R.red,blocker:R.red,asap:R.red,immediate:R.red,fail:R.red,failure:R.red,broken:R.red,bug:R.red,error:R.red,incident:R.red,outage:R.red,production:R.red,crash:R.red,security:R.red,warning:R.yellow,warn:R.yellow,risky:R.yellow,risk:R.yellow,attention:R.yellow,pending:R.yellow,review:R.yellow,"needs-review":R.yellow,qa:R.yellow,testing:R.yellow,test:R.yellow,validate:R.yellow,verification:R.yellow,staging:R.yellow,check:R.yellow,"follow-up":R.yellow,followup:R.yellow,waiting:R.yellow,blocked:R.yellow,hold:R.yellow,done:R.green,complete:R.green,completed:R.green,success:R.green,ok:R.green,stable:R.green,resolved:R.green,fixed:R.green,closed:R.green,merged:R.green,released:R.green,deployed:R.green,approved:R.green,verified:R.green,working:R.green,healthy:R.green,pass:R.green,passing:R.green,info:R.blue,information:R.blue,note:R.blue,docs:R.blue,documentation:R.blue,doc:R.blue,guide:R.blue,help:R.blue,explanation:R.blue,detail:R.blue,details:R.blue,context:R.blue,design:R.blue,discussion:R.blue,proposal:R.blue,idea:R.blue,feature:R.magenta,enhancement:R.magenta,improvement:R.magenta,refactor:R.magenta,refactoring:R.magenta,cleanup:R.magenta,optimize:R.magenta,optimization:R.magenta,perf:R.magenta,performance:R.magenta,upgrade:R.magenta,migration:R.magenta,modernize:R.magenta,debt:R.magenta,todo:R.cyan,next:R.cyan,planned:R.cyan,plan:R.cyan,future:R.cyan,backlog:R.cyan,investigate:R.cyan,explore:R.cyan,prototype:R.cyan}});var Sf,Cf,Xt,Jt,zr,Yr,ko=y(()=>{"use strict";pe();A();ge();M();Sf=e=>e.props.tags??[],Cf=e=>e.props.assignees??[],Xt=e=>Sf(e).map(t=>x.getTag(t)).filter(t=>!!t),Jt=e=>Cf(e).map(t=>x.getContributor(t)).filter(t=>!!t),zr=()=>{let{breadCrumb:e,selectedNode:t}=g(),n=[...e,t].find(o=>o?.context==="TICKET");return!n||!k(n)?i("Invalid untag target"):c("Retrieved tags from ticket in breadcrumb",Xt(n))},Yr=()=>{let{breadCrumb:e,selectedNode:t}=g(),n=[...e,t].find(o=>o?.context==="TICKET");return!n||!k(n)?i("Invalid unassign target"):c("Retrieved assignees from ticket in breadcrumb",Jt(n))}});var v,Nn=y(()=>{"use strict";v={PALETTE:"?",EXIT:"exit",INIT:"init",OPEN:"open",HELP:"help",NEW:"new",TAG:"tag",UNTAG:"untag",MOVE:"move",PEEK:"peek",REPLAY:"replay",FILTER:"filter",ASSIGN:"assign",UNASSIGN:"unassign",DELETE:"delete",CLOSE_ISSUE:"close",RE_OPEN_ISSUE:"reopen",COMMENT:"comment",CONFIG:"config",EDIT:"edit",YANK:"yank",SYNC:"sync",EXPORT:"export",COFFEE:"coffee",NONE:""}});var Af,Tf,wf,Mf,kf,Sn,Ac,Xr,Jr,Tc,Lf,Ei,Lo=y(()=>{"use strict";Af=/^(\d+)(h|d|w|mo|y)$/,Tf=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,wf=({year:e,month:t,day:n,hour:o=0,minute:r=0})=>{let s=new Date(e,t-1,n,o,r);return s.getFullYear()===e&&s.getMonth()===t-1&&s.getDate()===n&&s.getHours()===o&&s.getMinutes()===r},Mf=(e,t=new Date)=>{let n=e.match(Af);if(!n)return null;let[,o,r]=n,s=Number(o);if(!Number.isInteger(s)||s<=0)return null;let d=new Date(t);switch(r){case"h":return d.setHours(d.getHours()-s),d;case"d":return d.setDate(d.getDate()-s),d;case"w":return d.setDate(d.getDate()-s*7),d;case"mo":return d.setMonth(d.getMonth()-s),d;case"y":return d.setFullYear(d.getFullYear()-s),d;default:return null}},kf=e=>{let t=e.match(Tf);if(!t)return null;let[,n,o,r,s,d]=t,l=Number(n),u=Number(o),m=Number(r),p=s?Number(s):0,f=d?Number(d):0;return wf({year:l,month:u,day:m,hour:p,minute:f})?new Date(l,u-1,m,p,f):null},Sn=e=>{let t=e.trim().toLowerCase();return Mf(t)??kf(t)},Ac=/^(\d+)(s|m)?$/,Xr=e=>{let t=e.trim().toLowerCase().match(Ac);if(!t)return null;let n=Number(t[1]);return!Number.isInteger(n)||n<=0?null:t[2]==="m"?n*6e4:n*1e3},Jr=(e,t)=>{let n=(t??"").trim().split(/\s+/).filter(Boolean),o=n.length>0&&Ac.test(n.at(-1))?n.pop():"";return{dateInput:e||n.join(" "),durationInput:o}},Tc=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,Lf=[{unit:"h",from:1,to:24},{unit:"d",from:1,to:7},{unit:"w",from:1,to:52},{unit:"mo",from:1,to:12},{unit:"y",from:1,to:5}],Ei=(e=Lf)=>{let t=[];for(let{unit:n,from:o,to:r}of e)for(let s=o;s<=r;s++)t.push(`${s}${n}`);return t}});var Pf,ue,Je,Ee,Df,Ff,Ni,Si,kc,Cn,Qr,Ri,wc,Bf,Of,Po,Mc,_f,Uf,Ci,$f,xe,Qt=y(()=>{"use strict";Wr();wo();A();Mo();Un();pe();ge();M();Kr();ko();Nn();Lo();Pf=["BOARD","TICKET","SWIMLANE","COMMENT"],ue={EDITOR:"editor",VIEW:"view",USERNAME:"username",AUTOSYNC:"autoSync",SYNC_DEBOUNCE_MS:"syncDebounceMs",ATTACHMENT_MAX_KB:"attachmentMaxKb",LOG_LEVEL:"logLevel"},Je={TITLE:"title",DESCRIPTION:"description",COMMENT:"comment"},Ee={REF:"ref",TITLE:"title",DESCRIPTION:"description",TAGS:"tags",ASSIGNEES:"assignees"},Df=[ue.EDITOR,ue.VIEW,ue.USERNAME,ue.AUTOSYNC,ue.SYNC_DEBOUNCE_MS,ue.ATTACHMENT_MAX_KB,ue.LOG_LEVEL],Ff=(e=g().selectedNode?.context)=>{switch(e){case"TICKET":return[Je.TITLE,Je.DESCRIPTION];case"BOARD":case"SWIMLANE":return[Je.TITLE];case"COMMENT":return[Je.COMMENT];default:return[]}},Ni=[String(Hn),"5000","15000","30000","60000"],Si=["250","500","1000"],kc=["10s","20s","30s","45s"],Cn=[v.COFFEE,v.EXIT,v.SYNC,v.HELP,v.EXPORT,v.CONFIG,v.YANK],Qr=[v.NEW,v.EDIT,v.DELETE,v.MOVE],Ri=[v.TAG,v.UNTAG,v.ASSIGN,v.UNASSIGN,v.CLOSE_ISSUE,v.RE_OPEN_ISSUE,v.EDIT,v.COMMENT],wc=[v.FILTER,v.PEEK,v.REPLAY],Bf={WORKSPACE:[...Cn,...Qr],BOARD:[...wc,...Cn,...Qr],SWIMLANE:[...wc,...Cn,...Qr],TICKET:[...Cn,...Qr,...Ri],FIELD:[...Cn,...Ri],FIELD_LIST:[...Cn,...Ri],TEXT:[...Cn],COMMENT:[v.EDIT,v.DELETE,v.YANK]},Of=e=>e==="WORKSPACE"?["board"]:["issue","swimlane","board"],Po=({breadCrumb:e,selectedNode:t})=>[...e,t].find(n=>n!=null&&k(n)),Mc=e=>e.parentNodeId===be,_f=({selectedNode:e,breadCrumb:t})=>{let n=Ff(e?.context);return Po({breadCrumb:t,selectedNode:e})?n.includes(Je.DESCRIPTION)?n:[...n,Je.DESCRIPTION]:n},Uf=({selectedNode:e,breadCrumb:t})=>{let n=Po({breadCrumb:t,selectedNode:e});return n?[Ee.REF,Ee.TITLE,...n.props?.description?.trim()?[Ee.DESCRIPTION]:[],...Xt(n).length>0?[Ee.TAGS]:[],...Jt(n).length>0?[Ee.ASSIGNEES]:[]]:e?[Ee.REF,Ee.TITLE]:[]},Ci=()=>{let e=qr({exclude:process.cwd()});return a(e)?[]:[...e.value.map((t,n)=>String(n+1)),...e.value.map(t=>t.root)]},$f=({selectedNode:e,readOnly:t,breadCrumb:n})=>{let{isSetupDone:o}=Vr();if(!o)return[v.HELP,v.CONFIG];if(!Nc())return[v.HELP,v.INIT,v.OPEN];if(t)return[v.HELP,v.PEEK,v.REPLAY,v.EXPORT,v.CONFIG,v.YANK];let r=e?.context,s=r&&Pf.includes(r),d=[...new Set([...n,e].map(u=>u?.context).flatMap(u=>u?Bf[u]:[]))],l=Po({breadCrumb:n,selectedNode:e});return d.filter(u=>u===v.MOVE?!1:u===v.YANK?!!(l??e):u===v.EDIT?s||!!l:u===v.DELETE?s:u===v.UNTAG?!!(l&&Xt(l).length>0):u===v.UNASSIGN?!!(l&&Jt(l).length>0):u===v.RE_OPEN_ISSUE?!!(l&&Mc(l)):u===v.CLOSE_ISSUE?!!(l&&!Mc(l)):!0)},xe=(e,{contextNode:t,selectedNode:n,readOnly:o,breadCrumb:r}=g())=>{let s=t.context??"WORKSPACE";return{[v.NONE]:$f({breadCrumb:r,readOnly:o,selectedNode:n}),[v.EXIT]:["confirm"],[v.EXPORT]:[],[v.SYNC]:[],[v.INIT]:[],[v.OPEN]:e===v.OPEN?Ci():[],[v.HELP]:[],[v.PEEK]:[...Ei(),"now","prev","next"],[v.REPLAY]:[...Ei()],[v.EDIT]:_f({selectedNode:n,breadCrumb:r}),[v.YANK]:Uf({selectedNode:n,breadCrumb:r}),[v.COMMENT]:[],[v.DELETE]:["confirm"],[v.RE_OPEN_ISSUE]:["confirm"],[v.CLOSE_ISSUE]:["confirm"],[v.MOVE]:["start","confirm","next","previous","to-next","to-previous","cancel"],[v.FILTER]:["tag","assignee","description","title","ref","clear"],[v.TAG]:[...new Set([...Object.keys(Gn),...x.getExistingTags()])],[v.UNTAG]:[...zr()?.value?.map(({name:l})=>l)??[]],[v.UNASSIGN]:[...Yr()?.value?.map(({name:l})=>l)??[]],[v.ASSIGN]:x.getExistingAssignees(),[v.NEW]:Of(s),[v.CONFIG]:[...Df],[v.COFFEE]:["1","3","5","20","custom"]}[e]??[]}});var Lc,Pc=y(()=>{"use strict";Lc=["vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"]});import{decodeTime as Dc}from"ulid";var Fc,An,Do=y(()=>{"use strict";A();Fc=e=>{try{return c("Decoded date",new Date(Dc(e)))}catch(t){return i("Decoding failed + "+t.message)}},An=e=>{if(!e?.id)return null;try{return Dc(e.id)}catch{return null}}});import{accessSync as jf,copyFileSync as Hf,existsSync as Zr,mkdirSync as Bc,readdirSync as Oc,readFileSync as Wf,renameSync as Gf,rmSync as qf,statSync as _c,unlinkSync as Vf,writeFileSync as Kf}from"node:fs";import qn from"node:path";var Ai,je,es=y(()=>{"use strict";Ai=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string",je={writeToFile:(e,t)=>{try{let n=qn.dirname(e);Zr(n)||Bc(n,{recursive:!0});let o=typeof t=="string"?t:JSON.stringify(t,null,2);Kf(e,o,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return Wf(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=je.readFile(e);return t===null?null:JSON.parse(t)}catch(t){return logger.error(`Failed to read JSON at ${e}:`,t),null}},dirExists:e=>{try{return Zr(e)&&_c(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await jf(e),!0}catch{return!1}},mkDir:e=>Bc(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=qn.parse(t);for(;;){let o=qn.join(t,e);try{if(Zr(o)&&_c(o).isDirectory())return o}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=qn.dirname(t)}return null},readFirstJSON(e){try{if(!je.dirExists(e))return null;let t=Oc(e).filter(o=>o.endsWith(".json")).sort()[0];if(!t)return null;let n=qn.join(e,t);return je.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return je.dirExists(e)?Oc(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{Vf(e)}catch(t){(!Ai(t)||t.code!=="ENOENT")&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{qf(e,{recursive:!0,force:!0})}catch(t){(!Ai(t)||t.code!=="ENOENT")&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(qn.dirname(t)),!n?.overwrite&&Zr(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{Gf(e,t)}catch(o){if(Ai(o)&&o.code==="EXDEV"){Hf(e,t),this.rmFile(e);return}throw o}}}});import zf from"node:path";import{z as Dt}from"zod";var Yf,Uc,Xf,$c,Ti,wi,Jf,ts,jc,nt,Hc,Tn=y(()=>{"use strict";Cr();le();A();es();Yf={logLevel:"info",userId:"",userName:"",preferredEditor:"",autoSync:!1},Uc=Dt.object({logLevel:Dt.enum(["info","error","debug"]),preferredEditor:Dt.string().optional(),userName:Dt.string().optional(),userId:Dt.string().optional(),autoSync:Dt.boolean().nullable().optional(),autoSyncDebounceMs:Dt.number().optional(),attachmentMaxKb:Dt.number().optional(),viewMode:Dt.enum(["dense","wide"]).optional()}).partial(),Xf="config.json",$c=mn,Ti=()=>zf.join($c(),Xf),wi=()=>{try{return je.mkDir($c()),c(`Ensured ~/${it} exists`,null)}catch{return i(`Unable to create ~/${it}`)}},Jf=e=>{let t;try{t=JSON.parse(e)}catch{return i(`Invalid ~/${it}/config.json JSON`)}let n=Uc.safeParse(t??{});return n.success?c("Parsed config",n.data):i(`Invalid ~/${it}/config.json shape: ${n.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`)},ts=()=>{let e=wi();if(a(e))return i(e.message);let t=Ti(),n=je.readFile(t);return n==null||n.trim()===""?c("No config found, using empty config",{logLevel:"info",autoSync:null,preferredEditor:"",userId:"",userName:"",autoSyncIntervalMs:1e4}):Jf(n)},jc=e=>{let t=wi();if(a(t))return i(t.message);let n=Uc.safeParse(e);if(!n.success)return i(`Invalid config: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`);let o=Ti();try{return je.writeToFile(o,JSON.stringify(n.data,null,2)+`
53
+ `),c("Config written",null)}catch{return i(`Unable to write ~/${it}/config.json`)}},nt=e=>{let t=ts();if(a(t))return i("Failed to read existing config");let n={...t.value,...e};return jc(n)},Hc=()=>{let e=Ti(),t=wi();if(a(t))return i(`Unable to create ~/${it}`);if(!(je.readFile(e)!==null)){let T=jc(Yf);if(a(T))throw new Error(`Unable to create ~/${it}/config.json`)}let o=ts();if(a(o))throw new Error(o.message||"Unable to load settings");let{preferredEditor:r,userName:s,userId:d,autoSync:l,autoSyncDebounceMs:u,attachmentMaxKb:m,logLevel:p,viewMode:f}=o.value,I=Rd({userId:d,userName:s});if(a(I))return i(I.message);let N=I.value??{userId:d,userName:s};return!N.userName||!N.userId?i(`User name or ID not configured in ~/${it}/config.json`):(process.env.EPIQ_LOG_LEVEL=p,c("successfully loaded settings",{logLevel:p??"debug",preferredEditor:r??"",userName:N.userName,userId:N.userId,autoSync:l??!1,autoSyncIntervalMs:u??1e4,attachmentMaxKb:m??null,viewMode:f??"dense"}))}});var Fo,Mi,Bo=y(()=>{"use strict";gt();A();le();Fo=500,Mi=(e,t)=>`${e}.${t}`});import Qf from"zod";var Oo,_o,Wc,ki=y(()=>{"use strict";Tn();Bo();de();A();Ie();Oe();M();Oo=50,_o=5e3,Wc=()=>{let e=se().commandMeta.inputString,t=Qf.coerce.number().int().min(Oo).max(_o).safeParse(e);if(!t.success)return i(`Attachment size cap must be ${Oo}-${_o} KB (default ${Fo})`);let n=nt({attachmentMaxKb:t.data});return a(n)?n:(Ze({attachmentMaxKb:t.data}),E({mode:h.DEFAULT}),c(`Attachment size cap set to ${t.data} KB`,null))}});import Gc from"chalk";var Pi,qc,Li,Vc,Zf,eh,Kc,th,nh,Uo,Pe,zc,Yc,ns,oh,rh,os,Et=y(()=>{"use strict";Kr();Pi={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},qc=(e,t,n)=>Math.max(t,Math.min(n,e)),Li=(e,t,n)=>e+(t-e)*n,Vc=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},Zf=e=>e.toLowerCase().trim(),eh=(e,t,n)=>{let o=t/100,r=n/100,s=(1-Math.abs(2*r-1))*o,d=e/60,l=s*(1-Math.abs(d%2-1)),u=0,m=0,p=0;d>=0&&d<1?(u=s,m=l):d>=1&&d<2?(u=l,m=s):d>=2&&d<3?(m=s,p=l):d>=3&&d<4?(m=l,p=s):d>=4&&d<5?(u=l,p=s):(u=s,p=l);let f=r-s/2;return[Math.round((u+f)*255),Math.round((m+f)*255),Math.round((p+f)*255)]},Kc=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`,th=(e,t,n)=>{let o=qc(n,0,1);return[Math.round(Li(e[0],t[0],o)),Math.round(Li(e[1],t[1],o)),Math.round(Li(e[2],t[2],o))]},nh=(e,t,n)=>th(e,t,n),Uo=e=>{let t=Vc(e)%360,n=eh(t,Pi.stringColor.saturation,Pi.stringColor.lightness);return Kc(n)},Pe=(e,t=Gn)=>{let n=Zf(e);return n&&t[n]?t[n]:Uo(n)},zc=e=>{let t=Pi.gradient.stops,n=qc(e,0,1);if(t.length===0)return[0,0,0];if(t.length===1)return t[0];let o=t.length-1,r=n*o,s=Math.min(Math.floor(r),o-1),d=r-s;return nh(t[s],t[s+1],d)},Yc=e=>Kc(zc(e)),ns=e=>Vc(e.toLowerCase().trim())/4294967295,oh=e=>{let t=ns(e);return zc(t)},rh=e=>{let[t,n,o]=oh(e);return{normal:r=>Gc.bgRgb(t,n,o).black(r),cursor:r=>Gc.bgRgb(t,n,o).white.bold(r)}},os=e=>rh(e).normal(` ${e} `)});var mt,$o=y(()=>{"use strict";mt=(e,t,n)=>t.length>n?`${e} cannot exceed ${n} characters (got ${t.length})`:null});import{createHash as sh}from"node:crypto";var ih,ah,Ce,Vn=y(()=>{"use strict";ih="0123456789ABCDEFGHJKMNPQRSTVWXYZ",ah=e=>{let t=sh("sha256").update(e).digest(),n=0n;for(let r=0;r<16;r++)n=n<<8n|BigInt(t[r]);let o="";for(let r=0;r<26;r++){let s=BigInt((25-r)*5);o+=ih[Number(n>>s&31n)]}return o},Ce=(e,t)=>ah(`${e}:virtual:${t}`)});import Xc from"chalk";var Q,Ae,Te,Jc=y(()=>{"use strict";Et();Le();Q=e=>Xc.dim(e),Ae=e=>Xc.hex(S.primary)(e),Te=({prefix:e="",wordList:t,postfix:n="",noOfHints:o=100,inputString:r,minLengthForHints:s=1})=>{let d=r.trim();if(d.length<s)return"";let p=[...t.filter(Boolean).filter(f=>f.startsWith(d))].sort((f,I)=>ns(f)-ns(I)).slice(0,o).map(f=>os(f)).join(" ");return p?`${Q(e)}${p}${Q(n)}`:""}});var Zt,rs=y(()=>{"use strict";Zt={None:"none",Invalid:"invalid",Valid:"valid"}});import el from"chalk";var dh,Qc,ie,K,U,Kn,Zc,ss,Di,ch,wn,lh,uh,mh,ph,gh,tl,nl=y(()=>{"use strict";Wr();Mo();Pc();Do();gt();A();ge();Oe();ki();Bo();M();Et();$o();ko();Vn();Jc();Nn();rs();Qt();Lo();dh=["BOARD","TICKET","SWIMLANE"],Qc=()=>{let e=g().selectedNode;if(!e?.context)return U({message:Q("Missing target context")});if(dh.includes(e.context))return K();if(e.parentNodeId){let t=g().nodes[e.parentNodeId];if(t?.id===Ce(t?.parentNodeId??"","comments"))return K()}return U({message:Q("Command not available in this context")})},ie="<ENTER> to confirm",K=(e="",t=[])=>({message:Q(e),validity:Zt.Valid,completionWordList:t}),U=({message:e,completionWordList:t=[]})=>({validity:Zt.Invalid,message:e,completionWordList:t}),Kn=e=>e.length===0,Zc=(e,t)=>{let n=qe(g().breadCrumb,"BOARD");if(a(n))return U({message:Ae("Command is not applicable in this context")});let o=Fc(n.value.id);return a(o)?U({message:Ae(`Unable to ${t}: board id is not a valid ULID`)}):Tc({date:e,horizonDate:o.value})?null:U({message:Ae(`nothing to ${t} before ${o.value.toISOString().slice(0,16).replace("T"," ")}`)})},ss=e=>` ${el.hex("#000").bgHex(Pe(e))(` ${e} `)} `,Di=({modifier:e})=>{let t="confirm";return e===t?K(ie):U({message:Kn(e)?Q("if you are certain, enter ")+os(t):"",completionWordList:[t]})},ch=({list:e,hint:t,onValue:n})=>({modifier:o,inputString:r})=>e.includes(o)?r.trim().length<1?U({message:Q(n)}):K():U({message:Kn(o)?t:"",completionWordList:[...e]}),wn=({hint:e,onOk:t})=>({modifier:n,inputString:o})=>Kn(n)&&Kn(o)?U({message:e,completionWordList:[]}):K(t??ie),lh=({modifier:e,inputString:t})=>{let n=Ci();return!Kn(e)||!Kn(t)?K(ie):U({message:n.length?Q("number from the list, or a path"):Q("path to an epiq project"),completionWordList:n})},uh=({modifier:e,inputString:t})=>{let n=xe(v.CONFIG);if(!n.includes(e))return U({message:Te({prefix:"... ",wordList:n,inputString:e,minLengthForHints:0}),completionWordList:n});switch(e){case ue.EDITOR:{let o=[...Lc];return t.trim()?o.includes(t.trim())?K(ie):U({message:Te({prefix:"editors: ",wordList:o,inputString:t,minLengthForHints:0}),completionWordList:o}):U({message:Te({prefix:"editors: ",wordList:o,inputString:t,minLengthForHints:0}),completionWordList:o})}case ue.VIEW:{let o=["dense","wide"];return o.includes(t.trim())?K(ie):U({message:Te({prefix:"view... ",wordList:o,inputString:t,minLengthForHints:0}),completionWordList:o})}case ue.USERNAME:return t.trim()?K(ie):U({message:Ae("Enter a user name. Saved in ")+el.bgBlack("~/.epiq-global/config.json")});case ue.LOG_LEVEL:{let o=["debug","error","info"],r=t.trim();return o.includes(r)?K(ie):U({message:Te({prefix:"one of: ",wordList:[...o],inputString:r,postfix:" persisted in ~/.epiq-global/config.json",minLengthForHints:0}),completionWordList:[...o]})}case ue.AUTOSYNC:{let o=["on","off"],r=ye().autoSync;if(!o.includes(t.trim())){let s=Sc(r);return U({message:Te({prefix:`should auto-sync (recommended)${s!==null?", currently: "+s:""} `,wordList:o,noOfHints:3,inputString:t,minLengthForHints:0}),completionWordList:o})}return K(ie)}case ue.ATTACHMENT_MAX_KB:{let o=ye().attachmentMaxKb,r=Number.parseInt(t.trim(),10);if(!t.trim()||Number.isNaN(r)||r<Oo||r>_o){let s=Te({prefix:" examples: ",wordList:Si,minLengthForHints:0,inputString:t});return U({message:Ae(`provide a size cap in KB (${Oo}-${_o}). current: ${o??Fo} KB.`)+s,completionWordList:Si})}return K(ie)}case ue.SYNC_DEBOUNCE_MS:{let o=ye().autoSyncIntervalMs,r=gc(t);if(!t.trim()||r===null||r<Hn){let s=Te({prefix:" examples: ",wordList:Ni,minLengthForHints:0,inputString:t});return U({message:Ae(`provide duration above ${Hn}ms. current duration: ${o}ms.`)+s,completionWordList:Ni})}return K(ie)}default:return U({message:Ae("Unknown config option"),completionWordList:n})}},mh=({modifier:e,inputString:t})=>{let n=xe(v.EDIT);if(!n.length)return U({message:Ae("Command not available in this context")});if(!n.includes(e)){let o=Te({prefix:"edit... ",wordList:n,inputString:e,minLengthForHints:0});return U({message:o||Ae("Unknown edit option"),completionWordList:n})}switch(e){case Je.COMMENT:return t.trim()?K(ie):U({message:Q("write a comment...")});case Je.TITLE:return K(ie);case Je.DESCRIPTION:{let{preferredEditor:o}=ye();return o?K(Q("<ENTER> to edit in ")+o):U({message:"No editor selected"})}default:return U({message:Ae("Unknown edit option"),completionWordList:n})}},ph=({modifier:e})=>{let t=xe(v.YANK);return t.length?t.includes(e)?K(ie+Q(" and copy to clipboard")):U({message:Te({prefix:"yank... ",wordList:t,inputString:e,minLengthForHints:0}),completionWordList:t}):U({message:Ae("Nothing selected to copy from")})},gh={[v.EXPORT]:()=>K(ie+Q(", and create export markdown file")),[v.PEEK]:e=>{let t=e.modifier;if(t==="now"||t==="prev"||t==="next")return K(ie);let n={message:Q("historical state from: '1h', '2d', '23h', '1mo', '2y', 'prev', 'next' or full date as YYYY-MM-DD")},o=t||e.inputString.trim(),r=Sn(o);if(!o||!r)return U(n);let s=Zc(r,"peek");return s||K(ie)},[v.REPLAY]:e=>{let{dateInput:t,durationInput:n}=Jr(e.modifier,e.inputString),o={message:Q("replay forward from: '1h', '2d', '1mo', '2y' or full date as YYYY-MM-DD, with optional duration (e.g. '2y 30s')")},r=Sn(t);if(!t||!r)return U(o);let s=Zc(r,"replay");return s||(n&&Xr(n)===null?U({message:Ae("duration must be positive (e.g. 30s, 2m, or a number of seconds)")}):K("<ENTER> to replay board history",n?kc:[]))},[v.EXIT]:()=>K(ie+Q(" and exit the application")),[v.INIT]:()=>K(ie),[v.OPEN]:lh,[v.PALETTE]:()=>K(ie),[v.FILTER]:e=>{if(e.modifier==="clear")return K(ie);let t=s=>xe(v.FILTER).includes(s);if(!e.modifier||!t(e.modifier))return U({message:Te({wordList:xe(v.FILTER),inputString:e.inputString,minLengthForHints:0}),completionWordList:xe(v.FILTER)});let n=Object.values(g().tags).map(s=>s.name),o=Object.values(g().contributors).map(s=>s.name),r=e.modifier==="tag"?n:e.modifier==="assignee"?o:[];return e.inputString?r.length&&!r.includes(e.inputString.trim())?U({message:Te({prefix:`existing ${e.modifier}s... `,wordList:r,noOfHints:10,inputString:e.inputString,minLengthForHints:0}),completionWordList:r}):K():U({message:Te({prefix:"one of... ",wordList:r,noOfHints:10,inputString:e.inputString,minLengthForHints:0}),completionWordList:r})},[v.NONE]:e=>{let t=xe(v.NONE);return U({message:Te({prefix:"... ",wordList:t,inputString:e.inputString,minLengthForHints:0}),completionWordList:t})},[v.NEW]:e=>ch({list:xe(v.NEW),hint:Te({wordList:xe(v.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[v.HELP]:()=>K(ie),[v.EDIT]:mh,[v.COMMENT]:e=>{let t=wn({hint:Q(`write a comment (max ${4e3} char)...`),onOk:Q(`(${e.inputString.length}/${4e3})`)})(e);return t.validity===Zt.Invalid?t:e.inputString.length>4e3?K(Ae("max input exceeded")):t},[v.CONFIG]:uh,[v.YANK]:ph,[v.DELETE]:e=>{let t=Qc();return t.validity==="invalid"?t:Di(e)},[v.CLOSE_ISSUE]:e=>Di(e),[v.RE_OPEN_ISSUE]:e=>Di(e),[v.MOVE]:e=>{let t=Qc();return t.validity==="invalid"?t:wn({hint:Te({prefix:"hey hacker! These commands are blocked for you... ",wordList:xe(v.MOVE),noOfHints:10,inputString:e.inputString})})(e)},[v.TAG]:e=>{let n=x.getExistingTags().slice(0,10).map(ss).join("");return wn({hint:n.length?Q("create tag or reuse:")+n+Q(""):Q("create tag ...")})(e)},[v.UNTAG]:e=>{let t=zr();if(a(t))return U({message:Ae("Invalid untag target"),completionWordList:[]});let n=t.value.map(({name:o})=>o).map(ss).slice(0,10);return n.length?wn({hint:Q(" ... ")+n.join("")})(e):U({message:Ae("Issue has no tags"),completionWordList:[]})},[v.ASSIGN]:e=>{let t=x.getExistingAssignees().map(ss).slice(0,10);return wn({hint:Q("assignees... ")+t.join("")})(e)},[v.UNASSIGN]:e=>{let t=Yr();if(a(t))return U({message:Ae("Invalid unassign target"),completionWordList:[]});let n=t.value.map(({name:o})=>o).map(ss).slice(0,10);return n.length?wn({hint:Q("remove assignee... ")+n.join("")})(e):U({message:Ae("Issue has no assignees"),completionWordList:[]})},[v.SYNC]:()=>K(ie),[v.COFFEE]:e=>{let{modifier:t}=e,n=xe(v.COFFEE);return t.length&&t.length<=1&&!n.includes(t)?U({message:Q("enter an amount ... "),completionWordList:n.filter(o=>o.startsWith(t))}):wn({hint:Te({prefix:"fuel continued development with ... $ ",wordList:["1"," 3 ","5","20","custom"],inputString:"",minLengthForHints:0}),onOk:"Thank you for your support! \u{1FAE1}"})(e)}},tl=Object.fromEntries(Object.entries(gh).map(([e,t])=>[e,{validate:(n,o,r)=>t({modifier:o,command:n,inputString:r})}]))});var is,ol=y(()=>{"use strict";is=["add","fix","bug","log","run","api","cli","ui","ux","test","mock","stub","sync","hash","sign","fork","push","pull","lock","warn","leak","hang","node","seed","lint","edit","save","load","read","send","drop","swap","wrap","port","host","role","user","auth","flag","diff","perf","docs","todo","task","team","epic","spec","remove","update","change","improve","enhance","refactor","rewrite","redesign","implement","build","create","delete","rename","migrate","upgrade","downgrade","revert","rollback","restore","replace","deprecate","cleanup","simplify","optimize","stabilize","harden","document","clarify","investigate","debug","reproduce","triage","mitigate","remediate","resolve","escalate","verify","validate","benchmark","profile","audit","monitor","instrument","configure","provision","deploy","release","publish","integrate","automate","support","enable","disable","prevent","handle","ensure","prioritize","estimate","schedule","track","install","uninstall","enforce","expose","extract","inject","override","extend","customize","localize","translate","redirect","forward","dispatch","broadcast","subscribe","unsubscribe","register","allocate","reserve","persist","retrieve","archive","expire","refresh","reload","reset","recover","replay","retry","scaffold","bootstrap","finalize","terminate","suspend","resume","cancel","abort","notify","alert","trigger","debounce","frontend","backend","fullstack","infrastructure","architecture","integration","application","environment","framework","platform","service","component","module","gateway","pipeline","container","orchestrator","middleware","endpoint","interface","database","datastore","cache","queue","scheduler","worker","daemon","runtime","library","package","plugin","extension","webhook","microservice","monolith","repository","namespace","cluster","sandbox","tenant","dashboard","console","portal","client","server","browser","mobile","desktop","kernel","driver","protocol","schema","migration","fixture","template","snippet","config","manifest","bundle","exception","incident","defect","regression","degradation","malfunction","instability","intermittent","workaround","failure","outage","crash","freeze","corruption","inconsistency","severity","criticality","diagnostics","analysis","blocker","flaky","timeout","mismatch","misconfiguration","boundary","overflow","underflow","panic","stacktrace","breakage","breaking","oversight","ambiguity","discrepancy","anomaly","authorize","authenticate","confidentiality","availability","accessibility","reliability","compliance","governance","encrypt","decrypt","integrity","traceability","accountability","protection","privileges","permissions","sanitize","escape","vulnerability","exposure","secrets","credentials","certificate","session","cookie","identity","tokenization","rotation","scanning","hardening","threat","exploit","payload","injection","phishing","breach","dependency","orchestrate","synchronize","compatibility","incompatibility","interoperability","observability","telemetry","discovery","registration","coordination","distribution","isolation","virtualization","networking","routing","proxy","firewall","balancer","failover","topology","replica","shard","region","capacity","quota","metrics","logging","tracing","alerting","monitoring","heartbeat","liveness","rollover","serialize","deserialize","initialize","instantiate","propagate","aggregate","consolidate","normalize","standardize","transform","reconcile","correlate","index","partition","enrich","filter","stream","batch","parse","encode","decode","compress","decompress","deduplicate","paginate","query","ingest","export","import","backup","snapshot","mapping","record","dataset","metadata","checksum","rollup","lookup","cursor","truncate","concurrency","parallelism","contention","deadlock","throttle","backpressure","fragmentation","saturation","exhaustion","replicate","redundancy","obsolescence","starvation","overload","latency","throughput","scalability","bottleneck","memoize","prefetch","warmup","autoscale","horizontal","vertical","elasticity","recursion","allocation","leakage","garbage","collection","pooling","buffering","caching","eviction","staleness","modularize","encapsulate","abstraction","extensibility","configurability","maintainability","recoverability","readability","testability","debuggability","reusability","simplicity","consistency","linting","formatting","typecheck","coverage","tooling","scaffolding","boilerplate","technical","cleanliness","naming","comments","docstring","testing","unittest","mocking","stubbing","assertion","smoke","sanity","fuzzing","flakiness","harness","scenario","baseline","performance","functionality","requirement","recommendation","improvement","enhancement","description","acceptance","criteria","deliverable","milestone","iteration","backlog","roadmap","followup","hotfix","patch","changelog","rollout","feature","spike","proposal","specification","priority","sprint","story","subtask","assignee","reviewer","reproduction","context","expected","actual","impact","workflow","version","tracking","discussion","decision","tradeoff","feedback","approval","planning","breakdown","scoping"]});var fh,hh,vh,yh,bh,rl,sl,il,al=y(()=>{"use strict";A();M();ol();fh=3,hh=new Set(["the","and","for","are","but","not","you","all","any","can","was","one","our","out","use","this","that","with","have","from","will","your","they","them","then","than","when","what","were","been","into","should","would","could","about"]),vh=e=>{let t=[];for(let n of Object.values(e.nodes)){n.title&&t.push(n.title);let o=n.props;typeof o.description=="string"&&t.push(o.description),typeof o.value=="string"&&t.push(o.value)}for(let n of Object.values(e.tags))t.push(n.name);for(let n of Object.values(e.contributors))t.push(n.name);for(let n of Object.values(e.comments))t.push(n.md);return t},yh=e=>e.toLowerCase().split(/[^a-z0-9]+/).filter(t=>t.length>=fh&&!hh.has(t)&&!/^\d+$/.test(t)),bh=e=>{let t=new Map;for(let s of vh(e))for(let d of yh(s))t.set(d,(t.get(d)??0)+1);let n=[...t.entries()].sort((s,d)=>d[1]-s[1]||s[0].localeCompare(d[0])).map(([s])=>s),o=new Set(n),r=is.filter(s=>!o.has(s));return[...n,...r]},rl=is,sl=-1,il=()=>{let e=$e();if(a(e))return is;let t=e.value,n=t.eventLog.length;return n!==sl&&(rl=bh(t),sl=n),rl}});var dl,cl,Fi=y(()=>{"use strict";Wa();Qt();Nn();nl();al();M();de();dl=e=>Object.values(v).includes(e),cl=(e,t)=>{let n=e.command??"",{modifier:o,target:r,inputString:s}=e,{message:d,validity:l,completionWordList:u}=tl[n].validate(n,o,s),m=n!==v.PEEK&&n!==v.REPLAY,p=r==="command"||r==="modifier"?xe(n):m?il():[],{mode:f}=g(),I=f===h.COMMAND_LINE?d??"":"",N=[...u,...p];return{validity:l,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:I,autoCompletion:t?Ha(e,N):{hint:"",hints:[],remainder:"",overlap:0}}}});var ll,xh,Ih,Eh,ul=y(()=>{"use strict";Fi();Qt();ll=e=>{let t=e.trimStart(),n=Ih(t),o=n[0]??"",r=n[1]??"",s=/\s$/.test(e),d=Eh(e),l=dl(o)?o:null,u=l!==null,m=o!=="",p=l?xe(l)??[]:[],f=l&&p.includes(r)?r:"",I="word";n.length===0||n.length===1&&!s?I="command":(n.length===1&&s||n.length===2&&!s)&&(I="modifier");let N=s?"":d,T=xh(t,l,f);return{raw:e,trimmedStart:t,words:n,firstWord:o,lastWord:d,hasCommand:m,command:l,isCommandKeyword:u,isLastWordCompleted:s,modifier:f,target:I,inputToMatch:N,inputString:T}},xh=(e,t,n)=>{let o=e;return t&&o.startsWith(t)&&(o=o.slice(t.length)),o=o.replace(/^\s+/,""),n&&o.startsWith(n)&&(o=o.slice(n.length),o=o.replace(/^\s+/,"")),o},Ih=e=>e.trim()?e.trim().split(/\s+/):[],Eh=e=>e.trimEnd().split(/\s+/).at(-1)??""});import{useSyncExternalStore as VS}from"react";var zn,Bi,Yn,Rh,ml,Rt,jo,Oi,_i,pl,gl,as,fl,G,hl,vl,yl,se,ds,Ie=y(()=>{"use strict";Fi();ul();A();rs();zn=e=>e===Bi||e===":",Bi=" ",Yn={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:Zt.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},Rh=new Set,ml=()=>{for(let e of Rh)e()},Rt=e=>{let n=e(Yn),o=ll(n.value),r=n.cursorPosition===n.value.length;Yn={...n,commandMeta:cl(o,r)},ml()},jo=({message:e,status:t})=>{let n=structuredClone(Yn);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,Yn=n,ml(),c(e,null)},Oi=e=>{Rt(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},_i=e=>{Rt(t=>{let{value:n,cursorPosition:o}=t,r=o;if(e==="left"){for(;r>0&&zn(n[r-1]);)r--;for(;r>0&&!zn(n[r-1]);)r--}else{for(;r<n.length&&!zn(n[r]);)r++;for(;r<n.length&&zn(n[r]);)r++}return{...t,cursorPosition:r}})},pl=()=>{Rt(e=>{let t=e.value.slice(e.cursorPosition),n=Math.max(0,e.cursorPosition-1);return{...e,value:e.value.slice(0,n)+t,cursorPosition:n,commandIsPending:!1}})},gl=()=>{Rt(e=>{let{value:t,cursorPosition:n}=e,o=n;for(;o>0&&zn(t[o-1]);)o--;for(;o>0&&!zn(t[o-1]);)o--;let r=t.slice(n);return{...e,value:t.slice(0,o)+r,cursorPosition:o,commandIsPending:!1}})},as=e=>{Rt(t=>{let n=Math.max(0,Math.min(t.cursorPosition,t.value.length)),o=t.value.slice(0,n),r=t.value.slice(n),s=e(o,t.commandMeta.autoCompletion),d=s+r,l=Math.max(0,Math.min(s.length,d.length));return{...t,value:d,cursorPosition:l,commandIsPending:!1}})},fl=()=>{Rt(e=>({...e,commandIsPending:!0}))},G=e=>{Rt(t=>({...t,value:e,cursorPosition:e.length,commandIsPending:!1}))},hl=({addToHistory:e=!0})=>{Rt(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1,value:"",cursorPosition:0}))},vl=()=>{Rt(e=>{let t=Math.min(e.commandHistoryIndex+1,e.commandHistory.length-1),n=e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},yl=()=>{Rt(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},se=()=>Yn,ds=()=>{let[e,...t]=Yn.value.split(Bi);return t.join(Bi).trim()}});var L,un=y(()=>{"use strict";de();Fa();M();Ie();Oe();L={NavPreviousItem:"navPreviousItem",NavNextItem:"navNextItem",NavToPreviousContainer:"navToPreviousContainer",NavToNextContainer:"navToNextContainer",MovePreviousItem:"movePreviousItem",MoveNextItem:"moveNextItem",MoveToPreviousContainer:"moveToPreviousContainer",MoveToNextContainer:"moveToNextContainer",Confirm:"confirm",Exit:"exit",ViewHelp:"viewHelp",HideHelp:"hideHelp",InitMove:"initMove",ConfirmMove:"confirmMove",Delete:"Delete",InitCommandPalette:"initCommandPalette",InitCommandLine:"initCommandLine",ExitCommandLine:"exitCommandLine",CaptureInput:"captureInput",EraseInput:"eraseInput",AddItem:"addItem",GetLastCommandFromHistory:"getLastCommandFromHistory",GetNextCommandFromHistory:"getNextCommandFromHistory",AutoCompleteCommand:"autoCompleteCommand",MoveCursorLeft:"MoveCursorLeft",MoveCursorRight:"MoveCursorRight",MoveCursorLeftOfWord:"MoveCursorLeftOfWord",MoveCursorRightOfWord:"MoveCursorRightOfWord",EraseInputWord:"EraseInputWord",None:"None",Edit:"edit",EditTitle:"editTitle",EditDescription:"editDescription",Yank:"yank",SetViewDense:"SetViewDense",SetViewWide:"SetViewWide"}});var bl,D,Ui=y(()=>{"use strict";M();Nn();bl=e=>{let{context:t}=g().contextNode;if(!t)return D.None;switch(e){case v.EXIT:return D.Exit;case v.EXPORT:return D.Export;case v.COFFEE:return D.Coffee;case v.INIT:return D.Init;case v.OPEN:return D.OpenProject;case v.DELETE:return D.Delete;case v.EDIT:return D.Edit;case v.COMMENT:return D.Comment;case v.HELP:return D.ViewHelp;case v.RE_OPEN_ISSUE:return D.ReopenIssue;case v.CLOSE_ISSUE:return D.CloseIssue;case v.TAG:return D.TagTicket;case v.UNTAG:return D.UntagTicket;case v.ASSIGN:return D.AssignUserToTicket;case v.UNASSIGN:return D.UnassignUserFromTicket;case v.NEW:return D.NewItem;case v.FILTER:return D.Filter;case v.MOVE:return D.Move;case v.PEEK:return D.Peek;case v.REPLAY:return D.Replay;case v.CONFIG:return D.Config;case v.YANK:return D.Yank;case v.SYNC:return D.Sync;default:return D.None}},D={Exit:"exit",Init:"init",OpenProject:"open-project",None:"none",ViewHelp:"view-help",Rename:"rename",Edit:"edit",Delete:"delete",Filter:"filter",Move:"move",Peek:"peek",Replay:"replay",Yank:"yank",Config:"config",NewItem:"add-new-item",TagTicket:"ticket-tag",UntagTicket:"ticket-untag",AssignUserToTicket:"ticket-assign-user",UnassignUserFromTicket:"ticket-unassign-user",CloseIssue:"close-issue",ReopenIssue:"re-open-issue",Comment:"comment-issue",Sync:"sync",Export:"export",Coffee:"coffee"}});import{Text as xl}from"ink";import Il,{useEffect as El,useState as Nh}from"react";var Rl,We,Xn=y(()=>{"use strict";M();Le();Rl={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"cmd-line":["\u276F "],palette:["\u276F "]},We=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=Ge(),o=Rl[n]??Rl.default,[r,s]=Nh(0);if(El(()=>{s(0)},[o]),El(()=>{if(!e)return;let l=setInterval(()=>{s(u=>(u+1)%o.length)},500);return()=>clearInterval(l)},[e,o]),!e)return Il.createElement(xl,null,t);let d=o[r]??o[0]??t;return Il.createElement(xl,{color:S.accent,dimColor:r===1},d)}});import{Box as $i,Text as Sh}from"ink";import cs from"react";var Ch,en,Ho=y(()=>{"use strict";Le();Ch=(e,t,n,o)=>{let r=u=>Math.max(1,e[u]??1),s=n,d=n+1,l=r(n);for(;d<t&&l+r(d)<=o;)l+=r(d),d++;for(;s>0&&l+r(s-1)<=o;)s--,l+=r(s);return{start:s,end:d}},en=({children:e=[],height:t,selectedIndex:n,itemHeight:o=1,itemHeights:r,scrollByOne:s=!1})=>{if(e.length===0)return null;let d=Math.max(1,Math.floor(t)),l=Math.max(1,Math.ceil(o)),u=Math.max(0,Math.min(n,e.length-1)),m=Math.max(1,Math.floor(d/l)),p=Math.max(0,e.length-m),{start:f,end:I}=r?Ch(r,e.length,u,d):s?{start:Math.min(p,Math.max(0,u-m+1)),end:Math.min(p,Math.max(0,u-m+1))+m}:{start:Math.min(p,Math.floor(u/m)*m),end:Math.min(p,Math.floor(u/m)*m)+m},N=Math.max(1,I-f),T=e.slice(f,I),C=e.length>N,w=d,$=C?Math.max(1,Math.floor(N/e.length*w)):w,_=Math.max(0,w-$),Z=Math.max(1,e.length-N),ve=C?Math.floor(f/Z*_):0;return cs.createElement($i,{flexDirection:"row",height:d,width:"100%"},cs.createElement($i,{flexDirection:"column",flexGrow:1,height:d},T),cs.createElement($i,{flexDirection:"column",width:1,height:w},Array.from({length:w}).map((X,W)=>cs.createElement(Sh,{key:W,color:C&&W>=ve&&W<ve+$?S.accent:S.secondary},C?"\u2502":" "))))}});var Nl,ji,Ah,ls,Hi=y(()=>{"use strict";M();Ah=()=>{let{eventLog:e=[]}=g();if(ji&&Nl===e)return ji;let t=new Set;for(let n of e)n?.userId&&t.add(n.userId);return Nl=e,ji=t,t},ls=e=>Ah().has(e)});import{Text as Th}from"ink";import wh from"react";var Mh,kh,Jn,us=y(()=>{"use strict";Kr();Et();ge();Hi();Ht();Mh=e=>e.toLowerCase().trim(),kh=(e,t=Gn)=>{let n=Mh(e);return t[n]?t[n]:Uo(n)},Jn=({id:e,isSelected:t,maxWidth:n})=>{let o=x.getContributor(e);if(!o)return;let r=o.name,s=n===void 0?r:ft(r,n);return wh.createElement(Th,{underline:t,color:kh(r)},"@"+s,ls(e)?"":"\u2197")}});import{Text as Lh}from"ink";import Ph from"react";var ms,Wi=y(()=>{"use strict";ge();Le();Et();Ht();ms=({id:e,isSelected:t,maxWidth:n})=>{let o=x.getTag(e);if(!o)return;let r=n===void 0?o.name:ft(o.name,n);return Ph.createElement(Lh,{underline:t,backgroundColor:Pe(o.name),color:S.secondary}," "+r+" ")}});import{useEffect as Dh,useState as Fh}from"react";var Bh,Sl,ps,Wo,Oh,_h,Qn,gs=y(()=>{"use strict";Et();Bh=80,Sl=1400,ps=new Set,Wo=null,Oh=e=>(ps.add(e),Wo||(Wo=setInterval(()=>{for(let t of ps)t()},Bh)),()=>{ps.delete(e),ps.size===0&&Wo&&(clearInterval(Wo),Wo=null)}),_h=()=>{let e=Date.now()%Sl/Sl;return e<.5?e*2:(1-e)*2},Qn=e=>{let[,t]=Fh(0);return Dh(()=>{if(e)return Oh(()=>t(n=>n+1))},[e]),Yc(_h())}});import{Box as Go,Text as qo}from"ink";import ot from"react";var Uh,Cl,$h,jh,Tl,wl=y(()=>{"use strict";Le();Ht();Hi();qt();ko();us();Wi();gs();Uh=(e,t,n)=>{if(e.length<=t)return[e,null];let o=e.lastIndexOf(" ",t),r=o>0?o:t;return[e.slice(0,r),ft(e.slice(r).trim(),n)]},Cl=3,$h=2,jh=(e,t)=>{let n=[],o=0;for(let[r,s]of e.entries()){let d=e.length-r-1,l=d>0?String(d).length+1:0;if(o+s.width+l>t)break;o+=s.width,n.push(s)}return{shown:n,hidden:e.length-n.length}},Tl=({width:e,ticket:t,isSelected:n,isFlashing:o=!1})=>{let r=Qn(o),s=e-4,d=s-7-1,[l,u]=Uh(Be(t.title),d,s),m=u?null:ft(Be(t.props.description),s)||null,p=Xt(t),f=Jt(t).map(C=>({...C,name:C.name})),I=Math.max(1,s-Cl),{shown:N,hidden:T}=jh([...p.map(C=>({id:C.id,isTag:!0,width:Math.min(C.name.length,I)+Cl})),...f.map(C=>({id:C.id,isTag:!1,width:Math.min(C.name.length,I)+$h+(ls(C.id)?0:1)}))],s);return ot.createElement(Go,{borderStyle:"round",height:5,flexDirection:"column",overflow:"hidden",borderDimColor:!n,borderColor:o?r:n?S.accent:S.secondary,justifyContent:"space-between"},ot.createElement(Go,{paddingLeft:1,paddingRight:1,flexDirection:"column"},ot.createElement(Go,{justifyContent:"space-between"},ot.createElement(qo,{color:S.primary},l),ot.createElement(qo,{color:S.secondary2,dimColor:!0},V(t.id))),u&&ot.createElement(qo,{color:S.primary},u),m&&ot.createElement(qo,{color:S.secondary2,dimColor:!0},m)),ot.createElement(Go,{flexDirection:"row",paddingLeft:1,paddingRight:1},N.map(C=>ot.createElement(Go,{paddingRight:1,key:C.id},C.isTag?ot.createElement(ms,{id:C.id,maxWidth:I}):ot.createElement(Jn,{id:C.id,maxWidth:I}))),T>0&&ot.createElement(qo,{color:S.secondary2,dimColor:!0},"+",T)))}});import{Box as Mn,Text as Vo}from"ink";import Qe from"react";var Hh,Ml,kl=y(()=>{"use strict";de();ge();Le();Et();Xn();gs();Hh=(e,t)=>e.length>t?e.slice(0,Math.max(0,t-1))+"\u2026":e,Ml=({index:e,labelWidth:t,width:n,ticket:o,isSelected:r,isFlashing:s=!1,mode:d})=>{let l=Qn(s),u=(o.props.tags??[]).map(X=>x.getTag(X)).filter(X=>!!X),m=(o.props.assignees??[]).map(X=>x.getContributor(X)).map(X=>X&&{...X,name:X.name}).filter(X=>!!X),p=1,f=u.length*(1+p),I=m.length*(2+p),N=u.map(X=>Qe.createElement(Mn,{key:X.id,paddingRight:p},Qe.createElement(Vo,{color:Pe(X.name)},"\u25A0"))),T=m.map(X=>Qe.createElement(Mn,{key:X.id,paddingRight:p},Qe.createElement(Vo,{color:Uo(X.name)},"@"+X.name.at(0)))),C=s?l:r?S.accent:d===h.MOVE?S.secondary:S.primary,w=x.getCommentsByIssue(o.id),$=w.length?String(w.length).length+2+p:0,_=w.length?Qe.createElement(Mn,{paddingRight:p},Qe.createElement(Vo,{color:S.accent},"[",w.length,"]")):null,Z=f+I+$,ve=Math.max(1,n-t-Z-(Z>0?1:0));return Qe.createElement(Mn,{justifyContent:"space-between"},Qe.createElement(Mn,null,Qe.createElement(Mn,{width:t},r?Qe.createElement(We,{isSelected:!0}):Qe.createElement(Vo,{color:"gray",dimColor:!0},String(e+1).padStart(t-1)+" ")),Qe.createElement(Vo,{wrap:"truncate",color:C},Hh(o.title,ve))),Qe.createElement(Mn,null,N,T,_))}});import Wh from"chalk";import{Box as Gi,Text as Gh}from"ink";import Nt from"react";var qh,Ll,Pl=y(()=>{"use strict";pe();M();Le();Xn();Ho();wl();kl();gs();qh=({swimlane:e,isSelected:t,width:n,height:o,isDense:r,isFocused:s,listSelectedIndex:d,mode:l})=>{let{renderedChildrenIndex:u,replay:m}=Ge(),p=u[e.id]??[],f=m?new Set(m.flashNodeIds):null,I=f?.has(e.id)??!1,N=Qn(I),T=`${e.title} ${Wh.hex(S.secondary2).dim("("+p.length+")")}`,C=3,w=r?1:5,$=s&&d===-1,_=n-3-(r?1:0)-($?2:0),Z=Math.max(2,String(p.length).length+1),ve=o-C-1,X=Nt.createElement(Gi,{borderStyle:"round",borderColor:S.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1,marginRight:r?1:0},Nt.createElement(We,{isSelected:t}),Nt.createElement(Gh,{bold:!0,color:I?N:t?S.accent:S.primary},T," ",e.readonly?"\u{1F512}":"")),W=(q,dn)=>{let cn=s&&d===dn;if(!k(q))return null;let oo=f?.has(q.id)??!1;return r?Nt.createElement(Ml,{key:q.id,index:dn,labelWidth:Z,width:_,ticket:q,isSelected:cn,isFlashing:oo,mode:l}):Nt.createElement(Tl,{key:q.id,width:_,ticket:q,isSelected:cn,isFlashing:oo})};return Nt.createElement(Gi,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?S.accent:S.secondary,paddingRight:0,paddingLeft:r?1:0,height:o},X,Nt.createElement(Gi,null,p.length>0&&Nt.createElement(en,{selectedIndex:d,height:ve,itemHeight:w},p.map(W)),$&&Nt.createElement(We,{isSelected:!0})))},Ll=Nt.memo(qh)});var Dl,Fl,qi=y(()=>{"use strict";hn();Dl=e=>{let t=new Set((e.log??[]).filter(n=>n.action==="delete.issue.comment").map(n=>n.payload.id));return(e.log??[]).filter(n=>n.action==="add.issue.comment"&&n.payload.issue===e.id&&!t.has(n.payload.id)).length},Fl=(e,t,n)=>Se.comment({id:e.id,parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.id,props:{value:e.md},readonly:!1,isVirtual:!0})});var Zn,fs=y(()=>{"use strict";Zn=e=>{let t=Date.now()-e,n=[{label:"y",ms:1e3*60*60*24*365},{label:"mo",ms:1e3*60*60*24*30},{label:"w",ms:1e3*60*60*24*7},{label:"d",ms:1e3*60*60*24},{label:"h",ms:1e3*60*60},{label:"m",ms:1e3*60},{label:"s",ms:1e3}];for(let{label:o,ms:r}of n){let s=Math.floor(t/r);if(s>=1)return`${s}${o} ago`}return"just now"}});import{Box as eo,Text as Ft}from"ink";import De,{useEffect as Vh,useMemo as Kh,useRef as zh}from"react";import{decodeTime as Vi}from"ulid";function Ol({ticket:e,width:t,height:n}){let o=Kh(()=>Xh(e),[e]),r=zh([]);Vh(()=>(Bl(r.current),r.current=Qh(e,o),()=>{Bl(r.current),r.current=[]}),[e,o]);let{selectedIndex:s}=Ge(),l=Math.max(1,n-4),u=Math.max(12,t-32);return o.length===0?De.createElement(eo,{flexDirection:"column",width:t,height:n,padding:1},De.createElement(Ft,{color:S.primary},"No attachments yet."),De.createElement(eo,{paddingTop:1},De.createElement(Ft,{color:S.primary},"Attach images from the browser GUI"),De.createElement(Ft,{color:S.accent}," epiq gui "),De.createElement(Ft,{color:S.primary},"by dropping or pasting them."))):De.createElement(eo,{flexDirection:"column",width:t,height:n},De.createElement(eo,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:S.secondary,borderStyle:"single",paddingBottom:1},De.createElement(Ft,{color:S.secondary2},"Attachments (",o.length,") \u2014 enter to open"," ")),De.createElement(en,{height:l,itemHeight:2,selectedIndex:s},o.map((m,p)=>{let f=p===s,I=m.name.length>u?m.name.slice(0,u-1)+"\u2026":m.name;return De.createElement(eo,{key:m.id,flexDirection:"row",paddingX:1,paddingBottom:1},De.createElement(Ft,{color:S.accent},f?"\u276F ":" "),De.createElement(eo,{paddingLeft:1},De.createElement(Ft,{color:S.secondary2},`#${p+1} `),De.createElement(Ft,{color:f?S.accent:S.primary},I),De.createElement(Ft,{color:S.secondary2}," "+Zh(m.bytes)+" "+Zn(Vi(m.id)))))})))}var Yh,Xh,Bl,Jh,Qh,Zh,_l=y(()=>{"use strict";Xe();fs();pe();A();ge();hn();M();Le();Vn();Ho();Yh=e=>Ce(e,"attachments"),Xh=e=>x.getAttachmentsByIssue(e.id).sort((t,n)=>Vi(t.id)-Vi(n.id)),Bl=e=>{for(let t of e)x.deleteNode(t.id)},Jh=(e,t,n)=>Se.field({id:e.id,name:e.name,parentNodeId:n,rank:String(t).padStart(6,"0"),isVirtual:!0}),Qh=(e,t)=>{let n=x.getNode(Yh(e.id));if(!n||!Ve(n))return[];let o=t.map((r,s)=>Jh(r,s,n.id)).map(r=>x.createNode(r)).filter(Ct).map(({value:r})=>r).filter(Ve);return t.length>0&&g().selectedIndex<0&&O.navigate({contextNode:n,selectedIndex:0}),o},Zh=e=>`${Math.max(1,Math.round(e/1024))} KB`});var $l,Ki,Ul,zi,jl,Hl,ev,Wl,tv,Yi,Gl=y(()=>{"use strict";$l=/<!--\s*epiq-diff-comment:(.+?)-->\n?/,Ki=e=>e.replace($l,""),Ul=e=>e==="additions"||e==="deletions",zi=e=>{let t=$l.exec(e);if(!t?.[1])return null;let n;try{n=JSON.parse(t[1])}catch{return null}let o=n;return typeof o?.filePath!="string"||typeof o.start!="number"||typeof o.end!="number"||typeof o.note!="string"||!Ul(o.side)||!Ul(o.endSide)||o.sha!==void 0&&typeof o.sha!="string"||o.issueRef!==void 0&&typeof o.issueRef!="string"?null:o},jl=/```\n([\s\S]*?)\n?```\s*$/,Hl=e=>jl.exec(e)?.[1]??null,ev=/`[^`\n]+`[^\n]*\n?$/,Wl=e=>Ki(e).replace(jl,"").replace(ev,"").trim(),tv=e=>{let n=(e.endSide??e.side)==="deletions"?"removed":"added";return e.start===e.end?`line ${e.start} (${n})`:`lines ${e.start}-${e.end} (${n})`},Yi=e=>`${e.issueRef?`${e.issueRef} \xB7 `:""}${e.filePath} ${tv(e)}`});var nv,Ko,ov,Xi,Vl,ql,Kl,Ji=y(()=>{"use strict";Gl();nv=(e,t)=>{let n=Math.max(1,Math.floor(t)),o=e.split(/\s+/).filter(Boolean);if(o.length===0)return[""];let r=[],s="";for(let d of o){let l=d;for(;l.length>n;)s&&(r.push(s),s=""),r.push(l.slice(0,n)),l=l.slice(n);s?s.length+1+l.length<=n?s=`${s} ${l}`:(r.push(s),s=l):s=l}return s&&r.push(s),r},Ko=e=>{let t=e.split("`");return t.length%2===0?[{text:e}]:t.map((n,o)=>o%2===1?{text:n,code:!0}:{text:n}).filter(n=>n.text.length>0)},ov=e=>e.map(t=>t.code?`\`${t.text}\``:t.text).join(""),Xi=e=>{let t=!1;return e.map(n=>{if(/^\s*```/.test(n))return t=!t,{kind:"fence"};if(t)return{kind:"code",text:n};let o=zi(n);if(o)return{kind:"caption",text:Yi(o)};if(n.trim()==="")return{kind:"blank"};let r=/^#{1,6}\s+(.*)$/.exec(n);return r?{kind:"heading",spans:Ko(r[1]??"")}:{kind:"text",spans:Ko(n)}})},Vl=(e,t)=>e.length<=t?[e]:e.match(new RegExp(`.{1,${t}}`,"g"))??[""],ql=(e,t)=>{let n=[];for(let o of Xi(e))if(o.kind!=="fence"){if(o.kind==="blank"){n.length>0&&n[n.length-1]?.kind!=="blank"&&n.push(o);continue}if(o.kind==="code"){for(let r of Vl(o.text,t))n.push({kind:"code",text:r});continue}if(o.kind==="caption"){n.push(o);continue}for(let r of nv(ov(o.spans),t))n.push({kind:o.kind,spans:Ko(r)})}for(;n.length>0&&n[n.length-1]?.kind==="blank";)n.pop();return n},Kl=(e,t)=>{let n=zi(e),o=n?Hl(e):null;if(!n||o===null)return ql(Ki(e).split(`
54
+ `),t);let r=Wl(e),s=o.split(`
55
+ `),d=n.side===n.endSide?n.start:void 0,l=d===void 0?0:String(d+s.length-1).length+3;return[...r?[...ql(r.split(`
56
+ `),t),{kind:"blank"}]:[],{kind:"caption",text:Yi(n)},...s.flatMap((u,m)=>Vl(u,Math.max(1,t-l)).map((p,f)=>({kind:"code",text:p,number:d===void 0||f>0?void 0:d+m})))]}});import{Box as zl,Text as kn}from"ink";import rt from"react";var Yl,Qi,Xl,Zi=y(()=>{"use strict";Le();Yl=({spans:e,bold:t})=>rt.createElement(kn,{color:S.primary,bold:t},e.map((n,o)=>n.code?rt.createElement(kn,{key:o,color:S.yellow},n.text):rt.createElement(kn,{key:o},n.text))),Qi=({line:e,width:t,gutter:n=0})=>{switch(e.kind){case"blank":return rt.createElement(kn,null," ");case"fence":return rt.createElement(kn,{color:S.secondary2},"```");case"caption":return rt.createElement(kn,{color:S.accent},e.text);case"heading":return rt.createElement(Yl,{spans:e.spans,bold:!0});case"text":return rt.createElement(Yl,{spans:e.spans});case"code":{let o=n>0?`${e.number===void 0?"":String(e.number)}`.padStart(n-3)+" \u2502 ":"";return rt.createElement(kn,{backgroundColor:S.secondary,color:S.primary},o,e.text.padEnd(Math.max(0,t-o.length)))}}},Xl=({lines:e,width:t})=>{let n=e.flatMap(r=>r.kind==="code"&&r.number!==void 0?[r.number]:[]),o=n.length>0?String(Math.max(...n)).length+3:0;return rt.createElement(zl,{flexDirection:"column"},e.map((r,s)=>rt.createElement(zl,{key:s},rt.createElement(Qi,{line:r,width:t,gutter:o}))))}});import{Box as tn,Text as nn}from"ink";import Re,{useEffect as rv,useMemo as Jl,useRef as sv}from"react";import{decodeTime as ea}from"ulid";function Zl({ticket:e,width:t,height:n}){let o=Jl(()=>dv(e),[e]),r=sv([]);rv(()=>(Ql(r.current),r.current=cv(e,o),()=>{Ql(r.current),r.current=[]}),[e,o]);let{selectedIndex:s}=Ge(),l=Math.max(1,n-4),u=Math.max(20,t-8),m=Jl(()=>o.map(f=>{let I=Kl(f.md,u);return I.length>0?I:[{kind:"blank"}]}),[o,u]),p=m.map(f=>f.length+iv);return o.length===0?Re.createElement(tn,{flexDirection:"column",width:t,height:n,padding:1},Re.createElement(nn,{color:S.primary},"No comments yet."),Re.createElement(tn,{paddingTop:1},Re.createElement(nn,{color:S.primary},"Use"),Re.createElement(nn,{color:S.accent}," :comment "),Re.createElement(nn,{color:S.primary},"to add the first one."))):Re.createElement(tn,{flexDirection:"column",width:t,height:n},Re.createElement(tn,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:S.secondary,borderStyle:"single",paddingBottom:1},Re.createElement(nn,{color:S.secondary2},"Comments (",o.length,") ")),Re.createElement(en,{height:l,itemHeights:p,selectedIndex:s},o.map((f,I)=>{let N=I===s;return Re.createElement(tn,{key:f.id,flexDirection:"column",paddingX:1,borderLeft:!1,borderBottom:!1,borderRight:!1,borderColor:S.secondary,borderStyle:"single"},Re.createElement(tn,{flexDirection:"row",paddingBottom:1},Re.createElement(nn,{color:S.accent},N?"\u276F ":" "),Re.createElement(tn,{paddingLeft:1},Re.createElement(nn,{color:S.secondary2},`#${I+1} `),Re.createElement(Jn,{id:f.authorId}),Re.createElement(nn,{color:S.secondary2}," "+Zn(ea(f.id))))),Re.createElement(tn,{paddingLeft:3,paddingBottom:1},Re.createElement(Xl,{lines:m[I]??[],width:u})))})))}var iv,av,dv,Ql,cv,eu=y(()=>{"use strict";Xe();fs();pe();A();ge();M();Le();Vn();us();Ho();qi();Ji();Zi();iv=4,av=e=>Ce(e,"comments"),dv=e=>x.getCommentsByIssue(e.id).sort((t,n)=>ea(t.id)-ea(n.id)).map(t=>({id:t.id,issue:t.issue,authorId:t.authorId,authorName:t.authorName,md:t.md})),Ql=e=>{for(let t of e)x.deleteNode(t.id)},cv=(e,t)=>{let n=x.getNode(av(e.id));if(!n||!Ve(n))return[];let o=t.map((r,s)=>Fl(r,s,n.id)).map(x.createNode).filter(Ct).map(({value:r})=>r).filter(so);return t.length>0&&g().selectedIndex<0&&O.navigate({contextNode:n,selectedIndex:0}),o}});import{Box as hs,Text as lv}from"ink";import Bt from"react";var tu,nu=y(()=>{"use strict";pe();ge();_n();M();Le();us();Xn();Wi();tu=({selectedIndex:e,parent:t,selected:n})=>{let{contextNode:o}=Ge(),{title:r}=t,s=t.parentNodeId?x.getNode(t.parentNodeId):void 0,d=s&&k(s)?r===ne.ASSIGNEES?s.props.assignees??[]:r===ne.TAGS?(s.props.tags??[]).filter(l=>x.getTag(l)):[]:[];return Bt.createElement(hs,{alignItems:"center",paddingTop:1},Bt.createElement(hs,{minWidth:12},Bt.createElement(We,{isSelected:n}),Bt.createElement(lv,{color:n?S.accent:S.secondary2},r,":")),Bt.createElement(hs,{flexDirection:"row",marginLeft:1,paddingRight:1},d.map((l,u)=>{let m=o.id===t.id&&u===e;return Bt.createElement(hs,{key:`${r}-${l}`,paddingRight:2,minHeight:1},Bt.createElement(We,{isSelected:m}),r===ne.ASSIGNEES?Bt.createElement(Jn,{isSelected:m,id:l}):r===ne.TAGS?Bt.createElement(ms,{isSelected:m,id:l}):null)})))}});import{Box as zo,Text as ta}from"ink";import pt,{useEffect as uv,useMemo as na}from"react";var mv,ou,oa,ru,pv,ra,su=y(()=>{"use strict";ge();A();hn();M();Le();Ht();Xn();Ho();Zi();Ji();Bn();mv="\u2029",ou=(e,t)=>`${e}::inline-line::${t}`,oa=new Map,ru=e=>{let t=oa.get(e)??[];oa.delete(e);for(let n of t)x.deleteNode(n)},pv=(e,t)=>{ru(e);let n=[];t.forEach((o,r)=>{let s=Ke(BigInt(r+1));if(!Ct(s))return;let d=x.createNode(Se.text({id:ou(e,r),name:`Line ${r+1}`,parentNodeId:e,rank:s.value,props:{value:o},readonly:!0,isVirtual:!0}));Ct(d)&&n.push(d.value.id)}),oa.set(e,n)},ra=({id:e,label:t,text:n,height:o,selected:r,maxWidth:s})=>{let{selectedIndex:d,contextNode:l}=Ge(),u=na(()=>typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[],[n]),m=na(()=>u.join("\0"),[u]);uv(()=>(pv(e,u),()=>{ru(e)}),[e,m]);let p=s-10,I=na(()=>Xi(u).map(N=>{if(N.kind==="code")return{...N,text:ft(N.text,p)};if(N.kind==="text"||N.kind==="heading"){let T=N.spans.map(C=>C.code?`\`${C.text}\``:C.text).join("");return{...N,spans:Ko(ft(T,p))}}return N}),[u,p]).map((N,T)=>{let C=l.id===e&&d===T;return pt.createElement(zo,{key:ou(e,T)},pt.createElement(ta,{color:C?S.primary:S.secondary2,dimColor:!C},`${T+1} `.padStart(5,"\xA0")),N.kind==="blank"?pt.createElement(ta,{backgroundColor:C?"gray":void 0},mv):pt.createElement(zo,null,pt.createElement(Qi,{line:N,width:N.kind==="code"?p:0})))});return pt.createElement(zo,{flexDirection:"column",paddingTop:1},pt.createElement(zo,null,pt.createElement(We,{isSelected:r}),pt.createElement(ta,{color:r?S.accent:S.secondary2},t)),pt.createElement(zo,{flexDirection:"row",borderStyle:"round",borderColor:S.secondary,paddingLeft:1,marginLeft:1},pt.createElement(en,{scrollByOne:!0,height:o-3,selectedIndex:d,itemHeight:1},I)))}});import{Box as Ln,Text as sa}from"ink";import we,{useMemo as Yo}from"react";var gv,fv,hv,vv,iu,au=y(()=>{"use strict";pe();ge();M();Le();qi();Vn();_l();eu();Xn();nu();su();gv=e=>Ce(e,"description"),fv=e=>Ce(e,"comments"),hv=e=>Ce(e,"history"),vv=e=>Ce(e,"attachments"),iu=({ticket:e,height:t})=>{let n=Yo(()=>Dl(e),[e]),{selectedIndex:o,contextNode:r}=Ge(),s=process.stdout.columns||120,d=Yo(()=>gv(e.id),[e.id]),l=Yo(()=>fv(e.id),[e.id]),u=Yo(()=>hv(e.id),[e.id]),m=Yo(()=>vv(e.id),[e.id]),p=x.getAttachmentsByIssue(e.id).length,f=r.id===e.id,I=r.id===l||r.parentNodeId===l,N=r.id===u||r.parentNodeId===u,T=r.id===m||r.parentNodeId===m,C=re(e.id);if(I){let q=t-3;return we.createElement(Ln,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},we.createElement(Zl,{ticket:e,width:s,height:q}))}if(T){let q=t-3;return we.createElement(Ln,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},we.createElement(Ol,{ticket:e,width:s,height:q}))}if(N){let W=x.getNode(u),q=W&&Ve(W)?W.props.value??"":"",cn=t-3;return we.createElement(Ln,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},W?we.createElement(ra,{id:W.id,label:"Event log",text:q,selected:!1,maxWidth:s,height:cn}):null)}let w=C.reduce((W,q)=>ro(q)||q.id===l||q.id===m||q.id===u?W+1:W,0),$=2,_=3,Z=w,ve=t-_-Z-$,X=(W,q)=>W.id===d?we.createElement(ra,{key:W.id,id:d,label:"Description (press e to edit)",text:e.props.description??"",selected:q,maxWidth:s,height:ve}):ro(W)?we.createElement(tu,{key:W.id,parent:W,selected:q,selectedIndex:o}):W.id===l?we.createElement(Ln,{key:W.id,paddingTop:1},we.createElement(We,{isSelected:q}),we.createElement(sa,{backgroundColor:S.secondary,color:q?S.accent:S.primary},` Comments (${n}) \u203A\u203A `)):W.id===m?we.createElement(Ln,{key:W.id,paddingTop:1},we.createElement(We,{isSelected:q}),we.createElement(sa,{backgroundColor:S.secondary,color:q?S.accent:S.primary},` Attachments (${p}) \u203A\u203A `)):W.id===u?we.createElement(Ln,{key:W.id,paddingTop:1},we.createElement(We,{isSelected:q}),we.createElement(sa,{backgroundColor:S.secondary,color:q?S.accent:S.primary}," History \u203A\u203A ")):null;return we.createElement(Ln,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},C.map((W,q)=>X(W,f&&o===q)))}});import{Box as yv}from"ink";import vs from"react";var bv,du,cu=y(()=>{"use strict";pe();Pl();au();bv=({swimlanes:e,contextNode:t,selectedIndex:n,breadCrumb:o,mode:r,viewMode:s,height:d,width:l})=>{let u=t.context,m=u===F.TICKET||u===F.FIELD_LIST||u===F.FIELD,p=u===F.BOARD||u===F.SWIMLANE,f=u===F.TICKET?t:o.find(w=>w.context===F.TICKET),I=Math.floor(l/3),N=Math.floor(l/Math.max(e.length,1)),T=Math.min(N,I),C=s==="dense";return vs.createElement(yv,{flexDirection:"row",height:d},p&&e.map((w,$)=>{let _=t.id===w.id,Z=_?n:-1,ve=t.context===F.BOARD&&n===$;return vs.createElement(Ll,{key:w.id,height:d,width:T,swimlane:w,isSelected:ve,isDense:C,isFocused:_,listSelectedIndex:Z,mode:r})}),m&&f&&vs.createElement(iu,{height:d,ticket:f}))},du=vs.memo(bv)});import lu from"node:fs";import xv from"node:path";import Iv from"react";import{render as Ev}from"ink";import{Writable as Rv}from"node:stream";var Xo,Nv,Sv,Cv,Av,uu,mu=y(()=>{"use strict";cu();pe();A();M();le();Oe();Xo=e=>String(e).padStart(2,"0"),Nv=e=>{let t=e.getUTCFullYear(),n=Xo(e.getUTCMonth()+1),o=Xo(e.getUTCDate()),r=Xo(e.getUTCHours()),s=Xo(e.getUTCMinutes()),d=Xo(e.getUTCSeconds());return`${t}-${n}-${o}_${r}-${s}-${d}`},Sv=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^[-.]+|[-.]+$/g,"").toLowerCase()||"board",Cv=async(e,{width:t,height:n})=>{let o="",r=new Rv({write(d,l,u){let m=Av(d.toString()).trimEnd();m.trim().length>0&&m.includes("\u256D")&&(o=m),u()}});r.columns=t,r.rows=n,r.isTTY=!0;let s=Ev(e,{stdout:r,debug:!1,exitOnCtrlC:!1,patchConsole:!1,incrementalRendering:!1});return await new Promise(d=>setTimeout(d,0)),s.unmount(),o},Av=e=>e.replace(/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,""),uu=async()=>{let{viewMode:e}=ye(),{contextNode:t,selectedIndex:n,breadCrumb:o,mode:r,renderedChildrenIndex:s}=g(),d=o.find($=>$.context==="BOARD");if(!d)return i("No board found to export");let l=120,u=40,m=await Cv(Iv.createElement(du,{height:u,width:l,swimlanes:(s[d.id]??[]).filter($=>$!==void 0&&ln($)),contextNode:t,selectedIndex:n,breadCrumb:o,viewMode:e??"dense",mode:r}),{width:l,height:u});if(!m)return i("Failed to render board export");let p=xr(process.cwd());if(a(p))return i("Unable to export, epiq root not found");let f=new Date,I=Nv(f),N=`board_${Sv(d.title)}_${I}.md`,T=pd(p.value);lu.mkdirSync(T,{recursive:!0});let C=xv.join(T,N),w=`# Board - ${d.title}
57
+ Date: ${f.toISOString()}
47
58
 
48
59
  \`\`\`text
49
60
  ${m}
50
61
  \`\`\`
51
- `;return $c.writeFileSync(T,O,"utf8"),c("Exported board layout",T)}});var Hr,pi=y(()=>{"use strict";Hr=e=>{let t=e.log??[];for(let n=t.length-1;n>=0;n--){let o=t[n];if(o&&o.action==="close.issue"&&o.payload.id===e.id){for(let r=n-1;r>=0;r--){let s=t[r];if(s&&"id"in s.payload&&s.payload.id===e.id&&"parent"in s.payload&&s.payload.parent)return s.payload.parent}return null}}return null}});import{useSyncExternalStore as CS}from"react";var gi,Sf,Af,Wn,Tf,Gt,Vr=y(()=>{"use strict";A();Sf=new Set,Af=()=>{for(let e of Sf)e()},Wn=()=>{if(!gi)throw new Error("Ui state not initialized. Call initUiState() first.");return gi},Tf=e=>{let t=Wn();return gi=e(t),Af(),c("UX state updated",null)},Gt=e=>Tf(t=>({...t,...e}))});import{spawn as wf}from"node:child_process";function Ao(e){let t=process.platform,r=wf(t==="darwin"?"open":t==="win32"?"cmd":"xdg-open",t==="win32"?["/c","start","",e]:[e],{detached:!0,stdio:"ignore",shell:!1});return r.unref(),r.on("error",()=>{}),!0}var fi=y(()=>{"use strict"});import{spawn as kS,spawnSync as Mf}from"node:child_process";import Lf from"node:os";import Hc from"node:path";import{ulid as kf}from"ulid";function Vc(e){let t=[],n="",o=!1,r=null;for(let s of e.trim()){if(r){s===r?r=null:n+=s;continue}if(s==='"'||s==="'"){r=s,o=!0;continue}if(/\s/.test(s)){o&&t.push(n),n="",o=!1;continue}n+=s,o=!0}return o&&t.push(n),t}function Pf(e){let t=e.trim();return t==="$EDITOR"?process.env.EDITOR:t==="$VISUAL"?process.env.VISUAL:t}function Kc(){let{preferredEditor:e}=ae(),t=[e?Pf(e):void 0,process.env.VISUAL,process.env.EDITOR].filter(n=>!!n?.trim());return[...new Set(t)]}function qc(e){let[t=""]=Vc(e);return/(^|\/)code(-insiders)?$/.test(t)}function Df(e,t){let[n="",...o]=Vc(e);return{command:n,args:[...o,...t]}}function Ff(e,t){return Df(e,qc(e)?["--wait",t]:[t])}function Gc(e){let t=Hc.join(Lf.tmpdir(),"epiq");Be.mkDir(t);let n=Hc.join(t,kf());Be.writeToFile(n,e??"");let o=Kc();for(let r of o){let{command:s,args:d}=Ff(r,n);if(!s)continue;let l=Mf(s,d,{stdio:"inherit"});if(!l.error&&l.status===0){let u=Be.readFile(n);if(u==null)return i("Unable to read edited file");let m=u.replace(/\r?\n$/,"");return c("Successfully edited",m)}}return i("Unable to open editor")}var vi=y(()=>{"use strict";A();ke();Rr()});import{ulid as hi}from"ulid";var zc,Of,Bf,Yc=y(()=>{"use strict";vi();cn();rt();st();ie();A();Sn();le();w();me();Ht();zc=async e=>{let{contextNode:t,selectedIndex:n}=g(),o=Z(t.id)[n];if(e.modifier===Ke.DESCRIPTION)return Bf();if(o&&Kn(o))return Of(e);if(e.modifier===Ke.TITLE){let r=ce();if(a(r))return i("Unable to resolve user ID");let s=o;if(!s)return i("Missing node");if(s.readonly)return i("Cannot rename readonly node");let d=e.inputString.trim();if(!d)return i("Provide a title");let l=await mt();return a(l)?l:B([{id:hi(),action:"edit.title",payload:{id:s.id,name:d},...r.value}],l.value)}return i("Unknown edit command")},Of=async e=>{let t=ce();if(a(t))return i("Unable to resolve user ID");let{contextNode:n,selectedIndex:o}=g(),r=Z(n.id)[o];if(!r||!Kn(r))return i("Select a comment first");if(r.readonly)return i("Cannot edit readonly comment");let s=n.parentNodeId;if(!s)return i("Unable to resolve comment issue");let d=g().nodes[s];if(!d||!L(d))return i("Unable to resolve comment issue");if(d.readonly)return i("Cannot edit readonly issue");let l=r.id.split(":").at(0)??"",u=I.getComment(l);if(!u||u.deleted)return i("Unable to resolve comment");if(u.issue!==d.id)return i("Comment does not belong to selected issue");if(u.authorId!==t.value.userId)return i("You can only edit your own comments"+u.authorId+"<->"+t.value.userId);let m=e.inputString.trim();if(!m)return i("Provide a comment");let p=await mt();if(a(p))return p;let v=p.value;return B([{id:hi(),action:"edit.issue.comment",payload:{id:u.id,issue:d.id,md:m},...t.value}],v)},Bf=async()=>{let e=ce();if(a(e))return i("Unable to resolve user ID");let t=await mt();if(a(t))return t;let n=t.value,{breadCrumb:o,selectedNode:r}=g(),s=$e([...o,r],"TICKET");if(a(s))return i("Edit target must be an issue");let d=s.value;if(!L(d))return i("Edit target must be an issue");if(d.readonly)return i("Cannot edit readonly issue");let l=Z(d.id).find(v=>v.title===Q.DESCRIPTION);if(!l)return i("No target found");if(l.readonly)return i("Cannot edit readonly field");let u=d.props.description??"";if(typeof u!="string")return i("Selected field is not editable text");let m=Gc(u);if(a(m))return i("Failed to edit field");let p=m.value;return p===u?c("No changes made",null):B([{id:hi(),action:"edit.description",payload:{id:d.id,md:p},...e.value}],n)}});import yi from"node:fs";import Uf from"node:path";var Xc,Jc=y(()=>{"use strict";A();Bt();Xc=async e=>{let t=Uf.join(e,".gitignore"),n=yi.existsSync(t)?yi.readFileSync(t,"utf8"):"",o=[".epiq/events/",".epiq/log/"],r=n.split(`
62
+ `;return lu.writeFileSync(C,w,"utf8"),c("Exported board layout",C)}});var ys,ia=y(()=>{"use strict";ys=e=>{let t=e.log??[];for(let n=t.length-1;n>=0;n--){let o=t[n];if(o&&o.action==="close.issue"&&o.payload.id===e.id){for(let r=n-1;r>=0;r--){let s=t[r];if(s&&"id"in s.payload&&s.payload.id===e.id&&"parent"in s.payload&&s.payload.parent)return s.payload.parent}return null}}return null}});import{useSyncExternalStore as xw}from"react";var aa,Tv,wv,to,Mv,on,bs=y(()=>{"use strict";A();Tv=new Set,wv=()=>{for(let e of Tv)e()},to=()=>{if(!aa)throw new Error("Ui state not initialized. Call initUiState() first.");return aa},Mv=e=>{let t=to();return aa=e(t),wv(),c("UX state updated",null)},on=e=>Mv(t=>({...t,...e}))});import{spawn as kv}from"node:child_process";function Jo(e){let t=process.platform,r=kv(t==="darwin"?"open":t==="win32"?"cmd":"xdg-open",t==="win32"?["/c","start","",e]:[e],{detached:!0,stdio:"ignore",shell:!1});return r.unref(),r.on("error",()=>{}),!0}var da=y(()=>{"use strict"});import{spawn as Aw,spawnSync as Lv}from"node:child_process";import Pv from"node:os";import pu from"node:path";import{ulid as Dv}from"ulid";function gu(e){let t=[],n="",o=!1,r=null;for(let s of e.trim()){if(r){s===r?r=null:n+=s;continue}if(s==='"'||s==="'"){r=s,o=!0;continue}if(/\s/.test(s)){o&&t.push(n),n="",o=!1;continue}n+=s,o=!0}return o&&t.push(n),t}function Fv(e){let t=e.trim();return t==="$EDITOR"?process.env.EDITOR:t==="$VISUAL"?process.env.VISUAL:t}function fu(){let{preferredEditor:e}=ye(),t=[e?Fv(e):void 0,process.env.VISUAL,process.env.EDITOR].filter(n=>!!n?.trim());return[...new Set(t)]}function hu(e){let[t=""]=gu(e);return/(^|\/)code(-insiders)?$/.test(t)}function Bv(e,t){let[n="",...o]=gu(e);return{command:n,args:[...o,...t]}}function Ov(e,t){return Bv(e,hu(e)?["--wait",t]:[t])}function vu(e){let t=pu.join(Pv.tmpdir(),"epiq");je.mkDir(t);let n=pu.join(t,Dv());je.writeToFile(n,e??"");let o=fu();for(let r of o){let{command:s,args:d}=Ov(r,n);if(!s)continue;let l=Lv(s,d,{stdio:"inherit"});if(!l.error&&l.status===0){let u=je.readFile(n);if(u==null)return i("Unable to read edited file");let m=u.replace(/\r?\n$/,"");return c("Successfully edited",m)}}return i("Unable to open editor")}var ca=y(()=>{"use strict";A();Oe();es()});import{ulid as la}from"ulid";var yu,_v,Uv,bu=y(()=>{"use strict";ca();In();ut();gt();pe();A();_n();ge();M();le();Qt();yu=async e=>{let{contextNode:t,selectedIndex:n}=g(),o=re(t.id)[n];if(e.modifier===Je.DESCRIPTION)return Uv();if(o&&so(o))return _v(e);if(e.modifier===Je.TITLE){let r=fe();if(a(r))return i("Unable to resolve user ID");let s=o;if(!s)return i("Missing node");if(s.readonly)return i("Cannot rename readonly node");let d=e.inputString.trim();if(!d)return i("Provide a title");let l=await yt();return a(l)?l:B([{id:la(),action:"edit.title",payload:{id:s.id,name:d},...r.value}],l.value)}return i("Unknown edit command")},_v=async e=>{let t=fe();if(a(t))return i("Unable to resolve user ID");let{contextNode:n,selectedIndex:o}=g(),r=re(n.id)[o];if(!r||!so(r))return i("Select a comment first");if(r.readonly)return i("Cannot edit readonly comment");let s=n.parentNodeId;if(!s)return i("Unable to resolve comment issue");let d=g().nodes[s];if(!d||!k(d))return i("Unable to resolve comment issue");if(d.readonly)return i("Cannot edit readonly issue");let l=r.id.split(":").at(0)??"",u=x.getComment(l);if(!u||u.deleted)return i("Unable to resolve comment");if(u.issue!==d.id)return i("Comment does not belong to selected issue");if(u.authorId!==t.value.userId)return i("You can only edit your own comments"+u.authorId+"<->"+t.value.userId);let m=e.inputString.trim();if(!m)return i("Provide a comment");let p=await yt();if(a(p))return p;let f=p.value;return B([{id:la(),action:"edit.issue.comment",payload:{id:u.id,issue:d.id,md:m},...t.value}],f)},Uv=async()=>{let e=fe();if(a(e))return i("Unable to resolve user ID");let t=await yt();if(a(t))return t;let n=t.value,{breadCrumb:o,selectedNode:r}=g(),s=qe([...o,r],"TICKET");if(a(s))return i("Edit target must be an issue");let d=s.value;if(!k(d))return i("Edit target must be an issue");if(d.readonly)return i("Cannot edit readonly issue");let l=re(d.id).find(f=>f.title===ne.DESCRIPTION);if(!l)return i("No target found");if(l.readonly)return i("Cannot edit readonly field");let u=d.props.description??"";if(typeof u!="string")return i("Selected field is not editable text");let m=vu(u);if(a(m))return i("Failed to edit field");let p=m.value;return p===u?c("No changes made",null):B([{id:la(),action:"edit.description",payload:{id:d.id,md:p},...e.value}],n)}});import ua from"node:fs";import $v from"node:path";var xu,Iu=y(()=>{"use strict";A();wt();xu=async e=>{let t=$v.join(e,".gitignore"),n=ua.existsSync(t)?ua.readFileSync(t,"utf8"):"",o=[".epiq/events/",".epiq/log/"],r=n.split(`
52
63
  `).map(u=>u.trim()),s=o.filter(u=>!r.some(m=>m===u||m===u.replace(/\/$/,"")||m==="/"+u||m==="/"+u.replace(/\/$/,"")));if(s.length===0)return c("Local epiq paths already ignored",!1);let l=["# [epiq]: local hydrated state is never committed",...s].join(`
53
64
  `);return n=n.trimEnd()+`
54
65
 
55
66
  ${l}
56
- `,yi.writeFileSync(t,n,"utf8"),J.info(`Added ${s.join(", ")} to .gitignore (epiq local state)`),c("Local epiq paths ignored",!0)}});import _f from"node:fs";import Qc from"node:path";var $f,Y,Zc,el=y(()=>{"use strict";Jc();jo();ct();Ot();mr();He();co();sr();Nt();rt();ne();A();Ft();Ie();ke();w();me();$f=async e=>{let t=await _({cwd:e,args:["status","--porcelain"]});return a(t)?t:c("Checked git diff",t.value.stdout.trim().length>0)},Y=(e,t)=>i(`[${e}] ${t}`),Zc=async()=>{V("");let e=_o(),t=await dt(process.cwd());if(a(t))return Y(1,t.message);let n=t.value,o=await Vo(n);if(a(o))return Y(2,o.message);if(o.value)return Y(2,`Cannot initialize Epiq while a git operation is in progress: ${o.value}`);let r=await $f(n);if(a(r))return Y(2.5,r.message);if(r.value)return Y(3,"Cannot initialize Epiq with uncommitted changes. Commit or stash your changes first.");if(fs(n))return Y(4,"Epiq project already initialized");let s=vr();if(!s.isSetupDone||!s.userName)return Y(5,"Missing Epiq user configuration (userId / userName). Run setup first.");let d=ae(),l=d.userName,u=d.userId;if(!u||!l)return Y(5,"Missing Epiq user id");let m=await td(n);if(a(m))return Y(6,m.message);let p=e.stateBranch,v=await Ko({repoRoot:n,branch:p});if(a(v))return Y(6,v.message);if(v.value)return Y(6,`State branch already exists: ${p}`);let x=await ks({repoRoot:n,stateBranchName:p});if(a(x))return Y(6,x.message);let R=zo();if(a(R))return Y(7,R.message);let S=Qc.join(Go(),e.projectId),T=await so({repoRoot:n,stateBranchRoot:S,stateBranchName:p});if(a(T))return Y(8,T.message);let O=Qc.join(S,".epiq");_f.mkdirSync(O,{recursive:!0});let $=Xa({userId:u,userName:l});if(a($))return Y(9,$.message);for(let os of $.value){let Ui=nr({event:os,rootDir:S});if(a(Ui))return Y(9,Ui.message)}let W=await ur({stateBranchRoot:S,eventFileName:dn({userId:u,userName:l})});if(a(W))return Y(10,W.message);let ve=await Cn({cwd:S,message:"[epiq:init]"});if(a(ve))return Y(10,ve.message);let Ee=await Xc(n);if(a(Ee))return Y(11,Ee.message);let G=ea({repoRoot:n,fileContents:e});if(a(G))return Y(12,G.message);let q=await he.stage({cwd:n,pathspec:[".epiq/project.json",".gitignore"]});if(a(q))return Y(13,q.message);let H=await he.commit({cwd:n,message:"[epiq:init-project]",pathspec:[".epiq/project.json",".gitignore"]});if(a(H))return Y(13,H.message);let Jt="Project initialized!",Qt=await _({cwd:n,args:["push","-u","origin","HEAD"]});a(Qt)&&(Jt+=` Warn: [init:14] ${Qt.message}`);let Hn=await io({repoRoot:n,stateBranchRoot:S});a(Hn)&&(Jt+=` Warn: [init:15] ${Hn.message}`);let Oi=Et($.value).filter(a);if(Oi.length>0)return Y(16,Oi.map(os=>os.message).join(`
57
- `));let ns=Oe();if(a(ns))return Y(16,ns.message);let{rootNodeId:qu,nodes:Gu}=ns.value,Bi=Gu[qu];return Bi?(F.navigate({contextNode:Bi,selectedIndex:0}),E({hasProjectDefinition:!0,mode:f.DEFAULT}),c(Jt,null)):Y(16,"Unable to resolve initialized root node")}});import{ulid as jf}from"ulid";function Ii(e){let t=nl();if(a(t))return t;let{contextNode:n,nodes:o}=g();if(!n.parentNodeId)return i("Missing parent node id");let r=o[n.parentNodeId];if(!r)return i("Missing parent node");let s=oe(r.id),d=s.findIndex(({id:m})=>m===n.id);if(d<0)return i("Current node not found among siblings");let l=s[d+e];if(!l)return i("Missing sibling node");let u=ol({id:t.value.id,parentId:l.id,position:{at:"end"}});return a(u)?u:rl(u.value)}function xi(e){let t=nl();if(a(t))return t;let{contextNode:n,selectedIndex:o}=g(),s=oe(n.id)[o+e];if(!s)return i("Missing sibling node");let d=ol({id:t.value.id,parentId:n.id,position:{at:e===1?"after":"before",sibling:s.id}});return a(d)?d:rl(d.value)}var tl,zt,To,nl,bi,ol,rl,Ei=y(()=>{"use strict";Nt();rt();A();it();w();tl=null,zt=()=>structuredClone(tl),To=e=>{tl=e},nl=()=>{let{contextNode:e,selectedIndex:t}=g(),o=oe(e.id)[t];return o?c("Resolved selected child",o):i("Target node not found")},bi=({id:e,parentId:t,position:n={at:"end"}})=>{let o=oe(t).filter(r=>r.id!==e);return or(o,n)},ol=({id:e,parentId:t,position:n={at:"end"}})=>{let o=ce();if(a(o))return i("Unable to resolve user ID");let r=bi({parentId:t,id:e,position:n});return a(r)?r:c("Created pending move state",{id:jf(),...o.value,action:"move.node",payload:{id:e,parent:t,rank:r.value.rank}})},rl=e=>{To(e);let t=Ut(e,!0);return a(t)?t:c("Node moved successfully",t.value)}});import{ulid as Wf}from"ulid";var sl,Kr,il,al=y(()=>{"use strict";He();Ei();cn();rt();ne();A();it();Ie();w();me();sl=()=>{let e=zt();if(!e)return i("No pending move state");let t=e.payload.id,n=e.payload.parent,o=g().nodes[n];if(!o)return i("Move parent not found");let r=oe(n).findIndex(s=>s.id===t);return r===-1?i("Moved node not found among rendered children"):(F.navigate({contextNode:o,selectedIndex:r}),c("Synchronized navigation to moved node",null))},Kr=(e,t="Moved preview")=>{if(a(e))return e;let n=sl();return a(n)?n:(E({mode:f.MOVE}),c(t,null))},il=async()=>{let e=ce();if(a(e))return i("Unable to resolve user ID");let{modifier:t}=ee().commandMeta,{contextNode:n,selectedIndex:o}=g(),r=oe(n.id)[o];if(!r)return E({mode:f.DEFAULT}),i("No move target");if(t==="start"){if(r.readonly)return i("Target node is read-only");if(o===-1)return i("No item selected");if(!r.parentNodeId)return i("Target has no parent");let s=oe(r.parentNodeId),d=s.findIndex(({id:v})=>v===r.id);if(d===-1)return i("Target not found among siblings");let l=s[d-1],u=s[d+1],m=u!=null?{at:"before",sibling:u.id}:l!=null?{at:"after",sibling:l.id}:{at:"start"},p=bi({parentId:r.parentNodeId,id:r.id,position:m});return a(p)?p:(To({id:Wf(),action:"move.node",payload:{id:r.id,parent:r.parentNodeId,rank:p.value.rank},...e.value}),E({mode:f.MOVE}),c("Move initialized",null))}if(t==="next")return Kr(xi(1));if(t==="previous")return Kr(xi(-1));if(t==="to-next")return Kr(Ii(1));if(t==="to-previous")return Kr(Ii(-1));if(t==="confirm"){let s=zt();if(!s)return i("No pending move to confirm");let d=await mt();if(a(d))return d;let l=B([s],d.value);if(a(l))return l;let u=sl();return a(u)?u:(To(null),E({mode:f.DEFAULT}),c("Moved item",null))}return t==="cancel"?(To(null),E({mode:f.DEFAULT}),c("Cancelling move",null)):i("Invalid move modifier")}});import{monotonicFactory as Hf,ulid as Vf}from"ulid";var Kf,qr,Ni=y(()=>{"use strict";A();Kf=Hf(),qr=({name:e,parent:t,rank:n,user:{userId:o,userName:r}})=>{let s=Kf();return c("Created issue events",[{id:Vf(),userId:o,userName:r,action:"add.issue",payload:{id:s,parent:t,name:e,rank:n}}])}});import{ulid as Gr}from"ulid";var dl,cl=y(()=>{"use strict";He();Ni();cn();rt();st();A();le();it();w();me();dl=async(e,t)=>{let n=ce();if(a(n))return i("Unable to resolve user ID");let o=await mt();if(a(o))return o;let r=o.value;if(!t.inputString)return i(`provide a name for your ${t.modifier}`);let{breadCrumb:s,contextNode:d,selectedIndex:l}=g(),u=m=>{let p=B([m],r);if(a(p))return p;let v=I.getNode(p.value[0].result.id);if(!v)return i("Created node not found");if(!v.parentNodeId)return p;let x=I.getNode(v.parentNodeId);return x?(F.navigate({contextNode:x,selectedIndex:I.getSiblings(v.parentNodeId).findIndex(({id:R})=>R===v.id)}),p):i("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:m}=g(),p=I.getNode(m);if(!p)return i("Workspace not found");let v=ln(p.id,n.value,r);return a(v)?v:u({id:Gr(),action:"add.board",payload:{id:Gr(),name:t.inputString,parent:p.id,rank:v.value},...n.value})}if(t.modifier==="swimlane"){let m=$e(s,"BOARD");if(a(m))return i("Unable to add swimlane in this context");let p=ln(m.value.id,n.value,r);return a(p)?p:u({id:Gr(),action:"add.swimlane",payload:{id:Gr(),name:t.inputString,parent:m.value.id,rank:p.value},...n.value})}if(t.modifier==="issue"){let m=Z(d.id)[l],p=d.context==="SWIMLANE"?d:d.context==="BOARD"&&m?.context==="SWIMLANE"?m:(()=>{let W=$e(s,"SWIMLANE");return a(W)?null:W.value})();if(!p)return i("Unable to add issue in this context");let v=ln(p.id,n.value,r);if(a(v))return v;let x=qr({name:t.inputString,parent:p.id,rank:v.value,user:n.value});if(a(x))return x;let R=x.value,S=B([...R],r);if(a(S))return S;if(!S.value[0])return i("Issue creation failed");let $=R.find(W=>W.action==="add.issue")?.payload.id;return $?(F.navigate({contextNode:p,selectedIndex:I.getSiblings(p.id).findIndex(({id:W})=>W===$)}),c("Issue created",null)):i("Unable to determine ticket id")}return c("Success",null)}});var zr,Ri=y(()=>{"use strict";He();sn();Nt();A();w();zr=({boardId:e,targetTime:t,stateBranchRoot:n,selectedIndex:o})=>{let r=g(),s=ws(n,t);if(a(s))return i(s.message);let{appliedEvents:d,unappliedEvents:l}=s.value,u=Mt();if(a(u))return u;let m=Et(d),{fatal:p,skipped:v}=nn(m);if(p.length>0)return Mt(),E(r),i(p.map(R=>R.message).join(", "));on(v);let x=g().nodes[e];return x?(F.navigate({contextNode:x,selectedIndex:o}),c("",{unappliedEvents:l})):(Mt(),E(r),i("Board did not exist at that date"))}});var qf,Gf,zf,Yr,Xr,In,ll,Yf,ul,Ci=y(()=>{"use strict";po();wo();Nt();ne();A();w();qf=20,Gf=16,zf=150,Yr=null,Xr=null,In=()=>{Yr!==null&&(clearInterval(Yr),Yr=null),Xr!==null&&(clearTimeout(Xr),Xr=null)},ll=()=>{In(),E({mode:f.DEFAULT,readOnly:!1,readOnlyReason:void 0,timeMode:"live",unappliedEvents:[],replay:null,selectedIndex:0})},Yf=e=>{let t=[],n=0;for(let r=0;r<e.length;r++){let s=r===0?0:Math.max(0,e[r]-e[r-1]);n+=Math.sqrt(s),t[r]=n}let o=n;return t.map((r,s)=>o>0?r/o:(s+1)/e.length)},ul=({events:e,startTime:t,durationMs:n})=>{In();let o=e.length,r=e.map(v=>fn(v)??t),s=r[o-1]??Date.now(),d=Yf(r),l=Math.max(1,Math.round(n*qf/1e3)),u=Math.max(Math.round(n/l),Gf),m=0,p=0;E({mode:f.DEFAULT,readOnly:!0,timeMode:"replay",unappliedEvents:e,replay:{progress:0,appliedCount:0,totalCount:o,currentTime:t,startTime:t,endTime:s,currentLabel:"",flashNodeIds:[]}}),Yr=setInterval(()=>{m++;let v=m/l,x=[],R;for(;p<o&&d[p]<=v;){let T=e[p],O=Ut(T);if(a(O)){if(no(O)){p++;continue}ll();return}x.push(...xs(T)),R=T,p++}if(p>=o||m>=l){for(;p<o;p++){let O=Ut(e[p]);if(a(O)&&!no(O))break}let T=g().replay;E({unappliedEvents:[],replay:T&&{...T,progress:1,appliedCount:o}}),In(),Xr=setTimeout(ll,zf);return}let S=g().replay;E({unappliedEvents:e.slice(p),replay:{progress:Math.min(1,v),appliedCount:p,totalCount:o,startTime:t,endTime:s,currentTime:R?fn(R)??S?.currentTime??t:S?.currentTime??t,currentLabel:R?Si(R):S?.currentLabel??"",flashNodeIds:R?[...new Set(x)]:S?.flashNodeIds??[]}})},u)}});var ml,pl=y(()=>{"use strict";ct();po();sn();Nt();ne();st();A();Ie();w();uo();Ri();Ci();ml=async()=>{let e=$e(g().breadCrumb,"BOARD");if(a(e))return e;let t=await dt(process.cwd());if(a(t))return i("Unable to locate repo root");let n=De({repoRoot:t.value});if(a(n))return n;let{modifier:o,inputString:r}=ee().commandMeta;if(In(),o==="now"){let l=wn(n.value);if(a(l))return i(l.message);let u=Mt();if(a(u))return u;let m=Et(l.value),{fatal:p,skipped:v}=nn(m);return p.length>0?i(p.map(x=>x.message).join(", ")):(on(v),E({mode:f.DEFAULT,readOnly:!1,readOnlyReason:void 0,timeMode:"live",unappliedEvents:[],replay:null}),c("Peeking now",!0))}let s;if(o==="prev"){let l=g().eventLog.at(-1),u=fn(l);if(u===null)return i("No previous event to peek");s=u}else if(o==="next"){let l=g().unappliedEvents.at(0),u=fn(l);if(u===null)return i("No next event to peek");s=u+1}else{let l=pn(o||r.trim());if(!l)return i("Invalid peek date");s=l.getTime()}let d=zr({boardId:e.value.id,targetTime:s,stateBranchRoot:n.value,selectedIndex:0});return a(d)?d:(E({mode:f.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:d.value.unappliedEvents,replay:null}),c("Peeking",!0))}});var gl,fl=y(()=>{"use strict";ct();st();A();Ie();w();uo();Ri();Ci();gl=async()=>{let e=$e(g().breadCrumb,"BOARD");if(a(e))return e;let t=await dt(process.cwd());if(a(t))return i("Unable to locate repo root");let n=De({repoRoot:t.value});if(a(n))return n;let{modifier:o,inputString:r}=ee().commandMeta,{dateInput:s,durationInput:d}=xr(o,r);if(In(),g().syncStatus.status==="syncing")return i("Cannot replay while syncing, try again in a moment");let l=pn(s);if(!l)return i("Invalid replay date");let u=d?Ir(d):15e3;if(u===null)return i("Invalid replay duration (try e.g. 30s or 2m)");let m=l.getTime(),p=g(),v=zr({boardId:e.value.id,targetTime:m,stateBranchRoot:n.value,selectedIndex:-1});if(a(v))return v;let{unappliedEvents:x}=v.value;return x.length===0?(Mt(),E(p),c("Nothing to replay from that point",!0)):(ul({events:x,startTime:m,durationMs:u}),c("Replaying board history",!0))}});import Jf from"zod";var vl,hl=y(()=>{"use strict";vn();ne();A();Ie();ke();w();vl=()=>{let e=ee().commandMeta.inputString,t=Jf.coerce.number().int().min(3e3).safeParse(e);if(!t.success)return i("Auto sync duration must be a number of at least 3000 ms");let n=Ye({autoSyncDebounceMs:t.data});return a(n)?n:(ze({autoSyncIntervalMs:t.data}),E({mode:f.DEFAULT}),c(`Auto sync interval set to ${t.data}ms`,null))}});var yl,bl=y(()=>{"use strict";co();vn();ne();A();Ie();ke();w();yl=()=>{let e=ee().commandMeta.inputString.trim();if(e!=="on"&&e!=="off")return i("Invalid response");let t=pd(e),n=Ye({autoSync:t});return a(n)?n:(ze({autoSync:t}),E({mode:f.DEFAULT}),c(`Auto sync set to "${e}"`,null))}});var Il,xl=y(()=>{"use strict";vn();ne();A();Ie();ke();w();Il=()=>{let e=ee().commandMeta.inputString.trim();if(!["debug","error","info"].includes(e))return i("Invalid response");let n=Ye({logLevel:e});return a(n)?n:(ze({logLevel:e}),E({mode:f.DEFAULT}),c(`Auto sync set to "${e}"`,null))}});import{spawn as Qf}from"node:child_process";var Zf,El,Nl=y(()=>{"use strict";A();Zf=()=>{switch(process.platform){case"darwin":return{command:"pbcopy",args:[]};case"win32":return{command:"clip",args:[]};default:return process.env.WAYLAND_DISPLAY?{command:"wl-copy",args:[]}:{command:"xclip",args:["-selection","clipboard"]}}},El=async e=>new Promise(t=>{let{command:n,args:o}=Zf();try{let r=Qf(n,o,{stdio:["pipe","ignore","ignore"]});r.on("error",()=>t(i(`Clipboard tool not available (${n})`))),r.on("close",s=>t(s===0?c("Copied to clipboard",null):i(`Clipboard tool failed (${n})`))),r.stdin.on("error",()=>{}),r.stdin.write(e),r.stdin.end()}catch{t(i(`Clipboard tool not available (${n})`))}})});var Mo,Rl,Cl=y(()=>{"use strict";A();w();Nl();An();lo();Ht();Mo=async(e,t)=>{if(!e.trim())return i(`Nothing to copy: ${t} is empty`);let n=await El(e);return a(n)?n:c(`Copied ${t} to clipboard`,null)},Rl=async e=>{let{breadCrumb:t,selectedNode:n}=g(),o=mo({breadCrumb:t,selectedNode:n}),r=o??n;if(!r)return i("Nothing selected to copy from");switch(e.modifier){case be.REF:return Mo(nt(r.id),"ref");case be.TITLE:return Mo(r.title,"title");case be.DESCRIPTION:return o?Mo(o.props?.description??"","description"):i("No issue in scope");case be.TAGS:{if(!o)return i("No issue in scope");let s=jt(o).map(({name:d})=>d);return Mo(s.join(", "),"tags")}case be.ASSIGNEES:{if(!o)return i("No issue in scope");let s=Wt(o).map(({name:d})=>d);return Mo(s.join(", "),"assignees")}default:return i("Yank one of: ref, title, description, tags, assignees")}}});var Sl,Al=y(()=>{"use strict";Ds();ne();A();Ie();w();Sl=async()=>{V(""),E({mode:f.DEFAULT});let e=Oe();if(a(e))return i(e.message);if(e.value.syncStatus.status==="syncing")return i("Sync already in progress");E({syncStatus:{msg:"Syncing",status:"syncing"}});let t=await gr();return a(t)?(E({syncStatus:{msg:t.message,status:"failed"}}),t):(E({mode:f.DEFAULT,syncStatus:{msg:"Synced",status:"synced"}}),t)}});import{ulid as Le}from"ulid";var ev,Tl,wl,Lt,Ml,Ll=y(()=>{"use strict";Wc();He();vn();cn();rt();pi();Tn();ne();st();ie();A();le();it();Ie();ke();w();Vr();me();fi();mn();ei();Ht();Ar();Yc();el();al();cl();pl();fl();hl();qs();bl();xl();Cl();Al();ev=e=>e.action==="add.issue.comment",Tl=e=>Object.values(g().tags).find(t=>t.name===e),wl=()=>{let{eventLog:e=[],contributors:t}=g(),n=new Map,o=new Set;for(let r of e)r.userId&&(n.set(r.userId,r.userName??""),o.add(r.userId));for(let r of Object.values(t))n.set(r.id,r.name);return[...n.entries()].map(([r,s])=>({id:r,name:s,isExternal:!o.has(r)}))},Lt=async()=>{let e=await mt();return a(e)?e:c("Resolved persist root",e.value)},Ml=[{systemOnly:!0,intent:k.Move,description:"Internal move-state command",mode:f.COMMAND_LINE,action:il},{intent:k.Delete,description:"Delete the currently selected node",mode:f.COMMAND_LINE,action:async()=>{let e=ce();if(a(e))return i("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=g(),o=Z(t.id)[n];if(!o)return i("Unable to resolve child to delete");let r=await Lt();if(a(r))return r;if(o.context==="COMMENT"){let s=o.id,d=L(t)?t.id:t.parentNodeId;if(!d)return i("Unable to resolve comment issue");let l=g().nodes[d];if(!l||!L(l))return i("Unable to resolve comment issue");let u=l.log?.filter(ev).find(m=>m.payload.id===s);return u?u.payload.author!==e.value.userId?i("You can only delete your own comments"):B([{id:Le(),action:"delete.issue.comment",payload:{id:s,issue:d},...e.value}],r.value):i("Unable to resolve comment")}return B([{id:Le(),action:"delete.node",payload:{id:o.id},...e.value}],r.value)},onSuccess:()=>E({mode:f.DEFAULT})},{intent:k.Filter,description:"Filter the board, for example `:filter tag urgent`",mode:f.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=ee().commandMeta,n=/(!=|=)/,[o]=e.split(n);if(!o||!(d=>pe(h.FILTER).map(l=>l.split(n)[0]).includes(d))(o))return i("Invalid filter modifier");let s={target:o,operator:"=",value:t.trim()};return de(d=>({...d,filters:e==="clear"?[]:[...d.filters,s],mode:f.DEFAULT})),c("Filter updated",null)}},{intent:k.ViewHelp,description:"Open the help screen",mode:f.COMMAND_LINE,action:()=>{let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:o}=g();return Gt({pendingNavTarget:{contextNode:e,breadCrumb:o,selectedIndex:t,selectedNode:n}}),E({mode:f.HELP}),c("Viewing help",null)}},{intent:k.CloseIssue,description:"Move the selected issue to the closed swimlane",mode:f.COMMAND_LINE,action:async()=>{let e=ce();if(a(e))return i("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=g(),o=Z(t.id)[n];if(!o)return i("Unable to close issue, no target found");if(!L(o))return i("Cannot close in this context");let r=g().nodes[ye];if(!r)return i("Unable to locate closed swimlane");if(o.parentNodeId===r.id)return i("Issue is already closed");let s=await Lt();if(a(s))return s;let d=s.value,l=_t(r.id,o.id,{at:"end"},e.value,d);if(a(l))return l;let u=B([{id:Le(),action:"close.issue",payload:{id:o.id,parent:r.id,rank:l.value},...e.value}],d);return a(u)?u:c("Issue closed",null)},onSuccess:()=>E({mode:f.DEFAULT})},{intent:k.ReopenIssue,description:"Move a closed issue back to its previous swimlane",mode:f.COMMAND_LINE,action:async()=>{let e=ce();if(a(e))return i("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=g(),o=Z(t.id)[n];if(!o)return i("Unable to reopen issue, no target found");let r=o.context==="TICKET"?c("Resolved ticket",o):xn(o.id,"TICKET");if(a(r))return i("Cannot reopen in this context");let s=r.value,d=g().nodes[ye];if(!d)return i("Unable to locate closed swimlane");if(s.parentNodeId!==d.id)return i("Issue is not closed");if(!L(s))return i("Target node is not issue");let l=Hr(s);if(!l)return i("Unable to resolve previous parent from issue history");if(l===d.id)return i("Previous parent resolves to closed swimlane");let u=g().nodes[l];if(!u)return i("Previous parent no longer exists");let m=await Lt();if(a(m))return m;let p=m.value,v=_t(u.id,s.id,{at:"end"},e.value,p);if(a(v))return v;let x=B([{id:Le(),action:"reopen.issue",payload:{id:s.id,parent:u.id,rank:v.value},...e.value}],p);return a(x)?x:c("Issue reopened",null)},onSuccess:()=>E({mode:f.DEFAULT})},{intent:k.Init,description:"Initialize Epiq in the current git repository",mode:f.COMMAND_LINE,action:Zc},{intent:k.NewItem,description:"Create a new board, swimlane, or issue",mode:f.COMMAND_LINE,action:dl,onSuccess:()=>E({mode:f.DEFAULT})},{intent:k.Rename,description:"Rename the currently selected node",mode:f.COMMAND_LINE,action:async()=>{let e=ce();if(a(e))return i("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=g(),o=Z(t.id)[n];if(!o)return i("Missing node");if(o.readonly)return i("Cannot rename readonly node");let r=ac();if(!r)return i("Provide a title");let s=await Lt();return a(s)?s:B([{id:Le(),action:"edit.title",payload:{id:o.id,name:r},...e.value}],s.value)},onSuccess:()=>E({mode:f.DEFAULT})},{intent:k.UntagTicket,description:"Remove a tag from the selected issue",mode:f.COMMAND_LINE,action:async()=>{let e=ce();if(a(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=ee().commandMeta,o=(t||n).trim();if(!o)return i("Provide a tag");let r=Tl(o);if(!r)return i(`Tag "${o}" does not exist`);let{selectedNode:s}=g();if(!s)return i("Invalid untag target");let d=xn(s.id,"TICKET");if(a(d))return i("Unable to untag issue in this context");let l=d.value;if(!L(l))return i("Target node is not issue");if(!(l.props.tags??[]).includes(r.id))return i("Issue is not tagged with that tag");let m=await Lt();return a(m)?m:B([{id:Le(),action:"remove.issue.tag",payload:{id:l.id,tag:r.id},...e.value}],m.value)},onSuccess:()=>E({mode:f.DEFAULT})},{intent:k.TagTicket,description:"Add or create a tag on the selected issue",mode:f.COMMAND_LINE,action:async()=>{let e=ce();if(a(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=ee().commandMeta,o=(t||n).trim();if(!o)return i("Provide a tag");let{selectedNode:r}=g();if(!r)return i("Invalid tag target");let s=xn(r.id,"TICKET");if(a(s))return i("Unable to tag issue in this context");let d=s.value;if(!L(d))return i("Target node is not issue");let l=await Lt();if(a(l))return l;let u=Tl(o),m=u?.id??Le();return(d.props.tags??[]).includes(m)?i("Already tagged with that tag"):B([...u?[]:[{id:Le(),action:"create.tag",payload:{id:m,name:o},...e.value}],{id:Le(),action:"add.issue.tag",payload:{id:d.id,tag:m},...e.value}],l.value)},onSuccess:()=>E({mode:f.DEFAULT})},{intent:k.AssignUserToTicket,description:"Assign a user to the selected issue",mode:f.COMMAND_LINE,action:async()=>{let e=ce();if(a(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=ee().commandMeta,o=(t||n).trim();if(!o)return i("Provide an assignee");let r=o.startsWith("!"),s=(r?o.slice(1):o).trim();if(!s)return i("Provide an assignee");let{selectedIndex:d,contextNode:l}=g(),u=Z(l.id)[d];if(!u)return i("Invalid assign target");let m=xn(u.id,"TICKET");if(a(m))return i("Unable to assign issue in this context");let p=m.value;if(!L(p))return i("Target node is not issue");let v=await Lt();if(a(v))return v;let x=wl(),R=!r&&s.toLowerCase()==="me",S,T;if(R)S=e.value.userId,T=x.find(W=>W.id===S)?.name??e.value.userName;else{let W=x.filter(Ee=>Ee.name===s);if(W.length>1)return i(`"${s}" matches ${W.length} contributors (${W.map(Ee=>Ee.id).join(", ")}). Assign from the GUI to choose by id.`);let ve=W[0];if(!ve&&!r)return i(`No contributor named "${s}". Use "!${s}" to add them as an external assignee.`);S=ve?.id??Le(),T=ve?.name??s}if((p.props.assignees??[]).includes(S))return i("Assignee already assigned");let $=!!g().contributors[S];return B([...$?[]:[{id:Le(),action:"create.contributor",payload:{id:S,name:T},...e.value}],{id:Le(),action:"add.issue.assignee",payload:{id:p.id,assignee:S},...e.value}],v.value)},onSuccess:()=>E({mode:f.DEFAULT})},{intent:k.UnassignUserFromTicket,description:"Remove an assignee from the selected issue",mode:f.COMMAND_LINE,action:async()=>{let e=ce();if(a(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=ee().commandMeta,o=(t||n).trim();if(!o)return i("Provide an assignee to remove");let{selectedNode:r}=g();if(!r)return i("Invalid unassign target");let s=xn(r.id,"TICKET");if(a(s))return i("Unable to unassign in this context");let d=s.value;if(!L(d))return i("Target node is not issue");let l=d.props.assignees??[],u=o.toLowerCase()==="me",m=u?l.filter(x=>x===e.value.userId):wl().filter(x=>x.name===o&&l.includes(x.id)).map(x=>x.id);if(m.length>1)return i(`"${o}" matches ${m.length} assignees (${m.join(", ")}). Unassign from the GUI to choose by id.`);let p=m[0];if(!p)return i(u?"Issue is not assigned to you":`Issue is not assigned to "${o}"`);let v=await Lt();return a(v)?v:B([{id:Le(),action:"remove.issue.assignee",payload:{id:d.id,assignee:p},...e.value}],v.value)},onSuccess:()=>E({mode:f.DEFAULT})},{intent:k.Comment,description:"Add a comment to the selected issue",mode:f.COMMAND_LINE,action:async(e,t)=>{let n=t.inputString.trim();if(!n)return i("Provide a comment");if(n.length>4e3)return i(`Cannot exceed ${4e3} characters`);let o=ce();if(a(o))return i("Unable to resolve user ID");let{breadCrumb:r,selectedNode:s}=g(),d=$e([...r,s],"TICKET");if(a(d))return i("Edit target must be an issue");let l=d.value;if(!l)return i("Invalid comment target");let u=l.context==="TICKET"?c("Resolved ticket",l):xn(l.id,"TICKET");if(a(u))return i("Unable to comment on issue in this context");let m=u.value;if(!L(m))return i("Target node is not issue");let p=await Lt();return a(p)?p:B([{id:Le(),action:"add.issue.comment",payload:{id:Le(),issue:m.id,author:o.value.userId,md:n},...o.value}],p.value)},onSuccess:()=>E({mode:f.DEFAULT})},{intent:k.Sync,description:"Pull, commit, and push Epiq state",mode:f.COMMAND_LINE,action:Sl},{intent:k.Peek,description:"View board state at another point in time",mode:f.COMMAND_LINE,action:ml},{intent:k.Replay,description:"Replay board history forward from a point in time",mode:f.COMMAND_LINE,action:gl},{intent:k.Export,description:"Export the current board layout to markdown",mode:f.COMMAND_LINE,action:async()=>{let e=await jc();return a(e)?e:(E({mode:f.DEFAULT}),c("Export successful",!0))}},{intent:k.Exit,description:"Exit the application",mode:f.COMMAND_LINE,action:async()=>(F.exit(),c("Exit successful",!0))},{intent:k.Edit,description:"Edit title or description",mode:f.COMMAND_LINE,action:async(e,t)=>zc(t),onSuccess:()=>E({mode:f.DEFAULT})},{intent:k.Yank,description:"Yank (copy) ref, title, description, tags, or assignees to the clipboard",mode:f.COMMAND_LINE,action:async(e,t)=>Rl(t),onSuccess:()=>E({mode:f.DEFAULT})},{intent:k.Config,description:"Update editor, username, view, autosync, or sync debounce",mode:f.COMMAND_LINE,action:(e,t)=>{let n=t.inputString.trim();switch(t.modifier){case re.USERNAME:{let{userId:o,preferredEditor:r,userName:s}=ae(),d=n||s,l=o??Le();if(!d||!l)return i("Unable to resolve user name or id");let u=Ye({userName:d,userId:l,preferredEditor:r??""});return a(u)?u:(ze({userName:d,userId:l}),E({mode:f.DEFAULT}),c(`Username set to "${d}"`,null))}case re.EDITOR:{if(!n)return i("No editor provided");let o=Ye({preferredEditor:n});return a(o)?o:(ze({preferredEditor:n}),E({mode:f.DEFAULT}),c(`Editor configuration set to "${n}"`,null))}case re.VIEW:{if(n!=="wide"&&n!=="dense")return i("Invalid view mode");let o=Ye({viewMode:n});return a(o)?o:(ze({viewMode:n}),E({mode:f.DEFAULT}),c(`View set to "${n}"`,null))}case re.AUTOSYNC:return yl();case re.LOG_LEVEL:return Il();case re.SYNC_DEBOUNCE_MS:return vl();case re.ATTACHMENT_MAX_KB:return Ld();default:return i("Unknown config command")}}},{intent:k.Coffee,description:"Sponsor the development of Epiq!",mode:f.COMMAND_LINE,action:()=>{let e=ee().commandMeta.modifier;return e==="custom"?Ao("https://github.com/sponsors/ljtn?frequency=one-time&sponsor=ljtn"):Ao(`https://github.com/sponsors/ljtn/sponsorships?sponsor=ljtn&preview=true&frequency=one-time&amount=${e}`),V(""),c("Thanks you!",null)}}]});var tv,yt,Ai=y(()=>{"use strict";fr();Tr();ei();Ll();A();Ie();ke();w();tv=new Set(["peek","replay","filter","view-help","yank"]),yt=async({isForceExecutedBySystem:e=!1}={})=>{let{commandMeta:{command:t,validity:n,modifier:o,inputString:r}}=ee();if(!t)return i("No command to confirm");if(!e&&n===Vt.Invalid)return i("Invalid command");let s=dc(t);oc();let{readOnly:d}=g();if(d&&!tv.has(s))return bo({status:Pt.Fail,message:"Command not available in readonly state",value:null});let l=Ml.filter(m=>e||m.systemOnly!==!0).find(m=>m.intent===s);if(!l)return bo({status:Pt.Fail,message:"Command not found",value:null});let u;try{u=await l.action(l,{command:t,inputString:r,modifier:o})}catch(m){return bo({status:Pt.Fail,message:m instanceof Error?m.message:"Command failed",value:null})}return a(u)?bo(u):(rc({addToHistory:!e}),l.onSuccess?.(),ae().autoSync&&ld(),u)}});var Jr,Qr,kl,Pl=y(()=>{"use strict";A();ne();w();en();Ai();Ei();Ie();Jr=[{intent:M.Exit,mode:f.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(E({mode:f.COMMAND_LINE}),V("move cancel"),yt({isForceExecutedBySystem:!0}))},{intent:M.InitMove,mode:f.DEFAULT,description:"[m] move (init/confirm)",action:()=>(E({mode:f.COMMAND_LINE}),V("move start"),yt({isForceExecutedBySystem:!0}))},{intent:M.ConfirmMove,mode:f.MOVE,action:()=>(E({mode:f.COMMAND_LINE}),V("move confirm"),yt({isForceExecutedBySystem:!0}))}],Qr=[{intent:M.MovePreviousItem,mode:f.MOVE,action:()=>zt()?(E({mode:f.COMMAND_LINE}),V("move previous"),yt({isForceExecutedBySystem:!0})):i("No pending move")},{intent:M.MoveNextItem,mode:f.MOVE,action:()=>zt()?(E({mode:f.COMMAND_LINE}),V("move next"),yt({isForceExecutedBySystem:!0})):i("No pending move")}],kl=[{intent:M.MoveToNextContainer,mode:f.MOVE,action:()=>zt()?(E({mode:f.COMMAND_LINE}),V("move to-next"),yt({isForceExecutedBySystem:!0})):i("No pending move")},{intent:M.MoveToPreviousContainer,mode:f.MOVE,action:()=>zt()?(E({mode:f.COMMAND_LINE}),V("move to-previous"),yt({isForceExecutedBySystem:!0})):i("No pending move")}]});var Dl,Fl=y(()=>{"use strict";ie();Pl();Dl={[D.WORKSPACE]:[...Jr,...Qr],[D.BOARD]:[...Jr,...Qr],[D.SWIMLANE]:[...Jr,...Qr,...kl],[D.TICKET]:[],[D.FIELD]:[],[D.FIELD_LIST]:[],[D.TEXT]:[],[D.COMMENT]:[]}});import nv from"node:fs";import ov from"node:path";var Ol,Bl=y(()=>{"use strict";ct();fo();A();me();fi();Ol=e=>{let t=et(process.cwd());if(a(t))return i("Unable to resolve project root");let n=De({repoRoot:t.value});if(a(n))return i(n.message);let o=Ks(e.hash,e.ext),r=ov.join(gs(n.value),o);return nv.existsSync(r)?(Ao(r),c(`Opened ${e.name}`,null)):i("Attachment file not found \u2014 run :sync to fetch it")}});var Ul,_l,$l=y(()=>{"use strict";ne();A();Ie();w();Vr();en();He();Ul=()=>{V("");let{pendingNavTarget:e}=Wn();E({mode:f.DEFAULT}),e&&F.navigate(e),Gt({pendingNavTarget:void 0})},_l=[{intent:M.ExitCommandLine,mode:f.HELP,action:()=>(Ul(),c("Exiting help",null))},{intent:M.Exit,mode:f.HELP,action:()=>(Ul(),c("Closed help",null))},{intent:M.NavPreviousItem,mode:f.HELP,description:"[arrows/hjkl] navigate",action:()=>(F.navigateToPreviousItem(),c("Navigating to previous help item",null))},{intent:M.NavNextItem,mode:f.HELP,action:()=>(F.navigateToNextItem(),c("Navigating to next help item",null))},{intent:M.NavToPreviousContainer,mode:f.HELP,action:()=>(F.navigateToPreviousContainer(),c("Navigating to previous help container",null))},{intent:M.NavToNextContainer,mode:f.HELP,action:()=>(F.navigateToNextContainer(),c("Navigating to next help container",null))}]});var rv,jl,Wl,Hl=y(()=>{"use strict";ne();ie();A();Ie();w();Vr();en();He();rv=e=>{E({mode:f.COMMAND_LINE});let{pendingNavTarget:t}=Wn();t&&F.navigate(t),Gt({pendingNavTarget:void 0}),V(`${e} `)},jl=()=>{V("");let{pendingNavTarget:e}=Wn();e&&F.navigate(e),Gt({pendingNavTarget:void 0}),E({mode:f.DEFAULT})},Wl=[{intent:M.InitCommandPalette,mode:f.DEFAULT,description:"[?] view command palette (explore descriptions for every command)",action:()=>{V("");let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:o}=g();return Gt({pendingNavTarget:{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:o}}),E({mode:f.PALETTE}),c("Opening command palette",null)}},{intent:M.Confirm,mode:f.PALETTE,action:()=>{let{selectedNode:e}=g();if(!e||!$i(e))return i("Command only applicable on text nodes");if(e.props.disabled)return i("Command is not available in this context");let t=e.title;return t?(rv(t),c("Selected command",t)):c("No command selected",null)}},{intent:M.ExitCommandLine,mode:f.PALETTE,action:()=>(jl(),c("Exiting palette",null))},{intent:M.Exit,mode:f.PALETTE,action:()=>(jl(),c("Closed command palette",null))},{intent:M.NavPreviousItem,mode:f.PALETTE,description:"[arrows/hjkl] navigate",action:()=>(F.navigateToPreviousItem(),c("Navigating to previous item",null))},{intent:M.NavNextItem,mode:f.PALETTE,action:()=>(F.navigateToNextItem(),c("Navigating to next item",null))},{intent:M.NavToPreviousContainer,mode:f.PALETTE,action:()=>(F.navigateToPreviousContainer(),c("Navigating to previous container",null))},{intent:M.NavToNextContainer,mode:f.PALETTE,action:()=>(F.navigateToNextContainer(),c("Navigating to next container",null))}]});var Vl,Kl=y(()=>{"use strict";mn();Ht();ne();A();Sn();le();it();Ie();w();Bl();en();$l();Hl();He();Vl=[..._l,...Wl,{intent:M.AddItem,mode:f.DEFAULT,description:"[n] new...",action:()=>(E({mode:f.COMMAND_LINE}),V(`${h.NEW} `),c("Adding new item",null))},{intent:M.Delete,mode:f.DEFAULT,description:"[d] delete",action:()=>(E({mode:f.COMMAND_LINE}),V(`${h.DELETE} `),c("Deleting item",null))},{intent:M.InitCommandLine,mode:f.DEFAULT,description:"[:] focus command line",action:()=>(E({mode:f.COMMAND_LINE}),V(""),c("Entering command line mode",null))},{intent:M.Confirm,mode:f.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>{let{selectedNode:e,contextNode:t}=g();if(!oe(e?.id??"")?.length){let o=e?I.getAttachment(e.id):void 0;if(o)return Ol(o);if(e?.title===Q.DESCRIPTION)return E({mode:f.COMMAND_LINE}),V(`${h.EDIT} description `),c("Propose command",!0);if(e?.title===Q.ASSIGNEES)return E({mode:f.COMMAND_LINE}),V(`${h.ASSIGN} `),c("Propose command",!0);if(e?.title===Q.TAGS)return E({mode:f.COMMAND_LINE}),V(`${h.TAG} `),c("Propose command",!0);if(t.title===Q.DESCRIPTION&&e?.context==="TEXT")return E({mode:f.COMMAND_LINE}),V(`${h.EDIT} description `),c("Propose command",!0)}return F.enterChildNode(),c("Entering context",null)}},{intent:M.Yank,mode:f.DEFAULT,description:"[y] yank to clipboard",action:()=>{let{selectedNode:e}=g(),t=e?.title===Q.DESCRIPTION?be.DESCRIPTION:e?.title===Q.TAGS?be.TAGS:e?.title===Q.ASSIGNEES?be.ASSIGNEES:be.REF,o=pe(h.YANK).includes(t)?t:be.REF;return E({mode:f.COMMAND_LINE}),V(`${h.YANK} ${o}`),c("Propose command",!0)}},{intent:M.EditTitle,mode:f.DEFAULT,description:"[r] rename title",action:()=>(E({mode:f.COMMAND_LINE}),V(`${h.EDIT} title ${g().selectedNode?.title}`),c("Exiting context",null))},{intent:M.EditDescription,mode:f.DEFAULT,description:"[e] edit description",action:()=>(E({mode:f.COMMAND_LINE}),V(`${h.EDIT} description `),c("Exiting context",null))},{intent:M.Exit,mode:f.DEFAULT,description:"[q] exit context",action:()=>(F.enterParentNode(),c("Exiting context",null))},{intent:M.NavPreviousItem,mode:f.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(F.navigateToPreviousItem(),c("Navigating to previous item",null))},{intent:M.NavNextItem,mode:f.DEFAULT,action:()=>(F.navigateToNextItem(),c("Navigating to next item",null))},{intent:M.NavToPreviousContainer,mode:f.DEFAULT,action:()=>(F.navigateToPreviousContainer(),c("Navigating to previous container",null))},{intent:M.NavToNextContainer,mode:f.DEFAULT,action:()=>(F.navigateToNextContainer(),c("Navigating to next container",null))}]});var sv,iv,ql,Gl=y(()=>{"use strict";Ie();sv=500,iv=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),ql=e=>{let t=iv(e);t&&kr(n=>(n+t).slice(0,sv))}});var av,dv,zl,Yl=y(()=>{"use strict";Gl();ne();A();Ie();w();en();Ai();av=[f.COMMAND_LINE,f.PALETTE],dv=e=>[{intent:M.MoveCursorLeft,mode:e,action:()=>(Qs(-1),c("Moving cursor left",null))},{intent:M.MoveCursorRight,mode:e,action:()=>(Qs(1),c("Moving cursor right",null))},{intent:M.MoveCursorLeftOfWord,mode:e,action:()=>(Zs("left"),c("Moving cursor left of word",null))},{intent:M.MoveCursorRightOfWord,mode:e,action:()=>(Zs("right"),c("Moving cursor right of word",null))},{intent:M.AutoCompleteCommand,mode:e,action:()=>(kr((t,{remainder:n})=>{let o=n?t+n:t,r="";return o==="edit title "&&(r=g().selectedNode?.title??""),o+r}),c("Auto-completing command",null))},{intent:M.CaptureInput,mode:e,action:(t,{sequence:n})=>(ql(n??""),c("Capturing input",null))},{intent:M.EraseInput,mode:e,action:()=>(tc(),c("Erasing input",null))},{intent:M.EraseInputWord,mode:e,action:()=>(nc(),c("Erasing input word",null))}],zl=[{intent:M.Confirm,mode:f.COMMAND_LINE,action:()=>(yt(),c("Executing command",null))},{intent:M.ViewHelp,mode:f.DEFAULT,action:()=>(E({mode:f.HELP}),c("Viewing help",null))},...av.flatMap(dv),{intent:M.ExitCommandLine,mode:f.COMMAND_LINE,action:()=>(E({mode:f.DEFAULT}),c("Exiting command line",null))},{intent:M.GetLastCommandFromHistory,mode:f.COMMAND_LINE,action:()=>(sc(),c("Getting last command from history",null))},{intent:M.GetNextCommandFromHistory,mode:f.COMMAND_LINE,action:()=>(ic(),c("Getting next command from history",null))}]});import Ql from"chalk";var Zr,Xl,Jl,Ti,Zl=y(()=>{"use strict";ne();ie();Fe();Zr=Ql.dim.hex(C.secondary2)(": for command line"),Xl="q to exit",Jl=`${Ql.hex(C.accent)("m")} to confirm`,Ti={[D.WORKSPACE]:[Zr],[D.BOARD]:[Zr],[D.BOARD+f.COMMAND_LINE]:[Zr],[D.SWIMLANE]:[Zr],[D.TICKET+f.HELP]:[Xl],[D.SWIMLANE+f.HELP]:[Xl],[D.TICKET]:[],[D.FIELD]:[],[D.SWIMLANE+f.MOVE]:[Jl],[D.TICKET+f.MOVE]:[Jl]}});var Lo,cv,lv,eu,tu=y(()=>{"use strict";w();An();Lo=e=>e.trim().toLocaleLowerCase(),cv=e=>{let{tags:t}=g();return(e.props.tags??[]).map(n=>t[n]?.name).filter(n=>!!n)},lv=e=>{let{contributors:t}=g();return(e.props.assignees??[]).map(n=>{let o=t[n];return o?o.name:void 0}).filter(n=>!!n)},eu=(e,t)=>{let n=Lo(t.value);if(!n)return!0;switch(t.target){case"title":return Lo(e.title??"").includes(n);case"description":return Lo(e.props.description??"").includes(n);case"tag":return cv(e).map(Lo).some(r=>r.includes(n));case"assignee":return lv(e).map(Lo).some(r=>r.includes(n));case"ref":return Ra(e.id,t.value);default:return!0}}});function nu(e,t,n){let o=t[e];if(!o)return i("buildBreadCrumb(): current node not found");let r=[],s=o;for(;s&&(r.push(s),!(s.id===n||!s.parentNodeId));)s=t[s.parentNodeId];let d=r[r.length-1];return!d||d.id!==n?i("buildBreadCrumb(): node is not connected to root"):(r.reverse(),c("Breadcrumb built",r))}var ou=y(()=>{"use strict";A()});var ru,su=y(()=>{"use strict";ru=e=>{let t={};for(let n of e)n.intent&&(t[n.mode]||(t[n.mode]={}),t[n.mode][n.intent]=n);return t}});import{useSyncExternalStore as uv}from"react";function ki(e){let{contextNodeId:t,mode:n,rootNodeId:o,nodes:r,filters:s}=e;if(!t)return i("derive(): contextNodeId is missing");if(!o)return i("derive(): rootNode is missing");if(!r[o])return i("derive(): unable to find root node");let l=r[t];if(!l)return i("Unable to derive state, contextNode not found");let u=nu(t,r,o);if(a(u))return logger.error(u.message),u;let m=u.value,{context:p}=l,v=Ti[p+n]??Ti[p]??[],x=[...Vl,...Dl[p]??[],...zl],R=ru(x),S=pv(r,s),T=S[t]?.[e.selectedIndex]??null;return c("Derived successfully",{...e,contextNode:l,breadCrumb:m,availableHints:v,availableActions:x,actionIndex:R,selectedNode:T,renderedChildrenIndex:S})}function oo(e){wi=e;let t=et(process.cwd()),n=!1;if(!a(t)){let s=xt(t.value);if(a(s))return i(s.message);n=!0}let o={readOnly:!1,filters:[],tags:{},contributors:{},mode:f.DEFAULT,nodes:{[e.id]:e},rootNodeId:e.id,contextNodeId:e.id,renderedChildrenIndex:{},selectedIndex:-1,syncStatus:{status:"synced",msg:""},eventLog:[],unappliedEvents:[],replay:null,timeMode:"live",hasProjectDefinition:n,hasInitializingEvents:!1,comments:{},attachments:{}},r=ki(o);return a(r)?r:(kt=r.value,Li(),c("State initialized",null))}function de(e){let t=g(),n=e(t);if(ko)return es=n,kt={...t,...n},c("State updated",null);let o=ki(n);return a(o)?i(o.message??"Unable to update state"):(kt=o.value,Li(),c("State updated",null))}function Aa(e){if(ko)return c("Joined batch",e());ko=!0,es=null;let t=()=>{let n=es;if(ko=!1,es=null,n===null)return null;let o=ki(n);return a(o)?i(o.message??"Unable to update state"):(kt=o.value,Li(),c("State updated",null))};try{let n=e(),o=t();return o&&a(o)?i(o.message):c("State updated",n)}finally{ko&&t()}}var kt,wi,Mi,Li,mv,g,Oe,ko,es,E,_e,pv,Z,Mt,$t,w=y(()=>{"use strict";Fl();Kl();Yl();Zl();Ft();ne();ie();A();me();tu();ou();su();Mi=new Set,Li=()=>{for(let e of Mi)e()},mv=e=>(Mi.add(e),()=>Mi.delete(e));g=()=>{if(!kt)throw new Error("State not initialized. Call initWorkspaceState() first.");return kt},Oe=()=>kt?c("Retrieved state",kt):i("State not initialized. Call initWorkspaceState() first.");ko=!1,es=null;E=e=>de(t=>({...t,...e})),_e=()=>uv(mv,g,g),pv=(e,t)=>{let n={};for(let o of Object.values(e))L(o)&&t.length>0&&!t.every(r=>eu(o,r))||!o.parentNodeId||o.isDeleted||((!o.parentNodeId||!n[o.parentNodeId])&&(n[o.parentNodeId]=[]),n[o.parentNodeId].push(o));for(let o of Object.keys(n))n[o].sort((r,s)=>{let d=e[r.id],l=e[s.id];return!d||!l?0:d.rank.localeCompare(l.rank)});return n},Z=e=>g()?.renderedChildrenIndex[e]??[],Mt=()=>wi?oo(wi):i("Cannot reset state: no initial workspace found"),$t=()=>kt!==void 0});var xn,gv,Yt,I,le=y(()=>{"use strict";st();ie();A();w();it();xn=(e,t)=>{let{nodes:n}=g(),o=n[e];if(!o)return i("Node not found");if(o.context===t)return c("Resolved ancestor node",o);let r=o.parentNodeId?n[o.parentNodeId]:void 0;for(;r;){if(r.context===t)return c("Resolved ancestor node",r);r=r.parentNodeId?n[r.parentNodeId]:void 0}return i(`No ancestor found for context: ${t}`)},gv=(e,t)=>{let{nodes:n}=g(),o=n[e];for(;o?.parentNodeId;){if(o.parentNodeId===t)return!0;o=n[o.parentNodeId]}return!1},Yt=(e,t)=>e?e.readonly?i({move:"Cannot move readonly node",rename:"Cannot rename readonly node",edit:"Cannot edit readonly node",delete:"Cannot delete readonly node"}[t]):null:i("Node not found"),I={linkUserId({contributorId:e,userId:t}){let n=this.getContributor(e);if(!n)return i("Contributor not found");if(n.userId&&n.userId!==t)return i("Contributor is already linked to another user");let o={...n,userId:t},r=de(s=>({...s,contributors:{...s.contributors,[e]:o}}));return a(r)?i("Unable to link contributor to user"):c("Linked contributor to user",o)},deleteNode(e){de(t=>{let n={...t.nodes};return delete n[e],{...t,nodes:n}})},createComment(e){let t=this.getNode(e.issue);if(!t)return i("Unable to create comment, missing issue");if(!L(t))return i("Can only comment on issues");let n=de(o=>({...o,comments:{...o.comments??{},[e.id]:{...e,deleted:!1}}}));return a(n)?i("Unable to create comment"):c("Created comment",{...e,deleted:!1})},editComment(e,t){let n=this.getComment(e);if(!n)return i("Unable to edit comment, missing comment");let o=this.getNode(n.issue);if(!o)return i("Unable to edit comment, missing issue");if(!L(o))return i("Can only edit issue comments");let r={...n,md:t,deleted:!1},s=de(d=>({...d,comments:{...d.comments??{},[e]:r}}));return a(s)?i("Unable to edit comment"):c("Edited comment",r)},deleteComment(e){let t=this.getComment(e);if(!t)return i("Unable to delete comment, missing comment");let n={...t,deleted:!0},o=de(r=>({...r,comments:{...r.comments??{},[e]:n}}));return a(o)?i("Unable to delete comment"):c("Deleted comment",n)},getComment(e){return g().comments?.[e]},getCommentsByIssue(e){return Object.values(g().comments??{}).filter(t=>t.issue===e&&!t.deleted)},createAttachment(e){let t=this.getNode(e.issue);if(!t)return i("Unable to create attachment, missing issue");if(!L(t))return i("Can only attach to issues");let n=de(o=>({...o,attachments:{...o.attachments??{},[e.id]:{...e,deleted:!1}}}));return a(n)?i("Unable to create attachment"):c("Created attachment",{...e,deleted:!1})},deleteAttachment(e){let t=this.getAttachment(e);if(!t)return i("Unable to delete attachment, missing attachment");let n={...t,deleted:!0},o=de(r=>({...r,attachments:{...r.attachments??{},[e]:n}}));return a(o)?i("Unable to delete attachment"):c("Deleted attachment",n)},getAttachment(e){return g().attachments?.[e]},getAttachmentsByIssue(e){return Object.values(g().attachments??{}).filter(t=>t.issue===e&&!t.deleted)},editValue(e,t){let{nodes:n}=g(),o=n[e];if(!o)return i("Edit target node not found");let r=Yt(o,"edit");if(r)return r;let s={...o,props:{...o.props,description:t}};return this.updateNode(s),c("Issue description updated",{md:t})},renameNode(e,t){let n=this.getNode(e);if(!n)return i("Rename target node not found");let o=Yt(n,"rename");if(o)return o;let r={...n,title:t};return this.updateNode(r),c("Renamed node",r)},getExistingTags(){let{tags:e}=g();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getExistingAssignees(){let{contributors:e}=g();return["me",...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getFieldByTitle(e,t){return oe(e).find(n=>n.title===t)},moveNodeToRank({id:e,parentId:t,rank:n}){let{rootNodeId:o}=g(),r=this.getNode(e),s=this.getNode(t);if(!r)return i("Node not found");if(!s)return i("Target parent not found");if(o===e)return i("Cannot move root node");if(e===t)return i("Cannot move node into itself");let d=Yt(r,"move");if(d)return d;if(gv(t,e))return i("Cannot move node into its own descendant");let l={...r,parentNodeId:t,rank:n};return this.updateNode(l),c("Moved node successfully",l)},tombstoneNode(e){let{nodes:t,contextNodeId:n,rootNodeId:o}=g(),r=this.getNode(e);if(!r)return i("Node not found");if(o===e)return i("Cannot delete root node");let s=Yt(r,"delete");if(s)return s;let d=new Set,l=m=>{let p=t[m];if(!(!p||d.has(m))){d.add(m);for(let v of oe(p.id))l(v.id)}};l(e);let u={...structuredClone(t)};for(let m of d){if(!u[m])return i("Unable to locate node to delete");u[m]={...u[m],isDeleted:!0}}return n?(E({nodes:u}),c("Successfully tomb stoned",r)):i("Unable to delete undefined")},tombstoneContributor(e){let t=this.getContributor(e);if(!t)return i("Contributor not found");let n={...t,name:Do,tombstoned:!0},o=de(r=>({...r,contributors:{...r.contributors,[e]:n}}));return a(o)?i("Unable to remove contributor"):c("Tombstoned contributor",n)},renameContributor(e,t){let n=this.getContributor(e);if(!n)return i("Contributor not found");if(n.tombstoned)return i("Cannot rename a removed contributor");let o={...n,name:t},r=de(s=>({...s,contributors:{...s.contributors,[e]:o}}));return a(r)?i("Unable to rename contributor"):c("Renamed contributor",o)},restoreContributor(e,t){let n=this.getContributor(e);if(!n)return i("Contributor not found");let o={...n,name:t,tombstoned:!1},r=de(s=>({...s,contributors:{...s.contributors,[e]:o}}));return a(r)?i("Unable to restore contributor"):c("Restored contributor",o)},createContributor(e){let t=de(n=>({...n,contributors:{...n.contributors,[e.id]:e}}));return a(t)?i("Unable to create contributor"):c("Created contributor",e)},assign(e,t){let n=this.getContributor(t),o=this.getNode(e);if(!n)return i("Unable to assign contributor, missing contributor");if(!o)return i("Unable to assign contributor, missing target");let r=Yt(o,"edit");if(r)return r;if(!L(o))return i("Target is not an issue");let s=o.props.assignees??[];if(s.includes(t))return i("Contributor already assigned");let d={...o,props:{...o.props,assignees:[...s,t]}};return this.updateNode(d),c("Assigned contributor",{assignee:t})},unassign(e,t){let n=this.getContributor(t),o=this.getNode(e);if(!n)return i("Unable to unassign, missing contributor");if(!o)return i("Unable to unassign, missing target");let r=Yt(o,"edit");if(r)return r;if(!L(o))return i("Target is not an issue");let s=o.props.assignees??[];if(!s.includes(t))return c("Issue is not assigned to that contributor",{assignee:t});let d={...o,props:{...o.props,assignees:s.filter(l=>l!==t)}};return this.updateNode(d),c("Assignee removed",{assignee:t})},tag(e,t){let n=this.getTag(t),o=this.getNode(e);if(!n)return i("Unable to add tag, missing tag");if(!o)return i("Unable to add tag, missing target");let r=Yt(o,"edit");if(r)return r;if(!L(o))return i("Target is not an issue");let s=o.props.tags??[];if(s.includes(t))return i("Tag already assigned");let d={...o,props:{...o.props,tags:[...s,t]}};return this.updateNode(d),c("Tag added",{tag:t})},untag(e,t){let n=this.getTag(t),o=this.getNode(e);if(!n)return i("Unable to remove tag, missing tag");if(!o)return i("Unable to remove tag, missing target");let r=Yt(o,"edit");if(r)return r;if(!L(o))return i("Target is not an issue");let s=o.props.tags??[];if(!s.includes(t))return c("Issue is not tagged with that tag",{tag:t});let d={...o,props:{...o.props,tags:s.filter(l=>l!==t)}};return this.updateNode(d),c("Tag removed",{tag:t})},createTag(e){let t=de(n=>({...n,tags:{...n.tags,[e.id]:e}}));return a(t)?i("Could not create tag"):c("Tag created",e)},createNode(e){let t=de(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return a(t)?i("Unable to create node"):c("Node created",e)},lockNode(e){let t=this.getNode(e);if(!t)return i("Failed to locate node");let n={...t,readonly:!0},o=de(r=>({...r,nodes:{...r.nodes,[e]:n}}));return a(o)?i(o.message):c("Locked node",n)},updateNode(e){let t=de(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return a(t)?t:c("Updated node",e)},getContributor(e){return g().contributors[e]},getTag(e){return g().tags[e]},getNode(e){return g().nodes[e]},getSiblings(e){return oe(e)}}});import Xt from"chalk";import iu from"string-width";import{decodeTime as fv}from"ulid";var vv,hv,Pi,yv,bv,au,du,Iv,xv,Ev,Nv,Rv,Si,cu,wo=y(()=>{"use strict";le();w();ft();_r();vv=(e,t)=>e+" ".repeat(Math.max(0,t-iu(e))),hv=(e,t)=>" ".repeat(Math.max(0,t-iu(e)))+e,Pi=e=>({"add.issue":"Created with title","add.issue.assignee":"Assigned to","remove.issue.assignee":"Unassigned from","close.issue":"Closed","delete.node":"Deleted","edit.title":"Changed title to","edit.description":"Changed description","reopen.issue":"Reopened","add.issue.tag":"Tagged with","remove.issue.tag":"Removed tag","lock.node":"Locked node","move.node":"Moved issue","add.issue.comment":"Commented","delete.issue.comment":"Deleted comment","add.issue.attachment":"Attached","delete.issue.attachment":"Removed attachment","edit.issue.comment":"Edited comment","init.workspace":"Created workspace","add.workspace":"Created workspace","add.board":"Created board","add.swimlane":"Created swimlane","add.field":"Added field","create.tag":"Created tag","create.contributor":"Added contributor","rename.contributor":"Renamed contributor","link.contributor.user":"Linked contributor","tombstone.contributor":"Removed contributor","restore.contributor":"Restored contributor","rebalance.children":"Rebalanced order"})[e]??(e.endsWith("e")?`${e}d`:`${e}ed`),yv=(e,t)=>t?e<t?"up":e>t?"down":null:null,bv=(e,t)=>{let n=I.getNode(e.payload.parent),o=n?Xt.dim.bgBlack(` ${n.title} `):"unknown",r=t.at(-1);if(r&&"parent"in r&&"rank"in r&&r.parent===e.payload.parent){let s=yv(e.payload.rank,r.rank);if(s)return`Moved ${s} in ${o}`}return`Moved issue to ${o}`},au=e=>`${Math.max(1,Math.round(e/1024))} KB`,du=e=>I.getAttachment(e)?.name??"",Iv=e=>{switch(e.action){case"add.issue.tag":{let t=g().tags[e.payload.tag];return t?Xt.bgHex(we(t.name))(` ${t.name} `):"unknown tag"}case"remove.issue.tag":{let t=g().tags[e.payload.tag];return t?Xt.bgHex(we(t.name))(` ${t.name} `):"unknown tag"}case"add.issue.assignee":{let t=g().contributors[e.payload.assignee];return t?Xt.hex(we(t.name))(` ${t.name} `):"unknown user"}case"remove.issue.assignee":{let t=g().contributors[e.payload.assignee];return t?Xt.hex(we(t.name))(` ${t.name} `):"unknown user"}case"add.board":case"add.swimlane":case"add.issue":case"add.field":case"create.tag":case"create.contributor":case"rename.contributor":case"edit.title":return`"${"name"in e.payload?e.payload.name:""}"`;case"add.issue.attachment":return`"${e.payload.name}" ${Xt.dim(`(${au(e.payload.bytes)})`)}`;case"delete.issue.attachment":{let t=du(e.payload.id);return t?`"${t}"`:""}default:return""}},xv=e=>{let t=$n(fv(e));return Xt.gray(hv(t,8))},Ev=12,Nv=e=>vv(`${e}`,Ev),Rv=e=>{switch(e.action){case"add.issue.tag":case"remove.issue.tag":{let t=g().tags[e.payload.tag];return t?t.name:""}case"add.issue.assignee":case"remove.issue.assignee":{let t=g().contributors[e.payload.assignee];return t?t.name:""}case"add.board":case"add.swimlane":case"add.issue":case"add.field":case"create.tag":case"create.contributor":case"rename.contributor":case"edit.title":return"name"in e.payload?`"${e.payload.name}"`:"";case"move.node":{let t=I.getNode(e.payload.parent);return t?`to ${t.title}`:""}case"add.issue.attachment":return`"${e.payload.name}" (${au(e.payload.bytes)})`;case"delete.issue.attachment":{let t=du(e.payload.id);return t?`"${t}"`:""}default:return""}},Si=e=>[Pi(e.action),Rv(e)].filter(Boolean).join(" "),cu=(e,t)=>{let n=xv(e.id),o=Nv(e.userName),r=Xt.dim("\u203A"),s=e.action==="move.node"?bv(e,t):[Pi(e.action),Iv(e)].filter(Boolean).join(" ");return`${o} ${n} ${r} ${s}`}});var uu={};_i(uu,{areVirtualNodesEnabled:()=>Zo,createOrUpdateVirtualField:()=>Po,createOrUpdateVirtualFieldList:()=>Di,materializeTicketVirtualNodes:()=>Qo,materializeVirtualNodes:()=>Pv,setVirtualNodesEnabled:()=>kv});var Cv,Sv,Av,Tv,wv,Mv,Po,Di,Qo,Lv,lu,kv,Zo,Pv,Es=y(()=>{"use strict";wo();ie();A();Sn();le();tn();w();Nn();Dn();Cv=e=>Re(e,"comments"),Sv=e=>Re(e,"description"),Av=e=>Re(e,"assignees"),Tv=e=>Re(e,"tags"),wv=e=>Re(e,"history"),Mv=e=>Re(e,"attachments"),Po=({id:e,name:t,parentNodeId:n,rank:o,value:r,readonly:s=!1,childRenderAxis:d="horizontal"})=>{let l=I.getNode(e);if(!l){let p=I.createNode({...Ne.field({id:e,name:t,parentNodeId:n,rank:o,props:{value:r},isVirtual:!0}),readonly:s,childRenderAxis:d});return a(p)?p:c("Virtual field created",void 0)}if(!je(l))return i(`Existing virtual node ${e} is not a field`);if(!(l.title!==t||l.parentNodeId!==n||l.rank!==o||l.props.value!==r||l.readonly!==s||l.childRenderAxis!==d))return c("Virtual field unchanged",void 0);let m=I.updateNode({...l,title:t,parentNodeId:n,rank:o,props:{...l.props,value:r},readonly:s,childRenderAxis:d});return a(m)?m:c("Virtual field updated",void 0)},Di=({id:e,name:t,parentNodeId:n,rank:o,readonly:r=!1,childRenderAxis:s="horizontal"})=>{let d=I.getNode(e);if(!d){let m=I.createNode({...Ne.fieldList({id:e,name:t,parentNodeId:n,rank:o,isVirtual:!0}),readonly:r,childRenderAxis:s});return a(m)?m:c("Virtual field list created",void 0)}if(!Vn(d))return i(`Existing virtual node ${e} is not a field list`);if(!(d.title!==t||d.parentNodeId!==n||d.rank!==o||d.readonly!==r||d.childRenderAxis!==s))return c("Virtual field list unchanged",void 0);let u=I.updateNode({...d,title:t,parentNodeId:n,rank:o,readonly:r,childRenderAxis:s});return a(u)?u:c("Virtual field list updated",void 0)},Qo=e=>{let t=We(Je/4n),n=We(Je/2n),o=We(Je*3n/4n),r=We(Je*7n/8n),s=We(Je*15n/16n),d=We(Je*13n/16n);if(a(t))return t;if(a(n))return n;if(a(o))return o;if(a(r))return r;if(a(s))return s;if(a(d))return d;let l=Po({id:Sv(e.id),name:Q.DESCRIPTION,parentNodeId:e.id,rank:t.value,value:e.props.description??"",childRenderAxis:"vertical"});if(a(l))return l;let u=Di({id:Av(e.id),name:Q.ASSIGNEES,parentNodeId:e.id,rank:n.value,readonly:!0});if(a(u))return u;let m=Di({id:Tv(e.id),name:Q.TAGS,parentNodeId:e.id,rank:o.value,readonly:!0});if(a(m))return m;let p=Po({id:Cv(e.id),name:Q.COMMENTS,parentNodeId:e.id,rank:r.value,value:"",readonly:!1,childRenderAxis:"vertical"});if(a(p))return p;let v=Po({id:Mv(e.id),name:Q.ATTACHMENTS,parentNodeId:e.id,rank:s.value,value:"",readonly:!0,childRenderAxis:"vertical"});if(a(v))return v;let x=Po({id:wv(e.id),name:Q.HISTORY,parentNodeId:e.id,rank:d.value,value:Lv(e),readonly:!0,childRenderAxis:"vertical"});return a(x)?x:c("Ticket virtual nodes materialized",void 0)},Lv=e=>{let t=[...e.log].reverse(),n=new Map;for(let o of t){let r=n.get(o.action)??[];r.push(o.payload),n.set(o.action,r)}return t.map(o=>cu(o,n.get(o.action)??[])).join(`
58
- `)},lu=!0,kv=e=>{lu=e},Zo=()=>lu,Pv=()=>{let{nodes:e}=g();for(let t of Object.values(e)){if(!L(t))continue;let n=Qo(t);if(a(n))return n}return c("Virtual nodes materialized",void 0)}});var mu=y(()=>{"use strict"});var Dv,hP,pu,gu,Fi=y(()=>{"use strict";ct();Ot();vi();po();wo();ft();sn();Nt();mu();A();Ft();Rr();me();w();Dv=null,hP=Promise.resolve(),pu=()=>{if(!$t())return{mode:"live",asOfTime:null};let{timeMode:e}=g();return e==="live"?{mode:"live",asOfTime:null}:{mode:"scrub",asOfTime:Dv}},gu=(e,t)=>{let n=new Map,o=new Set,r=d=>{let l=new Set,u=d;for(;u&&!l.has(u);){if(o.has(u))return u;l.add(u),u=n.get(u)}return null},s=[];for(let d of e){let l=d.payload,u=l?.id;if(!u)continue;d.action==="add.board"&&o.add(u);let m=l.parent??l.issue;m&&n.set(u,m),(u===t||r(u)===t)&&s.push(d)}return s}});import{decodeTime as Fv,ulid as j}from"ulid";var ts,ue,ge,fe,Ov,Bv,fu,Uv,vu,hu,yu,bu,Iu,xu,Eu,Nu,Ru,Cu,Su,Au,Tu,wu,Mu,Lu,ku,Pu,Du,Fu,_v,Ou,Bu,Uu,_u,$u,ju=y(()=>{"use strict";ct();Ot();mr();Ps();vn();Ni();sr();sn();cn();rt();Fi();pi();Tn();ie();A();Ft();le();it();w();cr();me();st();wo();ft();Ar();An();Dt();fo();Bt();Fi();ts=e=>{let t=et(e??process.cwd());return a(t)?i(t.message):c("Resolved Epiq repo root",t.value)},ue=async(e,t)=>{let n=ts(e);if(a(n))return n;let o=De({repoRoot:n.value});if(a(o))return i(o.message);let r=_o(),s=await so({repoRoot:n.value,stateBranchRoot:o.value,stateBranchName:r.stateBranch});if(a(s))return i(s.message);if(t?.pull??!1){let u=await _({cwd:o.value,args:["pull","--ff-only"]});a(u)&&J.info(3,u.message)}let d=rn(o.value);if(a(d))return i(d.message);let l=Mn(d.value.events,d.value.unreadable);return a(l)?i(l.message):c("Booted Epiq state",{repoRoot:n.value,stateBranchRoot:o.value})},ge=()=>{let e=Md();return a(e)?i(e.message):e.value.userId?e.value.userName?c("Resolved actor",{userId:e.value.userId,userName:e.value.userName}):i("Unable to retrieve user name"):i("Unable to retrieve user id")},fe=()=>{let e=Oe();return a(e)?i(e.message):e},Ov=e=>(e.props.tags??[]).map(t=>I.getTag(t)).filter(t=>t!=null).map(t=>({id:t.id,name:t.name,color:we(t.name)})),Bv=()=>{let e=Oe(),t=a(e)?[]:e.value.eventLog??[],n=new Map;for(let o of t)o.userId&&o.userName&&n.set(o.userId,o.userName);return n},fu=(e,t)=>{let n=new Map(e);for(let o of Object.values(t))n.set(o.id,o.name);return n},Uv=e=>(e.props.assignees??[]).map(t=>I.getContributor(t)).filter(t=>t!=null).map(({id:t,name:n})=>({id:t,name:n,color:we(n)})),vu=async(e={})=>{let t=await ue(e.repoRoot,{pull:!1});if(a(t))return t;let n=fe();if(a(n))return n;let o=Object.values(n.value.nodes).filter(r=>r.context==="BOARD"&&!r.isDeleted).map(r=>({id:r.id,ref:nt(r.id),title:r.title,parentId:r.parentNodeId,readonly:!!r.readonly}));return c("Listed boards",o)},hu=async(e={})=>{let t=await ue(e.repoRoot,{pull:!1});if(a(t))return t;let n=fe();if(a(n))return n;let o=Object.values(n.value.nodes).filter(r=>r.context==="SWIMLANE"&&!r.isDeleted).filter(r=>!e.boardId||r.parentNodeId===e.boardId).map(r=>({id:r.id,title:r.title,boardId:r.parentNodeId,isClosed:r.id===ye,readonly:!!r.readonly}));return c("Listed swimlanes",o)},yu=async e=>{let t=await ue(e.repoRoot,{pull:!1});if(a(t))return t;let n=fe();if(a(n))return n;let o=n.value.nodes,r=Object.values(o).filter(L).filter(s=>!s.isDeleted).filter(s=>e.includeClosed||s.parentNodeId!==ye).filter(s=>e.boardId?(s.parentNodeId?o[s.parentNodeId]:void 0)?.parentNodeId===e.boardId:!0).map(s=>({id:s.id,ref:nt(s.id),title:Ge(s.title),description:s.props.description??"",createdAt:Fv(s.id),parentNodeId:s.parentNodeId,isClosed:s.parentNodeId===ye,readonly:!!s.readonly,tags:Ov(s),assignees:Uv(s)}));return c("Listed issues",r)},bu=async e=>{let t=await ue(e.repoRoot,{pull:!1});if(a(t))return t;let n=ge();if(a(n))return n;let o=fe();if(a(o))return o;let r=ln(e.parentId,n.value,t.value.stateBranchRoot);if(a(r))return r;let s=qr({name:e.title,parent:e.parentId,user:n.value,rank:r.value});if(a(s))return s;let d=[...s.value],l=d.find(v=>v.action==="add.issue")?.payload.id;if(!l)return i("Unable to determine created issue id");e.description&&d.push({id:j(),...n.value,action:"edit.description",payload:{id:l,md:e.description}});let u=[];for(let v of e.tagNames??[]){let x=Ge(v).trim();if(!x||u.some(T=>T.name===x))continue;let R=Object.values(o.value.tags).find(T=>T.name===x),S=R?.id??j();R||d.push({id:j(),...n.value,action:"create.tag",payload:{id:S,name:x}}),d.push({id:j(),...n.value,action:"add.issue.tag",payload:{id:l,tag:S}}),u.push({id:S,name:x})}let m=[];for(let v of e.assigneeNames??[]){let x=Ge(v).trim();if(!x||m.some(T=>T.name===x))continue;let R=Object.values(o.value.contributors).find(T=>T.name===x),S=R?.id??j();R||d.push({id:j(),...n.value,action:"create.contributor",payload:{id:S,name:x}}),d.push({id:j(),...n.value,action:"add.issue.assignee",payload:{id:l,assignee:S}}),m.push({id:S,name:x})}let p=B(d,t.value.stateBranchRoot);return a(p)?i(p.message):c("Created issue",{id:l,title:e.title,parentId:e.parentId,description:e.description??"",tags:u,assignees:m})},Iu=async e=>{let t=await ue(e.repoRoot,{pull:!1});if(a(t))return t;let n=ge();if(a(n))return n;let o=_t(ye,e.issueId,{at:"end"},n.value,t.value.stateBranchRoot);if(a(o))return o;let r={id:j(),...n.value,action:"close.issue",payload:{id:e.issueId,parent:ye,rank:o.value}},s=B([r],t.value.stateBranchRoot);return a(s)?i(s.message):c("Closed issue",{id:e.issueId})},xu=async e=>{let t=await ue(e.repoRoot,{pull:!1});if(a(t))return t;let n=ge();if(a(n))return n;let o=fe();if(a(o))return o;let r=o.value.nodes[e.issueId];if(!r)return i("Issue not found");if(!L(r))return i("Target node is not issue");if(r.parentNodeId!==ye)return i("Issue is not closed");let s=Hr(r);if(!s)return i("Unable to resolve previous parent from issue history");if(s===ye)return i("Previous parent resolves to closed swimlane");let d=o.value.nodes[s];if(!d)return i("Previous parent no longer exists");let l=_t(d.id,r.id,{at:"end"},n.value,t.value.stateBranchRoot);if(a(l))return l;let u={id:j(),...n.value,action:"reopen.issue",payload:{id:r.id,parent:d.id,rank:l.value}},m=B([u],t.value.stateBranchRoot);return a(m)?i(m.message):c("Reopened issue",{id:r.id,parentId:d.id})},Eu=async e=>{let t=ts(e.repoRoot);if(a(t))return t;let n=ge();if(a(n))return n;let o=De({repoRoot:t.value});if(a(o))return o;let r=rn(o.value);if(a(r))return r;let s=Mn(r.value.events,r.value.unreadable);if(a(s))return s;let d=_t(e.parentId,e.issueId,e.position??{at:"end"},n.value,o.value);if(a(d))return d;let l={id:j(),...n.value,action:"move.node",payload:{id:e.issueId,parent:e.parentId,rank:d.value}},u=B([l],o.value);return a(u)?i(u.message):c("Moved issue",{id:e.issueId,parentId:e.parentId})},Nu=async e=>{let t=await ue(e.repoRoot,{pull:!1});if(a(t))return t;let n=ge();if(a(n))return n;let o=fe();if(a(o))return o;let r=o.value.nodes[e.boardId];if(!r)return i("Board not found");if(!Fo(r))return i("Target parent must be a board");if(r.readonly)return i("Cannot add a swimlane to a readonly board");if(pu().mode!=="live")return i("Cannot add a swimlane while time travelling");let s=Ge(e.title);if(!s.trim())return i("Swimlane title cannot be empty");let d=ln(e.boardId,n.value,t.value.stateBranchRoot);if(a(d))return d;let l=j(),u={id:j(),...n.value,action:"add.swimlane",payload:{id:l,name:s,parent:e.boardId,rank:d.value}},m=B([u],t.value.stateBranchRoot);return a(m)?i(m.message):c("Created swimlane",{id:l,title:s,boardId:e.boardId})},Ru=async e=>{let t=await ue(e.repoRoot,{pull:!1});if(a(t))return t;let n=ge();if(a(n))return n;let o=fe();if(a(o))return o;let r=o.value.nodes[e.swimlaneId];if(!r)return i("Swimlane not found");if(!Zt(r))return i("Edit target must be a swimlane");if(r.readonly)return i("Cannot edit readonly swimlane");let s=Ge(e.title);if(!s.trim())return i("Swimlane title cannot be empty");if(r.title===s)return c("No changes made",{id:e.swimlaneId,title:s});let d={id:j(),...n.value,action:"edit.title",payload:{id:e.swimlaneId,name:s}},l=B([d],t.value.stateBranchRoot);return a(l)?i(l.message):c("Edited swimlane title",{id:e.swimlaneId,title:s})},Cu=async e=>{let t=ts(e.repoRoot);if(a(t))return t;let n=ge();if(a(n))return n;let o=De({repoRoot:t.value});if(a(o))return o;let r=rn(o.value);if(a(r))return r;let s=Mn(r.value.events,r.value.unreadable);if(a(s))return s;let d=_t(e.boardId,e.swimlaneId,e.position??{at:"end"},n.value,o.value);if(a(d))return d;let l={id:j(),...n.value,action:"move.node",payload:{id:e.swimlaneId,parent:e.boardId,rank:d.value}},u=B([l],o.value);return a(u)?i(u.message):c("Moved swimlane",{id:e.swimlaneId,boardId:e.boardId})},Su=async e=>{let t=await ue(e.repoRoot,{pull:!1});if(a(t))return t;let n=ge();if(a(n))return n;let o=fe();if(a(o))return o;let r=o.value.nodes[e.swimlaneId];if(!r)return i("Swimlane not found");if(!Zt(r))return i("Delete target must be a swimlane");let s={id:j(),...n.value,action:"delete.node",payload:{id:e.swimlaneId}},d=B([s],t.value.stateBranchRoot);return a(d)?i(d.message):c("Deleted swimlane",{id:e.swimlaneId})},Au=async(e={})=>{ar();let t=ts(e.repoRoot);if(a(t))return i("Sync failed");let n=ge();if(a(n))return n;let o=await pr({cwd:t.value,ownEventFileName:dn(n.value)});return a(o)?(Ms(o.message),o):(dr(),c("Synced",o.value))},Tu=async(e={})=>{let t=await ue(e.repoRoot,{pull:!1});if(a(t))return t;let n=fe();return a(n)?n:c("Retrieved Epiq state",{root:t.value.repoRoot,stateBranchRoot:t.value.stateBranchRoot,nodes:n.value.nodes,rootNodeId:n.value.rootNodeId,contextNode:n.value.contextNode,selectedIndex:n.value.selectedIndex,eventLog:n.value.eventLog})},wu=async e=>{let t=await ue(e.repoRoot,{pull:!1});if(a(t))return t;let n=ge();if(a(n))return n;let o=fe();if(a(o))return o;let r=o.value.nodes[e.issueId];if(!r)return i("Issue not found");if(!L(r))return i("Edit target must be an issue");if(r.readonly)return i("Cannot edit readonly issue");let s=r.props.description??"";if(s===e.description)return c("No changes made",{id:e.issueId,description:s});let d={id:j(),...n.value,action:"edit.description",payload:{id:e.issueId,md:e.description}},l=B([d],t.value.stateBranchRoot);return a(l)?i(l.message):c("Edited issue description",{id:e.issueId,description:e.description})},Mu=async e=>{let t=await ue(e.repoRoot,{pull:!1});if(a(t))return t;let n=ge();if(a(n))return n;let o=fe();if(a(o))return o;let r=o.value.nodes[e.issueId];if(!r)return i("Issue not found");if(!L(r))return i("Edit target must be an issue");if(r.readonly)return i("Cannot edit readonly issue");let s=Ge(e.title);if(!s.trim())return i("Issue title cannot be empty");if(r.title===s)return c("No changes made",{id:e.issueId,title:s});let d={id:j(),...n.value,action:"edit.title",payload:{id:e.issueId,name:s}},l=B([d],t.value.stateBranchRoot);return a(l)?i(l.message):c("Edited issue title",{id:e.issueId,title:s})},Lu=async e=>{let t=await ue(e.repoRoot,{pull:!1});if(a(t))return t;let n=ge();if(a(n))return n;let o=fe();if(a(o))return o;let r=o.value.nodes[e.issueId];if(!r)return i("Issue not found");if(!L(r))return i("Tag target must be an issue");if(r.readonly)return i("Cannot tag readonly issue");let s=Ge(e.tagName).trim();if(!s)return i("Tag name cannot be empty");let d=Object.values(o.value.tags).find(p=>p.name===s),l=d?.id??j(),u=[...d?[]:[{id:j(),...n.value,action:"create.tag",payload:{id:l,name:s}}],{id:j(),...n.value,action:"add.issue.tag",payload:{id:e.issueId,tag:l}}],m=B(u,t.value.stateBranchRoot);return a(m)?i(m.message):c("Added issue tag",{id:e.issueId,tag:{id:l,name:s}})},ku=async e=>{let t=await ue(e.repoRoot,{pull:!1});if(a(t))return t;let n=ge();if(a(n))return n;let o=fe();if(a(o))return o;let r=o.value.nodes[e.issueId];if(!r)return i("Issue not found");if(!L(r))return i("Untag target must be an issue");if(r.readonly)return i("Cannot untag readonly issue");if(!o.value.tags[e.tagId])return i("Tag not found");let s={id:j(),...n.value,action:"remove.issue.tag",payload:{id:e.issueId,tag:e.tagId}},d=B([s],t.value.stateBranchRoot);return a(d)?i(d.message):c("Removed issue tag",{id:e.issueId,tagId:e.tagId})},Pu=async(e,t)=>{let n=Ts(e);if(a(n))return;let o;for(let r of n.value)r.userId===t&&(o=r.userName??o);return o===void 0?void 0:{id:t,name:o}},Du=async e=>{let t=await ue(e.repoRoot,{pull:!1});if(a(t))return t;let n=ge();if(a(n))return n;let o=fe();if(a(o))return o;let r=o.value.nodes[e.issueId];if(!r)return i("Issue not found");if(!L(r))return i("Assign target must be an issue");if(r.readonly)return i("Cannot assign readonly issue");let s=e.self?n.value.userId:e.assigneeId;if(s){let T=o.value.contributors[s],O=T?void 0:await Pu(t.value.stateBranchRoot,s);if(!T&&!O)return i("Unknown assignee id");let $=T??O,W=[...T?[]:[{id:j(),...n.value,action:"create.contributor",payload:{id:$.id,name:$.name}}],{id:j(),...n.value,action:"add.issue.assignee",payload:{id:e.issueId,assignee:$.id}}],ve=B(W,t.value.stateBranchRoot);return a(ve)?i(ve.message):c("Added issue assignee",{id:e.issueId,assignee:{id:$.id,name:$.name}})}let d=Ge(e.assigneeName??"").trim();if(!d)return i("Provide assigneeId, self or assigneeName");let u=[...fu(Bv(),o.value.contributors).entries()].filter(([,T])=>T===d);if(u.length>1)return i(`"${d}" matches ${u.length} contributors (${u.map(([T])=>T).join(", ")}). Assign by assigneeId to choose.`);let m=u[0];if(!m&&!e.createUnlinked)return i(`No contributor named "${d}". Assign by id, or pass createUnlinked to add them as an external assignee.`);let[p=j(),v=d]=m??[],R=[...!!o.value.contributors[p]?[]:[{id:j(),...n.value,action:"create.contributor",payload:{id:p,name:v}}],{id:j(),...n.value,action:"add.issue.assignee",payload:{id:e.issueId,assignee:p}}],S=B(R,t.value.stateBranchRoot);return a(S)?i(S.message):c("Added issue assignee",{id:e.issueId,assignee:{id:p,name:v}})},Fu=async e=>{let t=await ue(e.repoRoot,{pull:!1});if(a(t))return t;let n=ge();if(a(n))return n;let o=fe();if(a(o))return o;if(!o.value.contributors[e.contributorId])return i("Contributor not found");if(await Pu(t.value.stateBranchRoot,e.contributorId))return i("Cannot remove a contributor who has authored events \u2014 their name appears throughout the log");let d=[{id:j(),...n.value,action:"tombstone.contributor",payload:{id:e.contributorId}}],l=B(d,t.value.stateBranchRoot);return a(l)?i(l.message):c("Tombstoned contributor",{id:e.contributorId,name:Do})},_v=async(e,t)=>{let n=wn(e);if(a(n))return;let o;for(let r of n.value){if(r.action!=="create.contributor")continue;let s=r.payload;s.id===t&&s.name&&(o=s.name)}return o},Ou=async e=>{let t=await ue(e.repoRoot,{pull:!1});if(a(t))return t;let n=ge();if(a(n))return n;let o=fe();if(a(o))return o;let r=o.value.contributors[e.contributorId];if(!r)return i("Contributor not found");if(!r.tombstoned)return i("Contributor is not tombstoned");let s=await _v(t.value.stateBranchRoot,e.contributorId);if(!s)return i("Cannot restore this contributor \u2014 no original name found in the event log");let d=[{id:j(),...n.value,action:"restore.contributor",payload:{id:e.contributorId,name:s}}],l=B(d,t.value.stateBranchRoot);return a(l)?i(l.message):c("Restored contributor",{id:e.contributorId,name:s})},Bu=async(e={})=>{let t=await ue(e.repoRoot,{pull:!1});if(a(t))return t;let n=ge();if(a(n))return n;let o=fe();if(a(o))return o;let r=wn(t.value.stateBranchRoot);if(a(r))return i(r.message);let s=e.boardId?gu(r.value,e.boardId):r.value,d=new Map,l=new Set,u=new Set,m=Ts(t.value.stateBranchRoot);if(a(m))return i(m.message);for(let R of m.value)R.userId&&u.add(R.userId);for(let R of s)R.userId&&(d.set(R.userId,R.userName??""),l.add(R.userId));let p=o.value.contributors,x=[...fu(d,p).entries()].map(([R,S])=>({id:R,name:S,color:we(S),isSelf:R===n.value.userId,isExternal:!l.has(R),isRemoved:p[R]?.tombstoned===!0,hasAuthoredAnywhere:u.has(R)}));return c("Listed board contributors",x)},Uu=async e=>{let t=await ue(e.repoRoot,{pull:!1});if(a(t))return t;let n=ge();if(a(n))return n;let o=fe();if(a(o))return o;let r=o.value.nodes[e.issueId];if(!r)return i("Issue not found");if(!L(r))return i("Unassign target must be an issue");if(r.readonly)return i("Cannot unassign readonly issue");if(!o.value.contributors[e.assigneeId])return i("Assignee not found");let s={id:j(),...n.value,action:"remove.issue.assignee",payload:{id:e.issueId,assignee:e.assigneeId}},d=B([s],t.value.stateBranchRoot);return a(d)?i(d.message):c("Removed issue assignee",{id:e.issueId,assigneeId:e.assigneeId})},_u=async e=>{let t=await ue(e.repoRoot,{pull:!1});if(a(t))return t;let n=ge();if(a(n))return n;let o=fe();if(a(o))return o;let r=o.value.nodes[e.issueId];if(!r)return i("Issue not found");if(!L(r))return i("Comment target must be an issue");if(r.readonly)return i("Cannot comment on readonly issue");let s=e.body.trim();if(!s)return i("Comment cannot be empty");if(s.length>4e3)return i(`Comment cannot exceed ${4e3} characters (got ${s.length})`);let d=j(),l={id:j(),...n.value,action:"add.issue.comment",payload:{id:d,issue:e.issueId,md:s,author:n.value.userId}},u=B([l],t.value.stateBranchRoot);return a(u)?i(u.message):c("Added issue comment",{id:d,issueId:e.issueId,body:s})},$u=async e=>{let t=await ue(e.repoRoot,{pull:!1});if(a(t))return t;let n=ge();if(a(n))return n;let o=fe();if(a(o))return o;let r=o.value.eventLog.find(m=>m.action==="add.issue.comment"&&m.payload.id===e.commentId);if(!r)return i("Unable to resolve comment");if(r.payload.author!==n.value.userId)return i("You can only delete your own comments");let s=o.value.nodes[r.payload.issue];if(!s)return i("Issue not found");if(!L(s))return i("Comment target must be an issue");if(s.readonly)return i("Cannot delete comment on readonly issue");if(o.value.eventLog.some(m=>m.action==="delete.issue.comment"&&m.payload.id===e.commentId))return c("Comment already deleted",{id:e.commentId,issueId:r.payload.issue});let l={id:j(),...n.value,action:"delete.issue.comment",payload:{id:e.commentId,issue:r.payload.issue}},u=B([l],t.value.stateBranchRoot);return a(u)?i(u.message):c("Deleted issue comment",{id:e.commentId,issueId:r.payload.issue})}});var Vu={};_i(Vu,{createMcpServer:()=>Wu,resultJson:()=>X,startMcpServer:()=>Hu});import{McpServer as $v}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as jv}from"@modelcontextprotocol/sdk/server/stdio.js";import{z as b}from"zod";var X,Wu,Hu,Ku=y(async()=>{"use strict";A();ju();X=e=>({isError:a(e),content:[{type:"text",text:JSON.stringify(e,null,2)}]}),Wu=()=>{let e=new $v({name:"epiq",version:"0.2.30"});return e.registerTool("epiq_state_get",{description:"Get the full current Epiq state, including nodes and event log",inputSchema:b.object({repoRoot:b.string().optional()})},async t=>X(await Tu(t))),e.registerTool("epiq_issue_list",{description:"List Epiq issues. Pass boardId to scope results to a single board and reduce response size.",inputSchema:b.object({repoRoot:b.string().optional(),includeClosed:b.boolean().optional(),boardId:b.string().optional()})},async t=>X(await yu(t))),e.registerTool("epiq_board_list",{description:"List Epiq boards",inputSchema:b.object({repoRoot:b.string().optional()})},async t=>X(await vu(t))),e.registerTool("epiq_swimlane_list",{description:"List Epiq swimlanes",inputSchema:b.object({repoRoot:b.string().optional(),boardId:b.string().optional()})},async t=>X(await hu(t))),e.registerTool("epiq_swimlane_create",{description:"Create an Epiq swimlane on a board",inputSchema:b.object({repoRoot:b.string().optional(),boardId:b.string().min(1),title:b.string().min(1)})},async t=>X(await Nu(t))),e.registerTool("epiq_swimlane_title_edit",{description:"Edit an Epiq swimlane title",inputSchema:b.object({repoRoot:b.string().optional(),swimlaneId:b.string().min(1),title:b.string().min(1)})},async t=>X(await Ru(t))),e.registerTool("epiq_swimlane_move",{description:"Move/reorder an Epiq swimlane, optionally to another board",inputSchema:b.object({repoRoot:b.string().optional(),swimlaneId:b.string().min(1),boardId:b.string().min(1),position:b.discriminatedUnion("at",[b.object({at:b.literal("start")}),b.object({at:b.literal("end")}),b.object({at:b.literal("before"),sibling:b.string().min(1)}),b.object({at:b.literal("after"),sibling:b.string().min(1)})]).optional()})},async t=>X(await Cu(t))),e.registerTool("epiq_swimlane_delete",{description:"Delete (archive) an Epiq swimlane. This also archives every issue contained in it.",inputSchema:b.object({repoRoot:b.string().optional(),swimlaneId:b.string().min(1)})},async t=>X(await Su(t))),e.registerTool("epiq_issue_create",{description:"Create an Epiq issue. Optionally set description, tags, and assignees atomically in the same call instead of separate follow-up edits.",inputSchema:b.object({title:b.string().min(1),parentId:b.string().min(1),repoRoot:b.string().optional(),description:b.string().optional(),tagNames:b.array(b.string()).optional(),assigneeNames:b.array(b.string()).optional()})},async t=>X(await bu(t))),e.registerTool("epiq_issue_description_edit",{description:"Edit the markdown description of an Epiq issue",inputSchema:b.object({issueId:b.string().min(1),description:b.string(),repoRoot:b.string().optional()})},async t=>X(await wu(t))),e.registerTool("epiq_issue_title_edit",{description:"Edit the title of an Epiq issue",inputSchema:b.object({issueId:b.string().min(1),title:b.string().min(1),repoRoot:b.string().optional()})},async t=>X(await Mu(t))),e.registerTool("epiq_issue_tag_add",{description:"Add a tag to an Epiq issue, creating the tag if it does not exist",inputSchema:b.object({issueId:b.string().min(1),tagName:b.string().min(1),repoRoot:b.string().optional()})},async t=>X(await Lu(t))),e.registerTool("epiq_issue_tag_remove",{description:"Remove a tag from an Epiq issue",inputSchema:b.object({issueId:b.string().min(1),tagId:b.string().min(1),repoRoot:b.string().optional()})},async t=>X(await ku(t))),e.registerTool("epiq_contributor_list",{description:"List people who can be assigned: everyone who has authored an event (optionally scoped to one board) unioned with the contributor registry. Use these ids with epiq_issue_assignee_add rather than assigning by name.",inputSchema:b.object({boardId:b.string().min(1).optional(),repoRoot:b.string().optional()})},async t=>X(await Bu(t))),e.registerTool("epiq_contributor_remove",{description:"Remove an external contributor from the assignee suggestion lists. Their id and every reference to it survive, so existing assignments stay intact and the event log is untouched. Refused for anyone who has authored events, since their name is in the log regardless.",inputSchema:b.object({contributorId:b.string().min(1),repoRoot:b.string().optional()})},async t=>X(await Fu(t))),e.registerTool("epiq_contributor_restore",{description:"Put a contributor removed with epiq_contributor_remove back into the suggestion lists, under the name they were created with.",inputSchema:b.object({contributorId:b.string().min(1),repoRoot:b.string().optional()})},async t=>X(await Ou(t))),e.registerTool("epiq_issue_assignee_add",{description:"Assign a contributor to an Epiq issue. Pass self:true to assign yourself. Prefer assigneeId otherwise, which assigns a known contributor (from the registry or the event log) and fails if the id is unknown. assigneeName matches an existing contributor by name; to create somebody new from a name you must also pass createUnlinked, which adds them as an external (non-contributor) assignee.",inputSchema:b.object({issueId:b.string().min(1),assigneeId:b.string().min(1).optional(),self:b.boolean().optional(),assigneeName:b.string().min(1).optional(),createUnlinked:b.boolean().optional(),repoRoot:b.string().optional()})},async t=>X(await Du(t))),e.registerTool("epiq_issue_assignee_remove",{description:"Remove an assignee from an Epiq issue",inputSchema:b.object({issueId:b.string().min(1),assigneeId:b.string().min(1),repoRoot:b.string().optional()})},async t=>X(await Uu(t))),e.registerTool("epiq_issue_comment_add",{description:"Add a comment to an Epiq issue",inputSchema:b.object({issueId:b.string().min(1),body:b.string().min(1),repoRoot:b.string().optional()})},async t=>X(await _u(t))),e.registerTool("epiq_issue_comment_delete",{description:"Delete a comment from an Epiq issue",inputSchema:b.object({commentId:b.string().min(1),repoRoot:b.string().optional()})},async t=>X(await $u(t))),e.registerTool("epiq_issue_reopen",{description:"Reopen a closed Epiq issue, restoring it to its previous swimlane",inputSchema:b.object({issueId:b.string().min(1),repoRoot:b.string().optional()})},async t=>X(await xu(t))),e.registerTool("epiq_issue_close",{description:"Close an Epiq issue",inputSchema:b.object({issueId:b.string().min(1),repoRoot:b.string().optional()})},async t=>X(await Iu(t))),e.registerTool("epiq_issue_move",{description:"Move an Epiq issue to another swimlane",inputSchema:b.object({issueId:b.string().min(1),parentId:b.string().min(1),position:b.discriminatedUnion("at",[b.object({at:b.literal("start")}),b.object({at:b.literal("end")}),b.object({at:b.literal("before"),sibling:b.string().min(1)}),b.object({at:b.literal("after"),sibling:b.string().min(1)})]).optional(),repoRoot:b.string().optional()})},async t=>X(await Eu(t))),e.registerTool("epiq_sync",{description:"Sync Epiq state with the configured Git remote (pull remote changes and push local ones). Other Epiq MCP tools only read and write local state and never sync automatically \u2014 call this on demand when you need to see or publish the latest remote changes.",inputSchema:b.object({repoRoot:b.string().optional()})},async t=>X(await Au(t))),e},Hu=async()=>{let e=Wu(),t=new jv;await e.connect(t)};await Hu()});process.env.EPIQ_MCP="true";console.log=console.error;console.info=console.error;console.debug=console.error;console.warn=console.error;var{setVirtualNodesEnabled:Wv}=await Promise.resolve().then(()=>(Es(),uu));Wv(!1);await Ku().then(()=>Vu);
67
+ `,ua.writeFileSync(t,n,"utf8"),Y.info(`Added ${s.join(", ")} to .gitignore (epiq local state)`),c("Local epiq paths ignored",!0)}});import jv from"node:fs";import Eu from"node:path";var Hv,ee,Ru,Nu=y(()=>{"use strict";Iu();gr();ct();at();So();Xe();Mo();Io();kt();ut();de();A();Tt();Ie();Oe();M();le();Hv=async e=>{let t=await j({cwd:e,args:["status","--porcelain"]});return a(t)?t:c("Checked git diff",t.value.stdout.trim().length>0)},ee=(e,t)=>i(`[${e}] ${t}`),Ru=async()=>{G("");let e=ur(),t=await dt(process.cwd());if(a(t))return ee(1,t.message);let n=t.value,o=await fr(n);if(a(o))return ee(2,o.message);if(o.value)return ee(2,`Cannot initialize Epiq while a git operation is in progress: ${o.value}`);let r=await Hv(n);if(a(r))return ee(2.5,r.message);if(r.value)return ee(3,"Cannot initialize Epiq with uncommitted changes. Commit or stash your changes first.");if(fo(n))return ee(4,"Epiq project already initialized");let s=Vr();if(!s.isSetupDone||!s.userName)return ee(5,"Missing Epiq user configuration (userId / userName). Run setup first.");let d=ye(),l=d.userName,u=d.userId;if(!u||!l)return ee(5,"Missing Epiq user id");let m=await tc(n);if(a(m))return ee(6,m.message);let p=e.stateBranch,f=await hr({repoRoot:n,branch:p});if(a(f))return ee(6,f.message);if(f.value)return ee(6,`State branch already exists: ${p}`);let I=await mi({repoRoot:n,stateBranchName:p});if(a(I))return ee(6,I.message);let N=br();if(a(N))return ee(7,N.message);let T=Eu.join(yr(),e.projectId),C=await Rn({repoRoot:n,stateBranchRoot:T,stateBranchName:p});if(a(C))return ee(8,C.message);let w=Eu.join(T,".epiq");jv.mkdirSync(w,{recursive:!0});let $=Vd({userId:u,userName:l});if(a($))return ee(9,$.message);for(let Ds of $.value){let La=Mr({event:Ds,rootDir:T});if(a(La))return ee(9,La.message)}let _=await Ur({stateBranchRoot:T,eventFileName:xn({userId:u,userName:l})});if(a(_))return ee(10,_.message);let Z=await On({cwd:T,message:"[epiq:init]"});if(a(Z))return ee(10,Z.message);let ve=await xu(n);if(a(ve))return ee(11,ve.message);let X=Ka({repoRoot:n,fileContents:e});if(a(X))return ee(12,X.message);let W=await he.stage({cwd:n,pathspec:[".epiq/project.json",".gitignore"]});if(a(W))return ee(13,W.message);let q=await he.commit({cwd:n,message:"[epiq:init-project]",pathspec:[".epiq/project.json",".gitignore"]});if(a(q))return ee(13,q.message);let dn="Project initialized!",cn=await j({cwd:n,args:["push","-u","origin","HEAD"]});a(cn)&&(dn+=` Warn: [init:14] ${cn.message}`);let oo=await No({repoRoot:n,stateBranchRoot:T});a(oo)&&(dn+=` Warn: [init:15] ${oo.message}`);let Ma=Mt($.value).filter(a);if(Ma.length>0)return ee(16,Ma.map(Ds=>Ds.message).join(`
68
+ `));let Ps=$e();if(a(Ps))return ee(16,Ps.message);let{rootNodeId:Tp,nodes:wp}=Ps.value,ka=wp[Tp];return ka?(O.navigate({contextNode:ka,selectedIndex:0}),E({hasProjectDefinition:!0,mode:h.DEFAULT}),c(dn,null)):ee(16,"Unable to resolve initialized root node")}});import{ulid as Wv}from"ulid";function pa(e){let t=Cu();if(a(t))return t;let{contextNode:n,nodes:o}=g();if(!n.parentNodeId)return i("Missing parent node id");let r=o[n.parentNodeId];if(!r)return i("Missing parent node");let s=ce(r.id),d=s.findIndex(({id:m})=>m===n.id);if(d<0)return i("Current node not found among siblings");let l=s[d+e];if(!l)return i("Missing sibling node");let u=Au({id:t.value.id,parentId:l.id,position:{at:"end"}});return a(u)?u:Tu(u.value)}function ga(e){let t=Cu();if(a(t))return t;let{contextNode:n,selectedIndex:o}=g(),s=ce(n.id)[o+e];if(!s)return i("Missing sibling node");let d=Au({id:t.value.id,parentId:n.id,position:{at:e===1?"after":"before",sibling:s.id}});return a(d)?d:Tu(d.value)}var Su,rn,Qo,Cu,ma,Au,Tu,fa=y(()=>{"use strict";kt();ut();A();ht();M();Su=null,rn=()=>structuredClone(Su),Qo=e=>{Su=e},Cu=()=>{let{contextNode:e,selectedIndex:t}=g(),o=ce(e.id)[t];return o?c("Resolved selected child",o):i("Target node not found")},ma=({id:e,parentId:t,position:n={at:"end"}})=>{let o=ce(t).filter(r=>r.id!==e);return kr(o,n)},Au=({id:e,parentId:t,position:n={at:"end"}})=>{let o=fe();if(a(o))return i("Unable to resolve user ID");let r=ma({parentId:t,id:e,position:n});return a(r)?r:c("Created pending move state",{id:Wv(),...o.value,action:"move.node",payload:{id:e,parent:t,rank:r.value.rank}})},Tu=e=>{Qo(e);let t=Vt(e,!0);return a(t)?t:c("Node moved successfully",t.value)}});import{ulid as Gv}from"ulid";var wu,xs,Mu,ku=y(()=>{"use strict";Xe();fa();In();ut();de();A();ht();Ie();M();le();wu=()=>{let e=rn();if(!e)return i("No pending move state");let t=e.payload.id,n=e.payload.parent,o=g().nodes[n];if(!o)return i("Move parent not found");let r=ce(n).findIndex(s=>s.id===t);return r===-1?i("Moved node not found among rendered children"):(O.navigate({contextNode:o,selectedIndex:r}),c("Synchronized navigation to moved node",null))},xs=(e,t="Moved preview")=>{if(a(e))return e;let n=wu();return a(n)?n:(E({mode:h.MOVE}),c(t,null))},Mu=async()=>{let e=fe();if(a(e))return i("Unable to resolve user ID");let{modifier:t}=se().commandMeta,{contextNode:n,selectedIndex:o}=g(),r=ce(n.id)[o];if(!r)return E({mode:h.DEFAULT}),i("No move target");if(t==="start"){if(r.readonly)return i("Target node is read-only");if(o===-1)return i("No item selected");if(!r.parentNodeId)return i("Target has no parent");let s=ce(r.parentNodeId),d=s.findIndex(({id:f})=>f===r.id);if(d===-1)return i("Target not found among siblings");let l=s[d-1],u=s[d+1],m=u!=null?{at:"before",sibling:u.id}:l!=null?{at:"after",sibling:l.id}:{at:"start"},p=ma({parentId:r.parentNodeId,id:r.id,position:m});return a(p)?p:(Qo({id:Gv(),action:"move.node",payload:{id:r.id,parent:r.parentNodeId,rank:p.value.rank},...e.value}),E({mode:h.MOVE}),c("Move initialized",null))}if(t==="next")return xs(ga(1));if(t==="previous")return xs(ga(-1));if(t==="to-next")return xs(pa(1));if(t==="to-previous")return xs(pa(-1));if(t==="confirm"){let s=rn();if(!s)return i("No pending move to confirm");let d=await yt();if(a(d))return d;let l=B([s],d.value);if(a(l))return l;let u=wu();return a(u)?u:(Qo(null),E({mode:h.DEFAULT}),c("Moved item",null))}return t==="cancel"?(Qo(null),E({mode:h.DEFAULT}),c("Cancelling move",null)):i("Invalid move modifier")}});import{monotonicFactory as qv,ulid as Vv}from"ulid";var Kv,Is,ha=y(()=>{"use strict";A();Kv=qv(),Is=({name:e,parent:t,rank:n,user:{userId:o,userName:r}})=>{let s=Kv();return c("Created issue events",[{id:Vv(),userId:o,userName:r,action:"add.issue",payload:{id:s,parent:t,name:e,rank:n}}])}});import{ulid as Es}from"ulid";var Lu,Pu=y(()=>{"use strict";Xe();ha();In();ut();gt();A();ge();ht();M();le();Lu=async(e,t)=>{let n=fe();if(a(n))return i("Unable to resolve user ID");let o=await yt();if(a(o))return o;let r=o.value;if(!t.inputString)return i(`provide a name for your ${t.modifier}`);let{breadCrumb:s,contextNode:d,selectedIndex:l}=g(),u=m=>{let p=B([m],r);if(a(p))return p;let f=x.getNode(p.value[0].result.id);if(!f)return i("Created node not found");if(!f.parentNodeId)return p;let I=x.getNode(f.parentNodeId);return I?(O.navigate({contextNode:I,selectedIndex:x.getSiblings(f.parentNodeId).findIndex(({id:N})=>N===f.id)}),p):i("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:m}=g(),p=x.getNode(m);if(!p)return i("Workspace not found");let f=En(p.id,n.value,r);return a(f)?f:u({id:Es(),action:"add.board",payload:{id:Es(),name:t.inputString,parent:p.id,rank:f.value},...n.value})}if(t.modifier==="swimlane"){let m=qe(s,"BOARD");if(a(m))return i("Unable to add swimlane in this context");let p=En(m.value.id,n.value,r);return a(p)?p:u({id:Es(),action:"add.swimlane",payload:{id:Es(),name:t.inputString,parent:m.value.id,rank:p.value},...n.value})}if(t.modifier==="issue"){let m=re(d.id)[l],p=d.context==="SWIMLANE"?d:d.context==="BOARD"&&m?.context==="SWIMLANE"?m:(()=>{let _=qe(s,"SWIMLANE");return a(_)?null:_.value})();if(!p)return i("Unable to add issue in this context");let f=En(p.id,n.value,r);if(a(f))return f;let I=Is({name:t.inputString,parent:p.id,rank:f.value,user:n.value});if(a(I))return I;let N=I.value,T=B([...N],r);if(a(T))return T;if(!T.value[0])return i("Issue creation failed");let $=N.find(_=>_.action==="add.issue")?.payload.id;return $?(O.navigate({contextNode:p,selectedIndex:x.getSiblings(p.id).findIndex(({id:_})=>_===$)}),c("Issue created",null)):i("Unable to determine ticket id")}return c("Success",null)}});var Du,Fu=y(()=>{"use strict";ct();at();So();wo();Io();Kt();A();Tt();M();Or();Du=async e=>{let t=Ne({repoRoot:e});if(a(t))return Eo(3,t.message);let n=await Rn({repoRoot:e,stateBranchRoot:t.value,stateBranchName:ur().stateBranch});if(a(n))return Eo(3,n.message);let o=await j({cwd:t.value,args:["pull","--ff-only"]});a(o)&&logger.info(3,o.message);let r=Lt(t.value);if(a(r))return Eo(3,r.message);let{events:s,unreadable:d}=r.value,l=Yt(s,d);if(a(l))return Eo(4,l.message);E({hasProjectDefinition:!0,hasInitializingEvents:!!s.length});let u=Ii({root:e});return a(u)&&logger.info(u.message),c("Loaded project",void 0)}});import zv from"node:os";import Bu from"node:path";var Yv,Xv,Ou,_u=y(()=>{"use strict";Fu();wo();A();Ie();M();le();Yv=e=>e==="~"||e.startsWith("~/")?Bu.join(zv.homedir(),e.slice(1)):e,Xv=(e,t)=>{let n=e.trim();if(!n)return i("Provide a number from the list or a path to a project");if(/^\d+$/.test(n)){let r=t[Number(n)-1];return r?c("Resolved recent project",r.root):i(`No recent project #${n}`)}let o=ze(Bu.resolve(Yv(n)));return a(o)?i(`No epiq project at ${n}`):c("Resolved project path",o.value)},Ou=async()=>{let e=ds();if(G(""),g().hasProjectDefinition)return i("Already in a project; run epiq from another directory");let t=qr({exclude:process.cwd()}),n=a(t)?[]:t.value,o=Xv(e,n);if(a(o))return i(o.message);let r=o.value,s=process.cwd();try{process.chdir(r)}catch(l){return i(`Unable to enter ${r}: ${l instanceof Error?l.message:String(l)}`)}let d=await Du(r);return a(d)?(process.chdir(s),i(d.message)):c(`Opened ${xc(r)}`,null)}});var Rs,va=y(()=>{"use strict";Xe();Kt();kt();A();M();Rs=({boardId:e,targetTime:t,stateBranchRoot:n,selectedIndex:o})=>{let r=g(),s=ci(n,t);if(a(s))return i(s.message);let{appliedEvents:d,unappliedEvents:l}=s.value,u=Ot();if(a(u))return u;let m=Mt(d),{fatal:p,skipped:f}=vn(m);if(p.length>0)return Ot(),E(r),i(p.map(N=>N.message).join(", "));yn(f);let I=g().nodes[e];return I?(O.navigate({contextNode:I,selectedIndex:o}),c("",{unappliedEvents:l})):(Ot(),E(r),i("Board did not exist at that date"))}});var Jv,Qv,Zv,Ns,Ss,Pn,Uu,ey,$u,ya=y(()=>{"use strict";Do();Zo();kt();de();A();M();Jv=20,Qv=16,Zv=150,Ns=null,Ss=null,Pn=()=>{Ns!==null&&(clearInterval(Ns),Ns=null),Ss!==null&&(clearTimeout(Ss),Ss=null)},Uu=()=>{Pn(),E({mode:h.DEFAULT,readOnly:!1,readOnlyReason:void 0,timeMode:"live",unappliedEvents:[],replay:null,selectedIndex:0})},ey=e=>{let t=[],n=0;for(let r=0;r<e.length;r++){let s=r===0?0:Math.max(0,e[r]-e[r-1]);n+=Math.sqrt(s),t[r]=n}let o=n;return t.map((r,s)=>o>0?r/o:(s+1)/e.length)},$u=({events:e,startTime:t,durationMs:n})=>{Pn();let o=e.length,r=e.map(f=>An(f)??t),s=r[o-1]??Date.now(),d=ey(r),l=Math.max(1,Math.round(n*Jv/1e3)),u=Math.max(Math.round(n/l),Qv),m=0,p=0;E({mode:h.DEFAULT,readOnly:!0,timeMode:"replay",unappliedEvents:e,replay:{progress:0,appliedCount:0,totalCount:o,currentTime:t,startTime:t,endTime:s,currentLabel:"",flashNodeIds:[]}}),Ns=setInterval(()=>{m++;let f=m/l,I=[],N;for(;p<o&&d[p]<=f;){let C=e[p],w=Vt(C);if(a(w)){if(yo(w)){p++;continue}Uu();return}I.push(...Zs(C)),N=C,p++}if(p>=o||m>=l){for(;p<o;p++){let w=Vt(e[p]);if(a(w)&&!yo(w))break}let C=g().replay;E({unappliedEvents:[],replay:C&&{...C,progress:1,appliedCount:o}}),Pn(),Ss=setTimeout(Uu,Zv);return}let T=g().replay;E({unappliedEvents:e.slice(p),replay:{progress:Math.min(1,f),appliedCount:p,totalCount:o,startTime:t,endTime:s,currentTime:N?An(N)??T?.currentTime??t:T?.currentTime??t,currentLabel:N?ba(N):T?.currentLabel??"",flashNodeIds:N?[...new Set(I)]:T?.flashNodeIds??[]}})},u)}});var ju,Hu=y(()=>{"use strict";ct();Do();Kt();kt();de();gt();A();Ie();M();Lo();va();ya();ju=async()=>{let e=qe(g().breadCrumb,"BOARD");if(a(e))return e;let t=await dt(process.cwd());if(a(t))return i("Unable to locate repo root");let n=Ne({repoRoot:t.value});if(a(n))return n;let{modifier:o,inputString:r}=se().commandMeta;if(Pn(),o==="now"){let l=jn(n.value);if(a(l))return i(l.message);let u=Ot();if(a(u))return u;let m=Mt(l.value),{fatal:p,skipped:f}=vn(m);return p.length>0?i(p.map(I=>I.message).join(", ")):(yn(f),E({mode:h.DEFAULT,readOnly:!1,readOnlyReason:void 0,timeMode:"live",unappliedEvents:[],replay:null}),c("Peeking now",!0))}let s;if(o==="prev"){let l=g().eventLog.at(-1),u=An(l);if(u===null)return i("No previous event to peek");s=u}else if(o==="next"){let l=g().unappliedEvents.at(0),u=An(l);if(u===null)return i("No next event to peek");s=u+1}else{let l=Sn(o||r.trim());if(!l)return i("Invalid peek date");s=l.getTime()}let d=Rs({boardId:e.value.id,targetTime:s,stateBranchRoot:n.value,selectedIndex:0});return a(d)?d:(E({mode:h.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:d.value.unappliedEvents,replay:null}),c("Peeking",!0))}});var Wu,Gu=y(()=>{"use strict";ct();gt();A();Ie();M();Lo();va();ya();Wu=async()=>{let e=qe(g().breadCrumb,"BOARD");if(a(e))return e;let t=await dt(process.cwd());if(a(t))return i("Unable to locate repo root");let n=Ne({repoRoot:t.value});if(a(n))return n;let{modifier:o,inputString:r}=se().commandMeta,{dateInput:s,durationInput:d}=Jr(o,r);if(Pn(),g().syncStatus.status==="syncing")return i("Cannot replay while syncing, try again in a moment");let l=Sn(s);if(!l)return i("Invalid replay date");let u=d?Xr(d):15e3;if(u===null)return i("Invalid replay duration (try e.g. 30s or 2m)");let m=l.getTime(),p=g(),f=Rs({boardId:e.value.id,targetTime:m,stateBranchRoot:n.value,selectedIndex:-1});if(a(f))return f;let{unappliedEvents:I}=f.value;return I.length===0?(Ot(),E(p),c("Nothing to replay from that point",!0)):($u({events:I,startTime:m,durationMs:u}),c("Replaying board history",!0))}});import ny from"zod";var qu,Vu=y(()=>{"use strict";Tn();de();A();Ie();Oe();M();qu=()=>{let e=se().commandMeta.inputString,t=ny.coerce.number().int().min(3e3).safeParse(e);if(!t.success)return i("Auto sync duration must be a number of at least 3000 ms");let n=nt({autoSyncDebounceMs:t.data});return a(n)?n:(Ze({autoSyncIntervalMs:t.data}),E({mode:h.DEFAULT}),c(`Auto sync interval set to ${t.data}ms`,null))}});var Ku,zu=y(()=>{"use strict";Mo();Tn();de();A();Ie();Oe();M();Ku=()=>{let e=se().commandMeta.inputString.trim();if(e!=="on"&&e!=="off")return i("Invalid response");let t=Cc(e),n=nt({autoSync:t});return a(n)?n:(Ze({autoSync:t}),E({mode:h.DEFAULT}),c(`Auto sync set to "${e}"`,null))}});var Yu,Xu=y(()=>{"use strict";Tn();de();A();Ie();Oe();M();Yu=()=>{let e=se().commandMeta.inputString.trim();if(!["debug","error","info"].includes(e))return i("Invalid response");let n=nt({logLevel:e});return a(n)?n:(Ze({logLevel:e}),E({mode:h.DEFAULT}),c(`Auto sync set to "${e}"`,null))}});import{spawn as oy}from"node:child_process";var ry,Ju,Qu=y(()=>{"use strict";A();ry=()=>{switch(process.platform){case"darwin":return{command:"pbcopy",args:[]};case"win32":return{command:"clip",args:[]};default:return process.env.WAYLAND_DISPLAY?{command:"wl-copy",args:[]}:{command:"xclip",args:["-selection","clipboard"]}}},Ju=async e=>new Promise(t=>{let{command:n,args:o}=ry();try{let r=oy(n,o,{stdio:["pipe","ignore","ignore"]});r.on("error",()=>t(i(`Clipboard tool not available (${n})`))),r.on("close",s=>t(s===0?c("Copied to clipboard",null):i(`Clipboard tool failed (${n})`))),r.stdin.on("error",()=>{}),r.stdin.write(e),r.stdin.end()}catch{t(i(`Clipboard tool not available (${n})`))}})});var er,Zu,em=y(()=>{"use strict";A();M();Qu();qt();ko();Qt();er=async(e,t)=>{if(!e.trim())return i(`Nothing to copy: ${t} is empty`);let n=await Ju(e);return a(n)?n:c(`Copied ${t} to clipboard`,null)},Zu=async e=>{let{breadCrumb:t,selectedNode:n}=g(),o=Po({breadCrumb:t,selectedNode:n}),r=o??n;if(!r)return i("Nothing selected to copy from");switch(e.modifier){case Ee.REF:return er(V(r.id),"ref");case Ee.TITLE:return er(r.title,"title");case Ee.DESCRIPTION:return o?er(o.props?.description??"","description"):i("No issue in scope");case Ee.TAGS:{if(!o)return i("No issue in scope");let s=Xt(o).map(({name:d})=>d);return er(s.join(", "),"tags")}case Ee.ASSIGNEES:{if(!o)return i("No issue in scope");let s=Jt(o).map(({name:d})=>d);return er(s.join(", "),"assignees")}default:return i("Yank one of: ref, title, description, tags, assignees")}}});var tm,nm=y(()=>{"use strict";vi();de();A();Ie();M();tm=async()=>{G(""),E({mode:h.DEFAULT});let e=$e();if(a(e))return i(e.message);if(e.value.syncStatus.status==="syncing")return i("Sync already in progress");E({syncStatus:{msg:"Syncing",status:"syncing"}});let t=await Hr();return a(t)?(E({syncStatus:{msg:t.message,status:"failed"}}),t):(E({mode:h.DEFAULT,syncStatus:{msg:"Synced",status:"synced"}}),t)}});import{ulid as Fe}from"ulid";var sy,om,_t,rm,sm=y(()=>{"use strict";ge();mu();Xe();Cr();Tn();In();ut();ia();Un();de();gt();pe();A();ge();ht();Ie();Oe();M();bs();le();da();Nn();Ui();Qt();$o();bu();Nu();ku();Pu();_u();Hu();Gu();Vu();ki();zu();Xu();em();nm();sy=e=>e.action==="add.issue.comment",om=()=>{let{eventLog:e=[],contributors:t}=g(),n=new Map,o=new Set;for(let r of e)r.userId&&(n.set(r.userId,r.userName??""),o.add(r.userId));for(let r of Object.values(t))n.set(r.id,r.name);return[...n.entries()].map(([r,s])=>({id:r,name:s,isExternal:!o.has(r)}))},_t=async()=>{let e=await yt();return a(e)?e:c("Resolved persist root",e.value)},rm=[{systemOnly:!0,intent:D.Move,description:"Internal move-state command",mode:h.COMMAND_LINE,action:Mu},{intent:D.Delete,description:"Delete the currently selected node",mode:h.COMMAND_LINE,action:async()=>{let e=fe();if(a(e))return i("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=g(),o=re(t.id)[n];if(!o)return i("Unable to resolve child to delete");let r=await _t();if(a(r))return r;if(o.context==="COMMENT"){let s=o.id,d=k(t)?t.id:t.parentNodeId;if(!d)return i("Unable to resolve comment issue");let l=g().nodes[d];if(!l||!k(l))return i("Unable to resolve comment issue");let u=l.log?.filter(sy).find(m=>m.payload.id===s);return u?u.payload.author!==e.value.userId?i("You can only delete your own comments"):B([{id:Fe(),action:"delete.issue.comment",payload:{id:s,issue:d},...e.value}],r.value):i("Unable to resolve comment")}return B([{id:Fe(),action:"delete.node",payload:{id:o.id},...e.value}],r.value)},onSuccess:()=>E({mode:h.DEFAULT})},{intent:D.Filter,description:"Filter the board, for example `:filter tag urgent`",mode:h.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=se().commandMeta,n=/(!=|=)/,[o]=e.split(n);if(!o||!(d=>xe(v.FILTER).map(l=>l.split(n)[0]).includes(d))(o))return i("Invalid filter modifier");let s={target:o,operator:"=",value:t.trim()};return oe(d=>({...d,filters:e==="clear"?[]:[...d.filters,s],mode:h.DEFAULT})),c("Filter updated",null)}},{intent:D.ViewHelp,description:"Open the help screen",mode:h.COMMAND_LINE,action:()=>{let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:o}=g();return on({pendingNavTarget:{contextNode:e,breadCrumb:o,selectedIndex:t,selectedNode:n}}),E({mode:h.HELP}),c("Viewing help",null)}},{intent:D.CloseIssue,description:"Move the selected issue to the closed swimlane",mode:h.COMMAND_LINE,action:async()=>{let e=fe();if(a(e))return i("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=g(),o=re(t.id)[n];if(!o)return i("Unable to close issue, no target found");if(!k(o))return i("Cannot close in this context");let r=g().nodes[be];if(!r)return i("Unable to locate closed swimlane");if(o.parentNodeId===r.id)return i("Issue is already closed");let s=await _t();if(a(s))return s;let d=s.value,l=zt(r.id,o.id,{at:"end"},e.value,d);if(a(l))return l;let u=B([{id:Fe(),action:"close.issue",payload:{id:o.id,parent:r.id,rank:l.value},...e.value}],d);return a(u)?u:c("Issue closed",null)},onSuccess:()=>E({mode:h.DEFAULT})},{intent:D.ReopenIssue,description:"Move a closed issue back to its previous swimlane",mode:h.COMMAND_LINE,action:async()=>{let e=fe();if(a(e))return i("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=g(),o=re(t.id)[n];if(!o)return i("Unable to reopen issue, no target found");let r=o.context==="TICKET"?c("Resolved ticket",o):Dn(o.id,"TICKET");if(a(r))return i("Cannot reopen in this context");let s=r.value,d=g().nodes[be];if(!d)return i("Unable to locate closed swimlane");if(s.parentNodeId!==d.id)return i("Issue is not closed");if(!k(s))return i("Target node is not issue");let l=ys(s);if(!l)return i("Unable to resolve previous parent from issue history");if(l===d.id)return i("Previous parent resolves to closed swimlane");let u=g().nodes[l];if(!u)return i("Previous parent no longer exists");let m=await _t();if(a(m))return m;let p=m.value,f=zt(u.id,s.id,{at:"end"},e.value,p);if(a(f))return f;let I=B([{id:Fe(),action:"reopen.issue",payload:{id:s.id,parent:u.id,rank:f.value},...e.value}],p);return a(I)?I:c("Issue reopened",null)},onSuccess:()=>E({mode:h.DEFAULT})},{intent:D.Init,description:"Initialize Epiq in the current git repository",mode:h.COMMAND_LINE,action:Ru},{intent:D.OpenProject,description:"Open a recently used epiq project, by number or path",mode:h.COMMAND_LINE,action:Ou,onSuccess:()=>E({mode:h.DEFAULT})},{intent:D.NewItem,description:"Create a new board, swimlane, or issue",mode:h.COMMAND_LINE,action:Lu,onSuccess:()=>E({mode:h.DEFAULT})},{intent:D.Rename,description:"Rename the currently selected node",mode:h.COMMAND_LINE,action:async()=>{let e=fe();if(a(e))return i("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=g(),o=re(t.id)[n];if(!o)return i("Missing node");if(o.readonly)return i("Cannot rename readonly node");let r=ds();if(!r)return i("Provide a title");let s=await _t();return a(s)?s:B([{id:Fe(),action:"edit.title",payload:{id:o.id,name:r},...e.value}],s.value)},onSuccess:()=>E({mode:h.DEFAULT})},{intent:D.UntagTicket,description:"Remove a tag from the selected issue",mode:h.COMMAND_LINE,action:async()=>{let e=fe();if(a(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=se().commandMeta,o=(t||n).trim();if(!o)return i("Provide a tag");let r=x.findTagByName(o);if(!r)return i(`Tag "${o}" does not exist`);let{selectedNode:s}=g();if(!s)return i("Invalid untag target");let d=Dn(s.id,"TICKET");if(a(d))return i("Unable to untag issue in this context");let l=d.value;if(!k(l))return i("Target node is not issue");if(!(l.props.tags??[]).includes(r.id))return i("Issue is not tagged with that tag");let m=await _t();return a(m)?m:B([{id:Fe(),action:"remove.issue.tag",payload:{id:l.id,tag:r.id},...e.value}],m.value)},onSuccess:()=>E({mode:h.DEFAULT})},{intent:D.TagTicket,description:"Add or create a tag on the selected issue",mode:h.COMMAND_LINE,action:async()=>{let e=fe();if(a(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=se().commandMeta,o=(t||n).trim();if(!o)return i("Provide a tag");let{selectedNode:r}=g();if(!r)return i("Invalid tag target");let s=Dn(r.id,"TICKET");if(a(s))return i("Unable to tag issue in this context");let d=s.value;if(!k(d))return i("Target node is not issue");let l=await _t();if(a(l))return l;let u=x.findTagByName(o),m=u?.id??Fe();return(d.props.tags??[]).includes(m)?i("Already tagged with that tag"):B([...u?[]:[{id:Fe(),action:"create.tag",payload:{id:m,name:o},...e.value}],{id:Fe(),action:"add.issue.tag",payload:{id:d.id,tag:m},...e.value}],l.value)},onSuccess:()=>E({mode:h.DEFAULT})},{intent:D.AssignUserToTicket,description:"Assign a user to the selected issue",mode:h.COMMAND_LINE,action:async()=>{let e=fe();if(a(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=se().commandMeta,o=(t||n).trim();if(!o)return i("Provide an assignee");let r=o.startsWith("!"),s=(r?o.slice(1):o).trim();if(!s)return i("Provide an assignee");let{selectedIndex:d,contextNode:l}=g(),u=re(l.id)[d];if(!u)return i("Invalid assign target");let m=Dn(u.id,"TICKET");if(a(m))return i("Unable to assign issue in this context");let p=m.value;if(!k(p))return i("Target node is not issue");let f=await _t();if(a(f))return f;let I=om(),N=!r&&s.toLowerCase()==="me",T,C;if(N)T=e.value.userId,C=I.find(_=>_.id===T)?.name??e.value.userName;else{let _=I.filter(ve=>ve.name===s);if(_.length>1)return i(`"${s}" matches ${_.length} contributors (${_.map(ve=>ve.id).join(", ")}). Assign from the GUI to choose by id.`);let Z=_[0];if(!Z&&!r)return i(`No contributor named "${s}". Use "!${s}" to add them as an external assignee.`);T=Z?.id??Fe(),C=Z?.name??s}if((p.props.assignees??[]).includes(T))return i("Assignee already assigned");let $=!!g().contributors[T];return B([...$?[]:[{id:Fe(),action:"create.contributor",payload:{id:T,name:C},...e.value}],{id:Fe(),action:"add.issue.assignee",payload:{id:p.id,assignee:T},...e.value}],f.value)},onSuccess:()=>E({mode:h.DEFAULT})},{intent:D.UnassignUserFromTicket,description:"Remove an assignee from the selected issue",mode:h.COMMAND_LINE,action:async()=>{let e=fe();if(a(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=se().commandMeta,o=(t||n).trim();if(!o)return i("Provide an assignee to remove");let{selectedNode:r}=g();if(!r)return i("Invalid unassign target");let s=Dn(r.id,"TICKET");if(a(s))return i("Unable to unassign in this context");let d=s.value;if(!k(d))return i("Target node is not issue");let l=d.props.assignees??[],u=o.toLowerCase()==="me",m=u?l.filter(I=>I===e.value.userId):om().filter(I=>I.name===o&&l.includes(I.id)).map(I=>I.id);if(m.length>1)return i(`"${o}" matches ${m.length} assignees (${m.join(", ")}). Unassign from the GUI to choose by id.`);let p=m[0];if(!p)return i(u?"Issue is not assigned to you":`Issue is not assigned to "${o}"`);let f=await _t();return a(f)?f:B([{id:Fe(),action:"remove.issue.assignee",payload:{id:d.id,assignee:p},...e.value}],f.value)},onSuccess:()=>E({mode:h.DEFAULT})},{intent:D.Comment,description:"Add a comment to the selected issue",mode:h.COMMAND_LINE,action:async(e,t)=>{let n=t.inputString.trim();if(!n)return i("Provide a comment");if(n.length>4e3)return i(`Cannot exceed ${4e3} characters`);let o=fe();if(a(o))return i("Unable to resolve user ID");let{breadCrumb:r,selectedNode:s}=g(),d=qe([...r,s],"TICKET");if(a(d))return i("Edit target must be an issue");let l=d.value;if(!l)return i("Invalid comment target");let u=l.context==="TICKET"?c("Resolved ticket",l):Dn(l.id,"TICKET");if(a(u))return i("Unable to comment on issue in this context");let m=u.value;if(!k(m))return i("Target node is not issue");let p=await _t();return a(p)?p:B([{id:Fe(),action:"add.issue.comment",payload:{id:Fe(),issue:m.id,author:o.value.userId,md:n},...o.value}],p.value)},onSuccess:()=>E({mode:h.DEFAULT})},{intent:D.Sync,description:"Pull, commit, and push Epiq state",mode:h.COMMAND_LINE,action:tm},{intent:D.Peek,description:"View board state at another point in time",mode:h.COMMAND_LINE,action:ju},{intent:D.Replay,description:"Replay board history forward from a point in time",mode:h.COMMAND_LINE,action:Wu},{intent:D.Export,description:"Export the current board layout to markdown",mode:h.COMMAND_LINE,action:async()=>{let e=await uu();return a(e)?e:(E({mode:h.DEFAULT}),c("Export successful",!0))}},{intent:D.Exit,description:"Exit the application",mode:h.COMMAND_LINE,action:async()=>(O.exit(),c("Exit successful",!0))},{intent:D.Edit,description:"Edit title or description",mode:h.COMMAND_LINE,action:async(e,t)=>yu(t),onSuccess:()=>E({mode:h.DEFAULT})},{intent:D.Yank,description:"Yank (copy) ref, title, description, tags, or assignees to the clipboard",mode:h.COMMAND_LINE,action:async(e,t)=>Zu(t),onSuccess:()=>E({mode:h.DEFAULT})},{intent:D.Config,description:"Update editor, username, view, autosync, or sync debounce",mode:h.COMMAND_LINE,action:(e,t)=>{let n=t.inputString.trim();switch(t.modifier){case ue.USERNAME:{if(process.env[$n])return i(`Cannot change the configured user while ${$n} names this process`);let o=ts();if(a(o))return o;let{userId:r,preferredEditor:s,userName:d}=o.value,l=n||d,u=r||Fe();if(!l||!u)return i("Unable to resolve user name or id");let m=nt({userName:l,userId:u,preferredEditor:s??""});return a(m)?m:(Ze({userName:l,userId:u}),E({mode:h.DEFAULT}),c(`Username set to "${l}"`,null))}case ue.EDITOR:{if(!n)return i("No editor provided");let o=nt({preferredEditor:n});return a(o)?o:(Ze({preferredEditor:n}),E({mode:h.DEFAULT}),c(`Editor configuration set to "${n}"`,null))}case ue.VIEW:{if(n!=="wide"&&n!=="dense")return i("Invalid view mode");let o=nt({viewMode:n});return a(o)?o:(Ze({viewMode:n}),E({mode:h.DEFAULT}),c(`View set to "${n}"`,null))}case ue.AUTOSYNC:return Ku();case ue.LOG_LEVEL:return Yu();case ue.SYNC_DEBOUNCE_MS:return qu();case ue.ATTACHMENT_MAX_KB:return Wc();default:return i("Unknown config command")}}},{intent:D.Coffee,description:"Sponsor the development of Epiq!",mode:h.COMMAND_LINE,action:()=>{let e=se().commandMeta.modifier;return e==="custom"?Jo("https://github.com/sponsors/ljtn?frequency=one-time&sponsor=ljtn"):Jo(`https://github.com/sponsors/ljtn/sponsorships?sponsor=ljtn&preview=true&frequency=one-time&amount=${e}`),G(""),c("Thanks you!",null)}}]});var iy,St,xa=y(()=>{"use strict";Wr();rs();Ui();sm();A();Ie();Oe();M();iy=new Set(["peek","replay","filter","view-help","yank"]),St=async({isForceExecutedBySystem:e=!1}={})=>{let{commandMeta:{command:t,validity:n,modifier:o,inputString:r}}=se();if(!t)return i("No command to confirm");if(!e&&n===Zt.Invalid)return i("Invalid command");let s=bl(t);fl();let{readOnly:d}=g();if(d&&!iy.has(s))return jo({status:jt.Fail,message:"Command not available in readonly state",value:null});let l=rm.filter(m=>e||m.systemOnly!==!0).find(m=>m.intent===s);if(!l)return jo({status:jt.Fail,message:"Command not found",value:null});let u;try{u=await l.action(l,{command:t,inputString:r,modifier:o})}catch(m){return jo({status:jt.Fail,message:m instanceof Error?m.message:"Command failed",value:null})}return a(u)?jo(u):(hl({addToHistory:!e}),l.onSuccess?.(),ye().autoSync&&vc(),u)}});var Cs,As,im,am=y(()=>{"use strict";A();de();M();un();xa();fa();Ie();Cs=[{intent:L.Exit,mode:h.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(E({mode:h.COMMAND_LINE}),G("move cancel"),St({isForceExecutedBySystem:!0}))},{intent:L.InitMove,mode:h.DEFAULT,description:"[m] move (init/confirm)",action:()=>(E({mode:h.COMMAND_LINE}),G("move start"),St({isForceExecutedBySystem:!0}))},{intent:L.ConfirmMove,mode:h.MOVE,action:()=>(E({mode:h.COMMAND_LINE}),G("move confirm"),St({isForceExecutedBySystem:!0}))}],As=[{intent:L.MovePreviousItem,mode:h.MOVE,action:()=>rn()?(E({mode:h.COMMAND_LINE}),G("move previous"),St({isForceExecutedBySystem:!0})):i("No pending move")},{intent:L.MoveNextItem,mode:h.MOVE,action:()=>rn()?(E({mode:h.COMMAND_LINE}),G("move next"),St({isForceExecutedBySystem:!0})):i("No pending move")}],im=[{intent:L.MoveToNextContainer,mode:h.MOVE,action:()=>rn()?(E({mode:h.COMMAND_LINE}),G("move to-next"),St({isForceExecutedBySystem:!0})):i("No pending move")},{intent:L.MoveToPreviousContainer,mode:h.MOVE,action:()=>rn()?(E({mode:h.COMMAND_LINE}),G("move to-previous"),St({isForceExecutedBySystem:!0})):i("No pending move")}]});var dm,cm=y(()=>{"use strict";pe();am();dm={[F.WORKSPACE]:[...Cs,...As],[F.BOARD]:[...Cs,...As],[F.SWIMLANE]:[...Cs,...As,...im],[F.TICKET]:[],[F.FIELD]:[],[F.FIELD_LIST]:[],[F.TEXT]:[],[F.COMMENT]:[]}});import ay from"node:fs";import dy from"node:path";var lm,um=y(()=>{"use strict";ct();Bo();A();le();da();lm=e=>{let t=ze(process.cwd());if(a(t))return i("Unable to resolve project root");let n=Ne({repoRoot:t.value});if(a(n))return i(n.message);let o=Mi(e.hash,e.ext),r=dy.join(Ks(n.value),o);return ay.existsSync(r)?(Jo(r),c(`Opened ${e.name}`,null)):i("Attachment file not found \u2014 run :sync to fetch it")}});var mm,pm,gm=y(()=>{"use strict";de();A();Ie();M();bs();un();Xe();mm=()=>{G("");let{pendingNavTarget:e}=to();E({mode:h.DEFAULT}),e&&O.navigate(e),on({pendingNavTarget:void 0})},pm=[{intent:L.ExitCommandLine,mode:h.HELP,action:()=>(mm(),c("Exiting help",null))},{intent:L.Exit,mode:h.HELP,action:()=>(mm(),c("Closed help",null))},{intent:L.NavPreviousItem,mode:h.HELP,description:"[arrows/hjkl] navigate",action:()=>(O.navigateToPreviousItem(),c("Navigating to previous help item",null))},{intent:L.NavNextItem,mode:h.HELP,action:()=>(O.navigateToNextItem(),c("Navigating to next help item",null))},{intent:L.NavToPreviousContainer,mode:h.HELP,action:()=>(O.navigateToPreviousContainer(),c("Navigating to previous help container",null))},{intent:L.NavToNextContainer,mode:h.HELP,action:()=>(O.navigateToNextContainer(),c("Navigating to next help container",null))}]});var cy,fm,hm,vm=y(()=>{"use strict";de();pe();A();Ie();M();bs();un();Xe();cy=e=>{E({mode:h.COMMAND_LINE});let{pendingNavTarget:t}=to();t&&O.navigate(t),on({pendingNavTarget:void 0}),G(`${e} `)},fm=()=>{G("");let{pendingNavTarget:e}=to();e&&O.navigate(e),on({pendingNavTarget:void 0}),E({mode:h.DEFAULT})},hm=[{intent:L.InitCommandPalette,mode:h.DEFAULT,description:"[?] view command palette (explore descriptions for every command)",action:()=>{G("");let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:o}=g();return on({pendingNavTarget:{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:o}}),E({mode:h.PALETTE}),c("Opening command palette",null)}},{intent:L.Confirm,mode:h.PALETTE,action:()=>{let{selectedNode:e}=g();if(!e||!Da(e))return i("Command only applicable on text nodes");if(e.props.disabled)return i("Command is not available in this context");let t=e.title;return t?(cy(t),c("Selected command",t)):c("No command selected",null)}},{intent:L.ExitCommandLine,mode:h.PALETTE,action:()=>(fm(),c("Exiting palette",null))},{intent:L.Exit,mode:h.PALETTE,action:()=>(fm(),c("Closed command palette",null))},{intent:L.NavPreviousItem,mode:h.PALETTE,description:"[arrows/hjkl] navigate",action:()=>(O.navigateToPreviousItem(),c("Navigating to previous item",null))},{intent:L.NavNextItem,mode:h.PALETTE,action:()=>(O.navigateToNextItem(),c("Navigating to next item",null))},{intent:L.NavToPreviousContainer,mode:h.PALETTE,action:()=>(O.navigateToPreviousContainer(),c("Navigating to previous container",null))},{intent:L.NavToNextContainer,mode:h.PALETTE,action:()=>(O.navigateToNextContainer(),c("Navigating to next container",null))}]});var ym,bm=y(()=>{"use strict";Nn();Qt();de();A();_n();ge();ht();Ie();M();um();un();gm();vm();Xe();ym=[...pm,...hm,{intent:L.AddItem,mode:h.DEFAULT,description:"[n] new...",action:()=>(E({mode:h.COMMAND_LINE}),G(`${v.NEW} `),c("Adding new item",null))},{intent:L.Delete,mode:h.DEFAULT,description:"[d] delete",action:()=>(E({mode:h.COMMAND_LINE}),G(`${v.DELETE} `),c("Deleting item",null))},{intent:L.InitCommandLine,mode:h.DEFAULT,description:"[:] focus command line",action:()=>(E({mode:h.COMMAND_LINE}),G(""),c("Entering command line mode",null))},{intent:L.Confirm,mode:h.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>{let{selectedNode:e,contextNode:t}=g();if(!ce(e?.id??"")?.length){let o=e?x.getAttachment(e.id):void 0;if(o)return lm(o);if(e?.title===ne.DESCRIPTION)return E({mode:h.COMMAND_LINE}),G(`${v.EDIT} description `),c("Propose command",!0);if(e?.title===ne.ASSIGNEES)return E({mode:h.COMMAND_LINE}),G(`${v.ASSIGN} `),c("Propose command",!0);if(e?.title===ne.TAGS)return E({mode:h.COMMAND_LINE}),G(`${v.TAG} `),c("Propose command",!0);if(t.title===ne.DESCRIPTION&&e?.context==="TEXT")return E({mode:h.COMMAND_LINE}),G(`${v.EDIT} description `),c("Propose command",!0)}return O.enterChildNode(),c("Entering context",null)}},{intent:L.Yank,mode:h.DEFAULT,description:"[y] yank to clipboard",action:()=>{let{selectedNode:e}=g(),t=e?.title===ne.DESCRIPTION?Ee.DESCRIPTION:e?.title===ne.TAGS?Ee.TAGS:e?.title===ne.ASSIGNEES?Ee.ASSIGNEES:Ee.REF,o=xe(v.YANK).includes(t)?t:Ee.REF;return E({mode:h.COMMAND_LINE}),G(`${v.YANK} ${o}`),c("Propose command",!0)}},{intent:L.EditTitle,mode:h.DEFAULT,description:"[r] rename title",action:()=>(E({mode:h.COMMAND_LINE}),G(`${v.EDIT} title ${g().selectedNode?.title}`),c("Exiting context",null))},{intent:L.EditDescription,mode:h.DEFAULT,description:"[e] edit description",action:()=>(E({mode:h.COMMAND_LINE}),G(`${v.EDIT} description `),c("Exiting context",null))},{intent:L.Exit,mode:h.DEFAULT,description:"[q] exit context",action:()=>(O.enterParentNode(),c("Exiting context",null))},{intent:L.NavPreviousItem,mode:h.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(O.navigateToPreviousItem(),c("Navigating to previous item",null))},{intent:L.NavNextItem,mode:h.DEFAULT,action:()=>(O.navigateToNextItem(),c("Navigating to next item",null))},{intent:L.NavToPreviousContainer,mode:h.DEFAULT,action:()=>(O.navigateToPreviousContainer(),c("Navigating to previous container",null))},{intent:L.NavToNextContainer,mode:h.DEFAULT,action:()=>(O.navigateToNextContainer(),c("Navigating to next container",null))}]});var ly,uy,xm,Im=y(()=>{"use strict";Ie();ly=500,uy=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),xm=e=>{let t=uy(e);t&&as(n=>(n+t).slice(0,ly))}});var my,py,Em,Rm=y(()=>{"use strict";Im();de();A();Ie();M();un();xa();my=[h.COMMAND_LINE,h.PALETTE],py=e=>[{intent:L.MoveCursorLeft,mode:e,action:()=>(Oi(-1),c("Moving cursor left",null))},{intent:L.MoveCursorRight,mode:e,action:()=>(Oi(1),c("Moving cursor right",null))},{intent:L.MoveCursorLeftOfWord,mode:e,action:()=>(_i("left"),c("Moving cursor left of word",null))},{intent:L.MoveCursorRightOfWord,mode:e,action:()=>(_i("right"),c("Moving cursor right of word",null))},{intent:L.AutoCompleteCommand,mode:e,action:()=>(as((t,{remainder:n})=>{let o=n?t+n:t,r="";return o==="edit title "&&(r=g().selectedNode?.title??""),o+r}),c("Auto-completing command",null))},{intent:L.CaptureInput,mode:e,action:(t,{sequence:n})=>(xm(n??""),c("Capturing input",null))},{intent:L.EraseInput,mode:e,action:()=>(pl(),c("Erasing input",null))},{intent:L.EraseInputWord,mode:e,action:()=>(gl(),c("Erasing input word",null))}],Em=[{intent:L.Confirm,mode:h.COMMAND_LINE,action:()=>(St(),c("Executing command",null))},{intent:L.ViewHelp,mode:h.DEFAULT,action:()=>(E({mode:h.HELP}),c("Viewing help",null))},...my.flatMap(py),{intent:L.ExitCommandLine,mode:h.COMMAND_LINE,action:()=>(E({mode:h.DEFAULT}),c("Exiting command line",null))},{intent:L.GetLastCommandFromHistory,mode:h.COMMAND_LINE,action:()=>(vl(),c("Getting last command from history",null))},{intent:L.GetNextCommandFromHistory,mode:h.COMMAND_LINE,action:()=>(yl(),c("Getting next command from history",null))}]});import Cm from"chalk";var Ts,Nm,Sm,Ia,Am=y(()=>{"use strict";de();pe();Le();Ts=Cm.dim.hex(S.secondary2)(": for command line"),Nm="q to exit",Sm=`${Cm.hex(S.accent)("m")} to confirm`,Ia={[F.WORKSPACE]:[Ts],[F.BOARD]:[Ts],[F.BOARD+h.COMMAND_LINE]:[Ts],[F.SWIMLANE]:[Ts],[F.TICKET+h.HELP]:[Nm],[F.SWIMLANE+h.HELP]:[Nm],[F.TICKET]:[],[F.FIELD]:[],[F.SWIMLANE+h.MOVE]:[Sm],[F.TICKET+h.MOVE]:[Sm]}});var no,Ea,Tm=y(()=>{"use strict";qt();no=e=>e.trim().toLocaleLowerCase(),Ea=(e,t)=>no(e).includes(no(t))});var gy,fy,wm,Mm=y(()=>{"use strict";M();qt();Tm();gy=e=>{let{tags:t}=g();return(e.props.tags??[]).map(n=>t[n]).filter(n=>n!==void 0&&!n.tombstoned).map(n=>n.name)},fy=e=>{let{contributors:t}=g();return(e.props.assignees??[]).map(n=>{let o=t[n];return o?o.name:void 0}).filter(n=>!!n)},wm=(e,t)=>{let n=no(t.value);if(!n)return!0;switch(t.target){case"title":return Ea(e.title??"",n);case"description":return Ea(e.props.description??"",n);case"tag":return gy(e).map(no).some(r=>r.includes(n));case"assignee":return fy(e).map(no).some(r=>r.includes(n));case"ref":return vo(e.id,t.value);default:return!0}}});function km(e,t,n){let o=t[e];if(!o)return i("buildBreadCrumb(): current node not found");let r=[],s=o;for(;s&&(r.push(s),!(s.id===n||!s.parentNodeId));)s=t[s.parentNodeId];let d=r[r.length-1];return!d||d.id!==n?i("buildBreadCrumb(): node is not connected to root"):(r.reverse(),c("Breadcrumb built",r))}var Lm=y(()=>{"use strict";A()});var Pm,Dm=y(()=>{"use strict";Pm=e=>{let t={};for(let n of e)n.intent&&(t[n.mode]||(t[n.mode]={}),t[n.mode][n.intent]=n);return t}});import{useSyncExternalStore as hy}from"react";function Ca(e){let{contextNodeId:t,mode:n,rootNodeId:o,nodes:r,filters:s}=e;if(!t)return i("derive(): contextNodeId is missing");if(!o)return i("derive(): rootNode is missing");if(!r[o])return i("derive(): unable to find root node");let l=r[t];if(!l)return i("Unable to derive state, contextNode not found");let u=km(t,r,o);if(a(u))return logger.error(u.message),u;let m=u.value,{context:p}=l,f=Ia[p+n]??Ia[p]??[],I=[...ym,...dm[p]??[],...Em],N=Pm(I),T=yy(r,s),C=T[t]?.[e.selectedIndex]??null;return c("Derived successfully",{...e,contextNode:l,breadCrumb:m,availableHints:f,availableActions:I,actionIndex:N,selectedNode:C,renderedChildrenIndex:T})}function bo(e){Ra=e;let t=ze(process.cwd()),n=!1;if(!a(t)){let s=At(t.value);if(a(s))return i(s.message);n=!0}let o={readOnly:!1,filters:[],tags:{},contributors:{},mode:h.DEFAULT,nodes:{[e.id]:e},rootNodeId:e.id,contextNodeId:e.id,renderedChildrenIndex:{},selectedIndex:-1,syncStatus:{status:"synced",msg:""},eventLog:[],unappliedEvents:[],replay:null,timeMode:"live",hasProjectDefinition:n,hasInitializingEvents:!1,comments:{},attachments:{}},r=Ca(o);return a(r)?r:(Ut=r.value,Sa(),c("State initialized",null))}function oe(e){let t=g(),n=e(t);if(tr)return ws=n,Ut={...t,...n},c("State updated",null);let o=Ca(n);return a(o)?i(o.message??"Unable to update state"):(Ut=o.value,Sa(),c("State updated",null))}function xd(e){if(tr)return c("Joined batch",e());tr=!0,ws=null;let t=()=>{let n=ws;if(tr=!1,ws=null,n===null)return null;let o=Ca(n);return a(o)?i(o.message??"Unable to update state"):(Ut=o.value,Sa(),c("State updated",null))};try{let n=e(),o=t();return o&&a(o)?i(o.message):c("State updated",n)}finally{tr&&t()}}var Ut,Ra,Na,Sa,vy,g,$e,tr,ws,E,Ge,yy,re,Ot,bt,M=y(()=>{"use strict";cm();bm();Rm();Am();Tt();de();pe();A();le();Mm();Lm();Dm();Na=new Set,Sa=()=>{for(let e of Na)e()},vy=e=>(Na.add(e),()=>Na.delete(e));g=()=>{if(!Ut)throw new Error("State not initialized. Call initWorkspaceState() first.");return Ut},$e=()=>Ut?c("Retrieved state",Ut):i("State not initialized. Call initWorkspaceState() first.");tr=!1,ws=null;E=e=>oe(t=>({...t,...e})),Ge=()=>hy(vy,g,g),yy=(e,t)=>{let n={};for(let o of Object.values(e))k(o)&&t.length>0&&!t.every(r=>wm(o,r))||!o.parentNodeId||o.isDeleted||((!o.parentNodeId||!n[o.parentNodeId])&&(n[o.parentNodeId]=[]),n[o.parentNodeId].push(o));for(let o of Object.keys(n))n[o].sort((r,s)=>{let d=e[r.id],l=e[s.id];return!d||!l?0:d.rank.localeCompare(l.rank)});return n},re=e=>g()?.renderedChildrenIndex[e]??[],Ot=()=>Ra?bo(Ra):i("Cannot reset state: no initial workspace found"),bt=()=>Ut!==void 0});var Dn,by,sn,x,ge=y(()=>{"use strict";gt();pe();A();M();ht();Dn=(e,t)=>{let{nodes:n}=g(),o=n[e];if(!o)return i("Node not found");if(o.context===t)return c("Resolved ancestor node",o);let r=o.parentNodeId?n[o.parentNodeId]:void 0;for(;r;){if(r.context===t)return c("Resolved ancestor node",r);r=r.parentNodeId?n[r.parentNodeId]:void 0}return i(`No ancestor found for context: ${t}`)},by=(e,t)=>{let{nodes:n}=g(),o=n[e];for(;o?.parentNodeId;){if(o.parentNodeId===t)return!0;o=n[o.parentNodeId]}return!1},sn=(e,t)=>e?e.readonly?i({move:"Cannot move readonly node",rename:"Cannot rename readonly node",edit:"Cannot edit readonly node",delete:"Cannot delete readonly node"}[t]):null:i("Node not found"),x={linkUserId({contributorId:e,userId:t}){let n=this.getContributor(e);if(!n)return i("Contributor not found");if(n.userId&&n.userId!==t)return i("Contributor is already linked to another user");let o={...n,userId:t},r=oe(s=>({...s,contributors:{...s.contributors,[e]:o}}));return a(r)?i("Unable to link contributor to user"):c("Linked contributor to user",o)},deleteNode(e){oe(t=>{let n={...t.nodes};return delete n[e],{...t,nodes:n}})},createComment(e){let t=this.getNode(e.issue);if(!t)return i("Unable to create comment, missing issue");if(!k(t))return i("Can only comment on issues");let n=oe(o=>({...o,comments:{...o.comments??{},[e.id]:{...e,deleted:!1}}}));return a(n)?i("Unable to create comment"):c("Created comment",{...e,deleted:!1})},editComment(e,t){let n=this.getComment(e);if(!n)return i("Unable to edit comment, missing comment");let o=this.getNode(n.issue);if(!o)return i("Unable to edit comment, missing issue");if(!k(o))return i("Can only edit issue comments");let r={...n,md:t,deleted:!1},s=oe(d=>({...d,comments:{...d.comments??{},[e]:r}}));return a(s)?i("Unable to edit comment"):c("Edited comment",r)},deleteComment(e){let t=this.getComment(e);if(!t)return i("Unable to delete comment, missing comment");let n={...t,deleted:!0},o=oe(r=>({...r,comments:{...r.comments??{},[e]:n}}));return a(o)?i("Unable to delete comment"):c("Deleted comment",n)},getComment(e){return g().comments?.[e]},getCommentsByIssue(e){return Object.values(g().comments??{}).filter(t=>t.issue===e&&!t.deleted)},createAttachment(e){let t=this.getNode(e.issue);if(!t)return i("Unable to create attachment, missing issue");if(!k(t))return i("Can only attach to issues");let n=oe(o=>({...o,attachments:{...o.attachments??{},[e.id]:{...e,deleted:!1}}}));return a(n)?i("Unable to create attachment"):c("Created attachment",{...e,deleted:!1})},deleteAttachment(e){let t=this.getAttachment(e);if(!t)return i("Unable to delete attachment, missing attachment");let n={...t,deleted:!0},o=oe(r=>({...r,attachments:{...r.attachments??{},[e]:n}}));return a(o)?i("Unable to delete attachment"):c("Deleted attachment",n)},getAttachment(e){return g().attachments?.[e]},getAttachmentsByIssue(e){return Object.values(g().attachments??{}).filter(t=>t.issue===e&&!t.deleted)},editValue(e,t){let{nodes:n}=g(),o=n[e];if(!o)return i("Edit target node not found");let r=sn(o,"edit");if(r)return r;let s={...o,props:{...o.props,description:t}};return this.updateNode(s),c("Issue description updated",{md:t})},renameNode(e,t){let n=this.getNode(e);if(!n)return i("Rename target node not found");let o=sn(n,"rename");if(o)return o;let r={...n,title:t};return this.updateNode(r),c("Renamed node",r)},getExistingTags(){let{tags:e}=g();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getExistingAssignees(){let{contributors:e}=g();return["me",...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getFieldByTitle(e,t){return ce(e).find(n=>n.title===t)},moveNodeToRank({id:e,parentId:t,rank:n}){let{rootNodeId:o}=g(),r=this.getNode(e),s=this.getNode(t);if(!r)return i("Node not found");if(!s)return i("Target parent not found");if(o===e)return i("Cannot move root node");if(e===t)return i("Cannot move node into itself");let d=sn(r,"move");if(d)return d;if(by(t,e))return i("Cannot move node into its own descendant");let l={...r,parentNodeId:t,rank:n};return this.updateNode(l),c("Moved node successfully",l)},tombstoneNode(e){let{nodes:t,contextNodeId:n,rootNodeId:o}=g(),r=this.getNode(e);if(!r)return i("Node not found");if(o===e)return i("Cannot delete root node");let s=sn(r,"delete");if(s)return s;let d=new Set,l=m=>{let p=t[m];if(!(!p||d.has(m))){d.add(m);for(let f of ce(p.id))l(f.id)}};l(e);let u={...structuredClone(t)};for(let m of d){if(!u[m])return i("Unable to locate node to delete");u[m]={...u[m],isDeleted:!0}}return n?(E({nodes:u}),c("Successfully tomb stoned",r)):i("Unable to delete undefined")},tombstoneContributor(e){let t=this.getContributor(e);if(!t)return i("Contributor not found");let n={...t,name:ir,tombstoned:!0},o=oe(r=>({...r,contributors:{...r.contributors,[e]:n}}));return a(o)?i("Unable to remove contributor"):c("Tombstoned contributor",n)},renameContributor(e,t){let n=this.getContributor(e);if(!n)return i("Contributor not found");if(n.tombstoned)return i("Cannot rename a removed contributor");let o={...n,name:t},r=oe(s=>({...s,contributors:{...s.contributors,[e]:o}}));return a(r)?i("Unable to rename contributor"):c("Renamed contributor",o)},restoreContributor(e,t){let n=this.getContributor(e);if(!n)return i("Contributor not found");let o={...n,name:t,tombstoned:!1},r=oe(s=>({...s,contributors:{...s.contributors,[e]:o}}));return a(r)?i("Unable to restore contributor"):c("Restored contributor",o)},createContributor(e){let t=oe(n=>({...n,contributors:{...n.contributors,[e.id]:e}}));return a(t)?i("Unable to create contributor"):c("Created contributor",e)},assign(e,t){let n=this.getContributor(t),o=this.getNode(e);if(!n)return i("Unable to assign contributor, missing contributor");if(!o)return i("Unable to assign contributor, missing target");let r=sn(o,"edit");if(r)return r;if(!k(o))return i("Target is not an issue");let s=o.props.assignees??[];if(s.includes(t))return i("Contributor already assigned");let d={...o,props:{...o.props,assignees:[...s,t]}};return this.updateNode(d),c("Assigned contributor",{assignee:t})},unassign(e,t){let n=this.getContributor(t),o=this.getNode(e);if(!n)return i("Unable to unassign, missing contributor");if(!o)return i("Unable to unassign, missing target");let r=sn(o,"edit");if(r)return r;if(!k(o))return i("Target is not an issue");let s=o.props.assignees??[];if(!s.includes(t))return c("Issue is not assigned to that contributor",{assignee:t});let d={...o,props:{...o.props,assignees:s.filter(l=>l!==t)}};return this.updateNode(d),c("Assignee removed",{assignee:t})},tag(e,t){let n=this.getTag(t),o=this.getNode(e);if(!n)return i("Unable to add tag, missing tag");if(!o)return i("Unable to add tag, missing target");let r=sn(o,"edit");if(r)return r;if(!k(o))return i("Target is not an issue");let s=o.props.tags??[];if(s.includes(t))return i("Tag already assigned");let d={...o,props:{...o.props,tags:[...s,t]}};return this.updateNode(d),c("Tag added",{tag:t})},untag(e,t){let n=this.getTagRecord(t),o=this.getNode(e);if(!n)return i("Unable to remove tag, missing tag");if(!o)return i("Unable to remove tag, missing target");let r=sn(o,"edit");if(r)return r;if(!k(o))return i("Target is not an issue");let s=o.props.tags??[];if(!s.includes(t))return c("Issue is not tagged with that tag",{tag:t});let d={...o,props:{...o.props,tags:s.filter(l=>l!==t)}};return this.updateNode(d),c("Tag removed",{tag:t})},tombstoneTag(e){let t=this.getTagRecord(e);if(!t)return i("Tag not found");let n={...t,tombstoned:!0},o=oe(r=>({...r,tags:{...r.tags,[e]:n}}));return a(o)?i("Unable to delete tag"):c("Tombstoned tag",n)},restoreTag(e,t){let n=this.getTagRecord(e);if(!n)return i("Tag not found");let o={...n,name:t,tombstoned:!1},r=oe(s=>({...s,tags:{...s.tags,[e]:o}}));return a(r)?i("Unable to restore tag"):c("Restored tag",o)},createTag(e){let t=oe(n=>({...n,tags:{...n.tags,[e.id]:e}}));return a(t)?i("Could not create tag"):c("Tag created",e)},createNode(e){let t=oe(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return a(t)?i("Unable to create node"):c("Node created",e)},lockNode(e){let t=this.getNode(e);if(!t)return i("Failed to locate node");let n={...t,readonly:!0},o=oe(r=>({...r,nodes:{...r.nodes,[e]:n}}));return a(o)?i(o.message):c("Locked node",n)},updateNode(e){let t=oe(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return a(t)?t:c("Updated node",e)},getContributor(e){return g().contributors[e]},getTag(e){let t=g().tags[e];return t?.tombstoned?void 0:t},getTagRecord(e){return g().tags[e]},getTags(){return Object.values(g().tags).filter(e=>!e.tombstoned)},findTagByName(e){return this.getTags().find(t=>t.name===e)},getNode(e){return g().nodes[e]},getSiblings(e){return ce(e)}}});import an from"chalk";import Fm from"string-width";import{decodeTime as xy}from"ulid";var Iy,Ey,Aa,Ry,Ny,Bm,Om,Sy,Cy,Ay,Ty,wy,ba,_m,Zo=y(()=>{"use strict";ge();M();Et();fs();Iy=(e,t)=>e+" ".repeat(Math.max(0,t-Fm(e))),Ey=(e,t)=>" ".repeat(Math.max(0,t-Fm(e)))+e,Aa=e=>({"add.issue":"Created with title","add.issue.assignee":"Assigned to","remove.issue.assignee":"Unassigned from","close.issue":"Closed","delete.node":"Deleted","edit.title":"Changed title to","edit.description":"Changed description","reopen.issue":"Reopened","add.issue.tag":"Tagged with","remove.issue.tag":"Removed tag","lock.node":"Locked node","move.node":"Moved issue","add.issue.comment":"Commented","delete.issue.comment":"Deleted comment","add.issue.attachment":"Attached","delete.issue.attachment":"Removed attachment","edit.issue.comment":"Edited comment","init.workspace":"Created workspace","add.workspace":"Created workspace","add.board":"Created board","add.swimlane":"Created swimlane","add.field":"Added field","create.tag":"Created tag","tombstone.tag":"Deleted tag","restore.tag":"Restored tag","create.contributor":"Added contributor","rename.contributor":"Renamed contributor","link.contributor.user":"Linked contributor","tombstone.contributor":"Removed contributor","restore.contributor":"Restored contributor","rebalance.children":"Rebalanced order"})[e]??(e.endsWith("e")?`${e}d`:`${e}ed`),Ry=(e,t)=>t?e<t?"up":e>t?"down":null:null,Ny=(e,t)=>{let n=x.getNode(e.payload.parent),o=n?an.dim.bgBlack(` ${n.title} `):"unknown",r=t.at(-1);if(r&&"parent"in r&&"rank"in r&&r.parent===e.payload.parent){let s=Ry(e.payload.rank,r.rank);if(s)return`Moved ${s} in ${o}`}return`Moved issue to ${o}`},Bm=e=>`${Math.max(1,Math.round(e/1024))} KB`,Om=e=>x.getAttachment(e)?.name??"",Sy=e=>{switch(e.action){case"add.issue.tag":{let t=g().tags[e.payload.tag];return t?an.bgHex(Pe(t.name))(` ${t.name} `):"unknown tag"}case"remove.issue.tag":{let t=g().tags[e.payload.tag];return t?an.bgHex(Pe(t.name))(` ${t.name} `):"unknown tag"}case"tombstone.tag":{let t=g().tags[e.payload.id];return t?`"${t.name}"`:""}case"add.issue.assignee":{let t=g().contributors[e.payload.assignee];return t?an.hex(Pe(t.name))(` ${t.name} `):"unknown user"}case"remove.issue.assignee":{let t=g().contributors[e.payload.assignee];return t?an.hex(Pe(t.name))(` ${t.name} `):"unknown user"}case"add.board":case"add.swimlane":case"add.issue":case"add.field":case"create.tag":case"restore.tag":case"create.contributor":case"rename.contributor":case"edit.title":return`"${"name"in e.payload?e.payload.name:""}"`;case"add.issue.attachment":return`"${e.payload.name}" ${an.dim(`(${Bm(e.payload.bytes)})`)}`;case"delete.issue.attachment":{let t=Om(e.payload.id);return t?`"${t}"`:""}default:return""}},Cy=e=>{let t=Zn(xy(e));return an.gray(Ey(t,8))},Ay=12,Ty=e=>Iy(`${e}`,Ay),wy=e=>{switch(e.action){case"add.issue.tag":case"remove.issue.tag":{let t=g().tags[e.payload.tag];return t?t.name:""}case"add.issue.assignee":case"remove.issue.assignee":{let t=g().contributors[e.payload.assignee];return t?t.name:""}case"tombstone.tag":{let t=g().tags[e.payload.id];return t?`"${t.name}"`:""}case"add.board":case"add.swimlane":case"add.issue":case"add.field":case"create.tag":case"restore.tag":case"create.contributor":case"rename.contributor":case"edit.title":return"name"in e.payload?`"${e.payload.name}"`:"";case"move.node":{let t=x.getNode(e.payload.parent);return t?`to ${t.title}`:""}case"add.issue.attachment":return`"${e.payload.name}" (${Bm(e.payload.bytes)})`;case"delete.issue.attachment":{let t=Om(e.payload.id);return t?`"${t}"`:""}default:return""}},ba=e=>[Aa(e.action),wy(e)].filter(Boolean).join(" "),_m=(e,t)=>{let n=Cy(e.id),o=Ty(e.userName),r=an.dim("\u203A"),s=e.action==="move.node"?Ny(e,t):[Aa(e.action),Sy(e)].filter(Boolean).join(" ");return`${o} ${n} ${r} ${s}`}});var $m={};Pa($m,{areVirtualNodesEnabled:()=>Rr,createOrUpdateVirtualField:()=>nr,createOrUpdateVirtualFieldList:()=>Ta,materializeTicketVirtualNodes:()=>Er,materializeVirtualNodes:()=>_y,setVirtualNodesEnabled:()=>Oy});var My,ky,Ly,Py,Dy,Fy,nr,Ta,Er,By,Um,Oy,Rr,_y,ei=y(()=>{"use strict";Zo();pe();A();_n();ge();hn();M();Bn();Vn();My=e=>Ce(e,"comments"),ky=e=>Ce(e,"description"),Ly=e=>Ce(e,"assignees"),Py=e=>Ce(e,"tags"),Dy=e=>Ce(e,"history"),Fy=e=>Ce(e,"attachments"),nr=({id:e,name:t,parentNodeId:n,rank:o,value:r,readonly:s=!1,childRenderAxis:d="horizontal"})=>{let l=x.getNode(e);if(!l){let p=x.createNode({...Se.field({id:e,name:t,parentNodeId:n,rank:o,props:{value:r},isVirtual:!0}),readonly:s,childRenderAxis:d});return a(p)?p:c("Virtual field created",void 0)}if(!Ve(l))return i(`Existing virtual node ${e} is not a field`);if(!(l.title!==t||l.parentNodeId!==n||l.rank!==o||l.props.value!==r||l.readonly!==s||l.childRenderAxis!==d))return c("Virtual field unchanged",void 0);let m=x.updateNode({...l,title:t,parentNodeId:n,rank:o,props:{...l.props,value:r},readonly:s,childRenderAxis:d});return a(m)?m:c("Virtual field updated",void 0)},Ta=({id:e,name:t,parentNodeId:n,rank:o,readonly:r=!1,childRenderAxis:s="horizontal"})=>{let d=x.getNode(e);if(!d){let m=x.createNode({...Se.fieldList({id:e,name:t,parentNodeId:n,rank:o,isVirtual:!0}),readonly:r,childRenderAxis:s});return a(m)?m:c("Virtual field list created",void 0)}if(!ro(d))return i(`Existing virtual node ${e} is not a field list`);if(!(d.title!==t||d.parentNodeId!==n||d.rank!==o||d.readonly!==r||d.childRenderAxis!==s))return c("Virtual field list unchanged",void 0);let u=x.updateNode({...d,title:t,parentNodeId:n,rank:o,readonly:r,childRenderAxis:s});return a(u)?u:c("Virtual field list updated",void 0)},Er=e=>{let t=Ke(st/4n),n=Ke(st/2n),o=Ke(st*3n/4n),r=Ke(st*7n/8n),s=Ke(st*15n/16n),d=Ke(st*13n/16n);if(a(t))return t;if(a(n))return n;if(a(o))return o;if(a(r))return r;if(a(s))return s;if(a(d))return d;let l=nr({id:ky(e.id),name:ne.DESCRIPTION,parentNodeId:e.id,rank:t.value,value:e.props.description??"",childRenderAxis:"vertical"});if(a(l))return l;let u=Ta({id:Ly(e.id),name:ne.ASSIGNEES,parentNodeId:e.id,rank:n.value,readonly:!0});if(a(u))return u;let m=Ta({id:Py(e.id),name:ne.TAGS,parentNodeId:e.id,rank:o.value,readonly:!0});if(a(m))return m;let p=nr({id:My(e.id),name:ne.COMMENTS,parentNodeId:e.id,rank:r.value,value:"",readonly:!1,childRenderAxis:"vertical"});if(a(p))return p;let f=nr({id:Fy(e.id),name:ne.ATTACHMENTS,parentNodeId:e.id,rank:s.value,value:"",readonly:!0,childRenderAxis:"vertical"});if(a(f))return f;let I=nr({id:Dy(e.id),name:ne.HISTORY,parentNodeId:e.id,rank:d.value,value:By(e),readonly:!0,childRenderAxis:"vertical"});return a(I)?I:c("Ticket virtual nodes materialized",void 0)},By=e=>{let t=[...e.log].reverse(),n=new Map;for(let o of t){let r=n.get(o.action)??[];r.push(o.payload),n.set(o.action,r)}return t.map(o=>_m(o,n.get(o.action)??[])).join(`
69
+ `)},Um=!0,Oy=e=>{Um=e},Rr=()=>Um,_y=()=>{let{nodes:e}=g();for(let t of Object.values(e)){if(!k(t))continue;let n=Er(t);if(a(n))return n}return c("Virtual nodes materialized",void 0)}});var jm=y(()=>{"use strict"});var Uy,W0,Hm,Wm,wa=y(()=>{"use strict";ct();at();qt();ca();Do();Zo();Et();Kt();kt();jm();A();Tt();es();le();M();Uy=null,W0=Promise.resolve(),Hm=()=>{if(!bt())return{mode:"live",asOfTime:null};let{timeMode:e}=g();return e==="live"?{mode:"live",asOfTime:null}:{mode:"scrub",asOfTime:Uy}},Wm=(e,t)=>{let n=new Map,o=new Set,r=d=>{let l=new Set,u=d;for(;u&&!l.has(u);){if(o.has(u))return u;l.add(u),u=n.get(u)}return null},s=[];for(let d of e){let l=d.payload,u=l?.id;if(!u)continue;d.action==="add.board"&&o.add(u);let m=l.parent??l.issue;m&&n.set(u,m),(u===t||r(u)===t)&&s.push(d)}return s}});import{decodeTime as Gm,ulid as H}from"ulid";var Ls,te,me,ae,qm,$y,Vm,Km,zm,Ym,Xm,Jm,Qm,Zm,ep,tp,np,op,rp,sp,ip,ap,dp,cp,lp,up,mp,pp,gp,fp,hp,jy,vp,yp,bp,xp,Ip,Ep,Rp=y(()=>{"use strict";ct();at();lo();So();hi();Tn();ha();Io();Kt();In();ut();wa();ia();Un();pe();A();ge();ht();M();Br();wo();le();gt();Zo();Et();$o();qt();Ht();Bo();wt();wa();Ls=e=>{let t=ze(e??process.cwd());return a(t)?i(t.message):c("Resolved Epiq repo root",t.value)},te=async(e,t)=>{let n=Ls(e);if(a(n))return n;let o=Ne({repoRoot:n.value});if(a(o))return i(o.message);let r=Wt(n.value);if(a(r))return i(r.message);let s=await pi({repoRoot:n.value,stateBranchName:r.value});if(a(s))return i(s.message);let d=await Rn({repoRoot:n.value,stateBranchRoot:o.value,stateBranchName:r.value});if(a(d))return i(d.message);if(t?.pull??!1){let m=await j({cwd:o.value,args:["pull","--ff-only"]});a(m)&&Y.info(3,m.message)}let l=Lt(o.value);if(a(l))return i(l.message);let u=Yt(l.value.events,l.value.unreadable);return a(u)?i(u.message):c("Booted Epiq state",{repoRoot:n.value,stateBranchRoot:o.value})},me=()=>{let e=Hc();return a(e)?i(e.message):e.value.userId?e.value.userName?c("Resolved actor",{userId:e.value.userId,userName:e.value.userName}):i("Unable to retrieve user name"):i("Unable to retrieve user id")},ae=()=>{let e=$e();return a(e)?i(e.message):e},qm=e=>(e.props.tags??[]).map(t=>x.getTag(t)).filter(t=>t!=null).map(t=>({id:t.id,name:t.name,color:Pe(t.name)})),$y=()=>{let e=$e(),t=a(e)?[]:e.value.eventLog??[],n=new Map;for(let o of t)o.userId&&o.userName&&n.set(o.userId,o.userName);return n},Vm=(e,t)=>{let n=new Map(e);for(let o of Object.values(t))n.set(o.id,o.name);return n},Km=e=>(e.props.assignees??[]).map(t=>x.getContributor(t)).filter(t=>t!=null).map(({id:t,name:n})=>({id:t,name:n,color:Pe(n)})),zm=async(e={})=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=ae();if(a(n))return n;let o=Object.values(n.value.nodes).filter(r=>r.context==="BOARD"&&!r.isDeleted).map(r=>({id:r.id,ref:V(r.id),title:r.title,parentId:r.parentNodeId,readonly:!!r.readonly}));return c("Listed boards",o)},Ym=async(e={})=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=ae();if(a(n))return n;let o=Object.values(n.value.nodes).filter(r=>r.context==="SWIMLANE"&&!r.isDeleted).filter(r=>!e.boardId||r.parentNodeId===e.boardId).map(r=>({id:r.id,title:r.title,boardId:r.parentNodeId,isClosed:r.id===be,readonly:!!r.readonly}));return c("Listed swimlanes",o)},Xm=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=ae();if(a(n))return n;let o=e.idOrRef.trim();if(!o)return i("Provide an issue id or ref");let r=Object.values(n.value.nodes).filter(k).filter(u=>!u.isDeleted),s=r.find(u=>u.id===o),d=s?[s]:r.filter(u=>vo(u.id,o));if(d.length===0)return i(`No issue matches "${o}"`);if(d.length>1)return i(`"${o}" matches ${d.length} issues: ${d.map(u=>`${V(u.id)} (${Be(u.title)})`).join(", ")}. Use a full ref or id.`);let l=d[0];return c("Found issue",{id:l.id,ref:V(l.id),title:Be(l.title),description:l.props.description??"",createdAt:Gm(l.id),parentNodeId:l.parentNodeId,isClosed:l.parentNodeId===be,readonly:!!l.readonly,tags:qm(l),assignees:Km(l)})},Jm=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=ae();if(a(n))return n;let o=n.value.nodes,r=Object.values(o).filter(k).filter(s=>!s.isDeleted).filter(s=>e.includeClosed||s.parentNodeId!==be).filter(s=>e.boardId?(s.parentNodeId?o[s.parentNodeId]:void 0)?.parentNodeId===e.boardId:!0).map(s=>({id:s.id,ref:V(s.id),title:Be(s.title),description:s.props.description??"",createdAt:Gm(s.id),parentNodeId:s.parentNodeId,isClosed:s.parentNodeId===be,readonly:!!s.readonly,tags:qm(s),assignees:Km(s)}));return c("Listed issues",r)},Qm=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=me();if(a(n))return n;let o=ae();if(a(o))return o;let r=Be(e.title);if(!r)return i("Issue title cannot be empty");let s=e.description??"",d=mt("Issue title",r,300)??mt("Issue description",s,1e5);if(d)return i(d);if((e.tagNames?.length??0)>20)return i(`Cannot set more than ${20} tags at once`);if((e.assigneeNames?.length??0)>20)return i(`Cannot set more than ${20} assignees at once`);let l=En(e.parentId,n.value,t.value.stateBranchRoot);if(a(l))return l;let u=Is({name:r,parent:e.parentId,user:n.value,rank:l.value});if(a(u))return u;let m=[...u.value],p=m.find(T=>T.action==="add.issue")?.payload.id;if(!p)return i("Unable to determine created issue id");s&&m.push({id:H(),...n.value,action:"edit.description",payload:{id:p,md:s}});let f=[];for(let T of e.tagNames??[]){let C=Be(T).trim();if(!C||f.some(Z=>Z.name===C))continue;let w=mt("Tag name",C,60);if(w)return i(w);let $=x.findTagByName(C),_=$?.id??H();$||m.push({id:H(),...n.value,action:"create.tag",payload:{id:_,name:C}}),m.push({id:H(),...n.value,action:"add.issue.tag",payload:{id:p,tag:_}}),f.push({id:_,name:C})}let I=[];for(let T of e.assigneeNames??[]){let C=Be(T).trim();if(!C||I.some(Z=>Z.name===C))continue;let w=mt("Assignee name",C,80);if(w)return i(w);let $=Object.values(o.value.contributors).find(Z=>Z.name===C),_=$?.id??H();$||m.push({id:H(),...n.value,action:"create.contributor",payload:{id:_,name:C}}),m.push({id:H(),...n.value,action:"add.issue.assignee",payload:{id:p,assignee:_}}),I.push({id:_,name:C})}let N=B(m,t.value.stateBranchRoot);return a(N)?i(N.message):c("Created issue",{id:p,ref:V(p),title:r,parentId:e.parentId,description:s,tags:f,assignees:I})},Zm=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=me();if(a(n))return n;let o=zt(be,e.issueId,{at:"end"},n.value,t.value.stateBranchRoot);if(a(o))return o;let r={id:H(),...n.value,action:"close.issue",payload:{id:e.issueId,parent:be,rank:o.value}},s=B([r],t.value.stateBranchRoot);return a(s)?i(s.message):c("Closed issue",{id:e.issueId,ref:V(e.issueId)})},ep=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=me();if(a(n))return n;let o=ae();if(a(o))return o;let r=o.value.nodes[e.issueId];if(!r)return i("Issue not found");if(!k(r))return i("Target node is not issue");if(r.parentNodeId!==be)return i("Issue is not closed");let s=ys(r);if(!s)return i("Unable to resolve previous parent from issue history");if(s===be)return i("Previous parent resolves to closed swimlane");let d=o.value.nodes[s];if(!d)return i("Previous parent no longer exists");let l=zt(d.id,r.id,{at:"end"},n.value,t.value.stateBranchRoot);if(a(l))return l;let u={id:H(),...n.value,action:"reopen.issue",payload:{id:r.id,parent:d.id,rank:l.value}},m=B([u],t.value.stateBranchRoot);return a(m)?i(m.message):c("Reopened issue",{id:r.id,ref:V(r.id),parentId:d.id})},tp=async e=>{let t=Ls(e.repoRoot);if(a(t))return t;let n=me();if(a(n))return n;let o=Ne({repoRoot:t.value});if(a(o))return o;let r=Lt(o.value);if(a(r))return r;let s=Yt(r.value.events,r.value.unreadable);if(a(s))return s;let d=zt(e.parentId,e.issueId,e.position??{at:"end"},n.value,o.value);if(a(d))return d;let l={id:H(),...n.value,action:"move.node",payload:{id:e.issueId,parent:e.parentId,rank:d.value}},u=B([l],o.value);return a(u)?i(u.message):c("Moved issue",{id:e.issueId,ref:V(e.issueId),parentId:e.parentId})},np=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=me();if(a(n))return n;let o=ae();if(a(o))return o;let r=o.value.nodes[e.boardId];if(!r)return i("Board not found");if(!ar(r))return i("Target parent must be a board");if(r.readonly)return i("Cannot add a swimlane to a readonly board");if(Hm().mode!=="live")return i("Cannot add a swimlane while time travelling");let s=Be(e.title);if(!s.trim())return i("Swimlane title cannot be empty");let d=mt("Swimlane title",s,300);if(d)return i(d);let l=En(e.boardId,n.value,t.value.stateBranchRoot);if(a(l))return l;let u=H(),m={id:H(),...n.value,action:"add.swimlane",payload:{id:u,name:s,parent:e.boardId,rank:l.value}},p=B([m],t.value.stateBranchRoot);return a(p)?i(p.message):c("Created swimlane",{id:u,ref:V(u),title:s,boardId:e.boardId})},op=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=me();if(a(n))return n;let o=ae();if(a(o))return o;let r=o.value.nodes[e.swimlaneId];if(!r)return i("Swimlane not found");if(!ln(r))return i("Edit target must be a swimlane");if(r.readonly)return i("Cannot edit readonly swimlane");let s=Be(e.title);if(!s.trim())return i("Swimlane title cannot be empty");let d=mt("Swimlane title",s,300);if(d)return i(d);if(r.title===s)return c("No changes made",{id:e.swimlaneId,ref:V(e.swimlaneId),title:s});let l={id:H(),...n.value,action:"edit.title",payload:{id:e.swimlaneId,name:s}},u=B([l],t.value.stateBranchRoot);return a(u)?i(u.message):c("Edited swimlane title",{id:e.swimlaneId,ref:V(e.swimlaneId),title:s})},rp=async e=>{let t=Ls(e.repoRoot);if(a(t))return t;let n=me();if(a(n))return n;let o=Ne({repoRoot:t.value});if(a(o))return o;let r=Lt(o.value);if(a(r))return r;let s=Yt(r.value.events,r.value.unreadable);if(a(s))return s;let d=zt(e.boardId,e.swimlaneId,e.position??{at:"end"},n.value,o.value);if(a(d))return d;let l={id:H(),...n.value,action:"move.node",payload:{id:e.swimlaneId,parent:e.boardId,rank:d.value}},u=B([l],o.value);return a(u)?i(u.message):c("Moved swimlane",{id:e.swimlaneId,ref:V(e.swimlaneId),boardId:e.boardId})},sp=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=me();if(a(n))return n;let o=ae();if(a(o))return o;let r=o.value.nodes[e.swimlaneId];if(!r)return i("Swimlane not found");if(!ln(r))return i("Delete target must be a swimlane");let s={id:H(),...n.value,action:"delete.node",payload:{id:e.swimlaneId}},d=B([s],t.value.stateBranchRoot);return a(d)?i(d.message):c("Deleted swimlane",{id:e.swimlaneId,ref:V(e.swimlaneId)})},ip=async(e={})=>{Dr();let t=Ls(e.repoRoot);if(a(t))return i("Sync failed");let n=me();if(a(n))return n;let o=await jr({cwd:t.value,ownEventFileName:xn(n.value)});return a(o)?(li(o.message),o):(Fr(),c("Synced",o.value))},ap=async(e={})=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=ae();return a(n)?n:c("Retrieved Epiq state",{root:t.value.repoRoot,stateBranchRoot:t.value.stateBranchRoot,nodes:n.value.nodes,rootNodeId:n.value.rootNodeId,contextNode:n.value.contextNode,selectedIndex:n.value.selectedIndex,eventLog:n.value.eventLog})},dp=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=me();if(a(n))return n;let o=ae();if(a(o))return o;let r=o.value.nodes[e.issueId];if(!r)return i("Issue not found");if(!k(r))return i("Edit target must be an issue");if(r.readonly)return i("Cannot edit readonly issue");let s=mt("Issue description",e.description,1e5);if(s)return i(s);let d=r.props.description??"";if(d===e.description)return c("No changes made",{id:e.issueId,ref:V(e.issueId),description:d});let l={id:H(),...n.value,action:"edit.description",payload:{id:e.issueId,md:e.description}},u=B([l],t.value.stateBranchRoot);return a(u)?i(u.message):c("Edited issue description",{id:e.issueId,ref:V(e.issueId),description:e.description})},cp=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=me();if(a(n))return n;let o=ae();if(a(o))return o;let r=o.value.nodes[e.issueId];if(!r)return i("Issue not found");if(!k(r))return i("Edit target must be an issue");if(r.readonly)return i("Cannot edit readonly issue");let s=Be(e.title);if(!s.trim())return i("Issue title cannot be empty");let d=mt("Issue title",s,300);if(d)return i(d);if(r.title===s)return c("No changes made",{id:e.issueId,ref:V(e.issueId),title:s});let l={id:H(),...n.value,action:"edit.title",payload:{id:e.issueId,name:s}},u=B([l],t.value.stateBranchRoot);return a(u)?i(u.message):c("Edited issue title",{id:e.issueId,ref:V(e.issueId),title:s})},lp=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=me();if(a(n))return n;let o=ae();if(a(o))return o;let r=o.value.nodes[e.issueId];if(!r)return i("Issue not found");if(!k(r))return i("Tag target must be an issue");if(r.readonly)return i("Cannot tag readonly issue");let s=Be(e.tagName).trim();if(!s)return i("Tag name cannot be empty");let d=mt("Tag name",s,60);if(d)return i(d);let l=x.findTagByName(s),u=l?.id??H(),m=[...l?[]:[{id:H(),...n.value,action:"create.tag",payload:{id:u,name:s}}],{id:H(),...n.value,action:"add.issue.tag",payload:{id:e.issueId,tag:u}}],p=B(m,t.value.stateBranchRoot);return a(p)?i(p.message):c("Added issue tag",{id:e.issueId,ref:V(e.issueId),tag:{id:u,name:s}})},up=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=me();if(a(n))return n;let o=ae();if(a(o))return o;let r=o.value.tags[e.tagId];if(!r)return i("Tag not found");if(r.tombstoned)return i("Tag is already deleted");let s=[{id:H(),...n.value,action:"tombstone.tag",payload:{id:e.tagId}}],d=B(s,t.value.stateBranchRoot);return a(d)?i(d.message):c("Deleted tag",{id:r.id,name:r.name})},mp=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=me();if(a(n))return n;let o=ae();if(a(o))return o;let r=o.value.tags[e.tagId];if(!r)return i("Tag not found");if(!r.tombstoned)return i("Tag is not deleted");if(x.findTagByName(r.name))return i(`Cannot restore: another tag is already named "${r.name}"`);let s=[{id:H(),...n.value,action:"restore.tag",payload:{id:e.tagId,name:r.name}}],d=B(s,t.value.stateBranchRoot);return a(d)?i(d.message):c("Restored tag",{id:r.id,name:r.name})},pp=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=me();if(a(n))return n;let o=ae();if(a(o))return o;let r=o.value.nodes[e.issueId];if(!r)return i("Issue not found");if(!k(r))return i("Untag target must be an issue");if(r.readonly)return i("Cannot untag readonly issue");if(!o.value.tags[e.tagId])return i("Tag not found");let s={id:H(),...n.value,action:"remove.issue.tag",payload:{id:e.issueId,tag:e.tagId}},d=B([s],t.value.stateBranchRoot);return a(d)?i(d.message):c("Removed issue tag",{id:e.issueId,ref:V(e.issueId),tagId:e.tagId})},gp=async(e,t)=>{let n=di(e);if(a(n))return;let o;for(let r of n.value)r.userId===t&&(o=r.userName??o);return o===void 0?void 0:{id:t,name:o}},fp=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=me();if(a(n))return n;let o=ae();if(a(o))return o;let r=o.value.nodes[e.issueId];if(!r)return i("Issue not found");if(!k(r))return i("Assign target must be an issue");if(r.readonly)return i("Cannot assign readonly issue");let s=e.self?n.value.userId:e.assigneeId;if(s){let w=o.value.contributors[s],$=w?void 0:await gp(t.value.stateBranchRoot,s);if(!w&&!$)return i("Unknown assignee id");let _=w??$,Z=[...w?[]:[{id:H(),...n.value,action:"create.contributor",payload:{id:_.id,name:_.name}}],{id:H(),...n.value,action:"add.issue.assignee",payload:{id:e.issueId,assignee:_.id}}],ve=B(Z,t.value.stateBranchRoot);return a(ve)?i(ve.message):c("Added issue assignee",{id:e.issueId,ref:V(e.issueId),assignee:{id:_.id,name:_.name}})}let d=Be(e.assigneeName??"").trim();if(!d)return i("Provide assigneeId, self or assigneeName");let l=mt("Assignee name",d,80);if(l)return i(l);let m=[...Vm($y(),o.value.contributors).entries()].filter(([,w])=>w===d);if(m.length>1)return i(`"${d}" matches ${m.length} contributors (${m.map(([w])=>w).join(", ")}). Assign by assigneeId to choose.`);let p=m[0];if(!p&&!e.createUnlinked)return i(`No contributor named "${d}". Assign by id, or pass createUnlinked to add them as an external assignee.`);let[f=H(),I=d]=p??[],T=[...!!o.value.contributors[f]?[]:[{id:H(),...n.value,action:"create.contributor",payload:{id:f,name:I}}],{id:H(),...n.value,action:"add.issue.assignee",payload:{id:e.issueId,assignee:f}}],C=B(T,t.value.stateBranchRoot);return a(C)?i(C.message):c("Added issue assignee",{id:e.issueId,ref:V(e.issueId),assignee:{id:f,name:I}})},hp=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=me();if(a(n))return n;let o=ae();if(a(o))return o;if(!o.value.contributors[e.contributorId])return i("Contributor not found");if(await gp(t.value.stateBranchRoot,e.contributorId))return i("Cannot remove a contributor who has authored events \u2014 their name appears throughout the log");let d=[{id:H(),...n.value,action:"tombstone.contributor",payload:{id:e.contributorId}}],l=B(d,t.value.stateBranchRoot);return a(l)?i(l.message):c("Tombstoned contributor",{id:e.contributorId,name:ir})},jy=async(e,t)=>{let n=jn(e);if(a(n))return;let o;for(let r of n.value){if(r.action!=="create.contributor")continue;let s=r.payload;s.id===t&&s.name&&(o=s.name)}return o},vp=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=me();if(a(n))return n;let o=ae();if(a(o))return o;let r=o.value.contributors[e.contributorId];if(!r)return i("Contributor not found");if(!r.tombstoned)return i("Contributor is not tombstoned");let s=await jy(t.value.stateBranchRoot,e.contributorId);if(!s)return i("Cannot restore this contributor \u2014 no original name found in the event log");let d=[{id:H(),...n.value,action:"restore.contributor",payload:{id:e.contributorId,name:s}}],l=B(d,t.value.stateBranchRoot);return a(l)?i(l.message):c("Restored contributor",{id:e.contributorId,name:s})},yp=async(e={})=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=me();if(a(n))return n;let o=ae();if(a(o))return o;let r=jn(t.value.stateBranchRoot);if(a(r))return i(r.message);let s=e.boardId?Wm(r.value,e.boardId):r.value,d=new Map,l=new Set,u=new Set,m=di(t.value.stateBranchRoot);if(a(m))return i(m.message);for(let N of m.value)N.userId&&u.add(N.userId);for(let N of s)N.userId&&(d.set(N.userId,N.userName??""),l.add(N.userId));let p=o.value.contributors,I=[...Vm(d,p).entries()].map(([N,T])=>({id:N,name:T,color:Pe(T),isSelf:N===n.value.userId,isExternal:!l.has(N),isRemoved:p[N]?.tombstoned===!0,hasAuthoredAnywhere:u.has(N)}));return c("Listed board contributors",I)},bp=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=me();if(a(n))return n;let o=ae();if(a(o))return o;let r=o.value.nodes[e.issueId];if(!r)return i("Issue not found");if(!k(r))return i("Unassign target must be an issue");if(r.readonly)return i("Cannot unassign readonly issue");if(!o.value.contributors[e.assigneeId])return i("Assignee not found");let s={id:H(),...n.value,action:"remove.issue.assignee",payload:{id:e.issueId,assignee:e.assigneeId}},d=B([s],t.value.stateBranchRoot);return a(d)?i(d.message):c("Removed issue assignee",{id:e.issueId,ref:V(e.issueId),assigneeId:e.assigneeId})},xp=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=me();if(a(n))return n;let o=ae();if(a(o))return o;let r=o.value.nodes[e.issueId];if(!r)return i("Issue not found");if(!k(r))return i("Comment target must be an issue");if(r.readonly)return i("Cannot comment on readonly issue");let s=e.body.trim();if(!s)return i("Comment cannot be empty");if(s.length>4e3)return i(`Comment cannot exceed ${4e3} characters (got ${s.length})`);let d=H(),l={id:H(),...n.value,action:"add.issue.comment",payload:{id:d,issue:e.issueId,md:s,author:n.value.userId}},u=B([l],t.value.stateBranchRoot);return a(u)?i(u.message):c("Added issue comment",{id:d,issueId:e.issueId,body:s})},Ip=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=me();if(a(n))return n;let o=ae();if(a(o))return o;let r=o.value.eventLog.find(m=>m.action==="add.issue.comment"&&m.payload.id===e.commentId);if(!r)return i("Unable to resolve comment");if(r.payload.author!==n.value.userId)return i("You can only delete your own comments");let s=o.value.nodes[r.payload.issue];if(!s)return i("Issue not found");if(!k(s))return i("Comment target must be an issue");if(s.readonly)return i("Cannot delete comment on readonly issue");if(o.value.eventLog.some(m=>m.action==="delete.issue.comment"&&m.payload.id===e.commentId))return c("Comment already deleted",{id:e.commentId,issueId:r.payload.issue});let l={id:H(),...n.value,action:"delete.issue.comment",payload:{id:e.commentId,issue:r.payload.issue}},u=B([l],t.value.stateBranchRoot);return a(u)?i(u.message):c("Deleted issue comment",{id:e.commentId,issueId:r.payload.issue})},Ep=async e=>{let t=await te(e.repoRoot,{pull:!1});if(a(t))return t;let n=me();if(a(n))return n;let o=ae();if(a(o))return o;let r=o.value.eventLog.find(p=>p.action==="add.issue.comment"&&p.payload.id===e.commentId);if(!r)return i("Unable to resolve comment");if(r.payload.author!==n.value.userId)return i("You can only edit your own comments");let s=o.value.nodes[r.payload.issue];if(!s)return i("Issue not found");if(!k(s))return i("Comment target must be an issue");if(s.readonly)return i("Cannot edit comment on readonly issue");if(o.value.eventLog.some(p=>p.action==="delete.issue.comment"&&p.payload.id===e.commentId))return i("Comment was deleted");let l=e.body.trim();if(!l)return i("Comment cannot be empty");if(l.length>4e3)return i(`Comment cannot exceed ${4e3} characters (got ${l.length})`);let u={id:H(),...n.value,action:"edit.issue.comment",payload:{id:e.commentId,issue:r.payload.issue,md:l}},m=B([u],t.value.stateBranchRoot);return a(m)?i(m.message):c("Edited issue comment",{id:e.commentId,issueId:r.payload.issue,body:l})}});var Cp={};Pa(Cp,{createMcpServer:()=>Np,resultJson:()=>z,startMcpServer:()=>Sp});import{McpServer as Hy}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as Wy}from"@modelcontextprotocol/sdk/server/stdio.js";import{z as b}from"zod";var z,Np,Sp,Ap=y(async()=>{"use strict";A();$o();Rp();z=e=>({isError:a(e),content:[{type:"text",text:JSON.stringify(e,null,2)}]}),Np=()=>{let e=new Hy({name:"epiq",version:"0.2.30"});return e.registerTool("epiq_state_get",{description:"Get the full current Epiq state, including nodes and event log",inputSchema:b.object({repoRoot:b.string().optional()})},async t=>z(await ap(t))),e.registerTool("epiq_issue_list",{description:"List Epiq issues. Pass boardId to scope results to a single board and reduce response size.",inputSchema:b.object({repoRoot:b.string().optional(),includeClosed:b.boolean().optional(),boardId:b.string().optional()})},async t=>z(await Jm(t))),e.registerTool("epiq_issue_get",{description:"Get one Epiq issue by its full id or its 7-character ref. Use this rather than listing the whole board when you already know which issue you want.",inputSchema:b.object({idOrRef:b.string().min(1),repoRoot:b.string().optional()})},async t=>z(await Xm(t))),e.registerTool("epiq_board_list",{description:"List Epiq boards",inputSchema:b.object({repoRoot:b.string().optional()})},async t=>z(await zm(t))),e.registerTool("epiq_swimlane_list",{description:"List Epiq swimlanes",inputSchema:b.object({repoRoot:b.string().optional(),boardId:b.string().optional()})},async t=>z(await Ym(t))),e.registerTool("epiq_swimlane_create",{description:"Create an Epiq swimlane on a board",inputSchema:b.object({repoRoot:b.string().optional(),boardId:b.string().min(1),title:b.string().min(1).max(300)})},async t=>z(await np(t))),e.registerTool("epiq_swimlane_title_edit",{description:"Edit an Epiq swimlane title",inputSchema:b.object({repoRoot:b.string().optional(),swimlaneId:b.string().min(1),title:b.string().min(1).max(300)})},async t=>z(await op(t))),e.registerTool("epiq_swimlane_move",{description:"Move/reorder an Epiq swimlane, optionally to another board",inputSchema:b.object({repoRoot:b.string().optional(),swimlaneId:b.string().min(1),boardId:b.string().min(1),position:b.discriminatedUnion("at",[b.object({at:b.literal("start")}),b.object({at:b.literal("end")}),b.object({at:b.literal("before"),sibling:b.string().min(1)}),b.object({at:b.literal("after"),sibling:b.string().min(1)})]).optional()})},async t=>z(await rp(t))),e.registerTool("epiq_swimlane_delete",{description:"Delete (archive) an Epiq swimlane. This also archives every issue contained in it.",inputSchema:b.object({repoRoot:b.string().optional(),swimlaneId:b.string().min(1)})},async t=>z(await sp(t))),e.registerTool("epiq_issue_create",{description:"Create an Epiq issue. Optionally set description, tags, and assignees atomically in the same call instead of separate follow-up edits.",inputSchema:b.object({title:b.string().min(1).max(300),parentId:b.string().min(1),repoRoot:b.string().optional(),description:b.string().max(1e5).optional(),tagNames:b.array(b.string().max(60)).max(20).optional(),assigneeNames:b.array(b.string().max(80)).max(20).optional()})},async t=>z(await Qm(t))),e.registerTool("epiq_issue_description_edit",{description:"Edit the markdown description of an Epiq issue",inputSchema:b.object({issueId:b.string().min(1),description:b.string().max(1e5),repoRoot:b.string().optional()})},async t=>z(await dp(t))),e.registerTool("epiq_issue_title_edit",{description:"Edit the title of an Epiq issue",inputSchema:b.object({issueId:b.string().min(1),title:b.string().min(1).max(300),repoRoot:b.string().optional()})},async t=>z(await cp(t))),e.registerTool("epiq_issue_tag_add",{description:"Add a tag to an Epiq issue, creating the tag if it does not exist",inputSchema:b.object({issueId:b.string().min(1),tagName:b.string().min(1).max(60),repoRoot:b.string().optional()})},async t=>z(await lp(t))),e.registerTool("epiq_issue_tag_remove",{description:"Remove a tag from an Epiq issue",inputSchema:b.object({issueId:b.string().min(1),tagId:b.string().min(1),repoRoot:b.string().optional()})},async t=>z(await pp(t))),e.registerTool("epiq_contributor_list",{description:"List people who can be assigned: everyone who has authored an event (optionally scoped to one board) unioned with the contributor registry. Use these ids with epiq_issue_assignee_add rather than assigning by name.",inputSchema:b.object({boardId:b.string().min(1).optional(),repoRoot:b.string().optional()})},async t=>z(await yp(t))),e.registerTool("epiq_contributor_remove",{description:"Remove an external contributor from the assignee suggestion lists. Their id and every reference to it survive, so existing assignments stay intact and the event log is untouched. Refused for anyone who has authored events, since their name is in the log regardless.",inputSchema:b.object({contributorId:b.string().min(1),repoRoot:b.string().optional()})},async t=>z(await hp(t))),e.registerTool("epiq_tag_remove",{description:"Delete a tag from the whole workspace. It disappears from every ticket, picker and filter, but its id and history stay in the event log, and the name is free for a new tag.",inputSchema:b.object({tagId:b.string().min(1),repoRoot:b.string().optional()})},async t=>z(await up(t))),e.registerTool("epiq_tag_restore",{description:"Put back a tag deleted with epiq_tag_remove, on every ticket that still carried it.",inputSchema:b.object({tagId:b.string().min(1),repoRoot:b.string().optional()})},async t=>z(await mp(t))),e.registerTool("epiq_contributor_restore",{description:"Put a contributor removed with epiq_contributor_remove back into the suggestion lists, under the name they were created with.",inputSchema:b.object({contributorId:b.string().min(1),repoRoot:b.string().optional()})},async t=>z(await vp(t))),e.registerTool("epiq_issue_assignee_add",{description:"Assign a contributor to an Epiq issue. Pass self:true to assign yourself. Prefer assigneeId otherwise, which assigns a known contributor (from the registry or the event log) and fails if the id is unknown. assigneeName matches an existing contributor by name; to create somebody new from a name you must also pass createUnlinked, which adds them as an external (non-contributor) assignee.",inputSchema:b.object({issueId:b.string().min(1),assigneeId:b.string().min(1).optional(),self:b.boolean().optional(),assigneeName:b.string().min(1).max(80).optional(),createUnlinked:b.boolean().optional(),repoRoot:b.string().optional()})},async t=>z(await fp(t))),e.registerTool("epiq_issue_assignee_remove",{description:"Remove an assignee from an Epiq issue",inputSchema:b.object({issueId:b.string().min(1),assigneeId:b.string().min(1),repoRoot:b.string().optional()})},async t=>z(await bp(t))),e.registerTool("epiq_issue_comment_add",{description:"Add a comment to an Epiq issue",inputSchema:b.object({issueId:b.string().min(1),body:b.string().min(1).max(4e3),repoRoot:b.string().optional()})},async t=>z(await xp(t))),e.registerTool("epiq_issue_comment_delete",{description:"Delete a comment from an Epiq issue",inputSchema:b.object({commentId:b.string().min(1),repoRoot:b.string().optional()})},async t=>z(await Ip(t))),e.registerTool("epiq_issue_comment_edit",{description:"Replace the body of one of your own comments on an Epiq issue",inputSchema:b.object({commentId:b.string().min(1),body:b.string().min(1).max(4e3),repoRoot:b.string().optional()})},async t=>z(await Ep(t))),e.registerTool("epiq_issue_reopen",{description:"Reopen a closed Epiq issue, restoring it to its previous swimlane",inputSchema:b.object({issueId:b.string().min(1),repoRoot:b.string().optional()})},async t=>z(await ep(t))),e.registerTool("epiq_issue_close",{description:"Close an Epiq issue",inputSchema:b.object({issueId:b.string().min(1),repoRoot:b.string().optional()})},async t=>z(await Zm(t))),e.registerTool("epiq_issue_move",{description:"Move an Epiq issue to another swimlane",inputSchema:b.object({issueId:b.string().min(1),parentId:b.string().min(1),position:b.discriminatedUnion("at",[b.object({at:b.literal("start")}),b.object({at:b.literal("end")}),b.object({at:b.literal("before"),sibling:b.string().min(1)}),b.object({at:b.literal("after"),sibling:b.string().min(1)})]).optional(),repoRoot:b.string().optional()})},async t=>z(await tp(t))),e.registerTool("epiq_sync",{description:"Sync Epiq state with the configured Git remote (pull remote changes and push local ones). Other Epiq MCP tools only read and write local state and never sync automatically \u2014 call this on demand when you need to see or publish the latest remote changes.",inputSchema:b.object({repoRoot:b.string().optional()})},async t=>z(await ip(t))),e},Sp=async()=>{let e=Np(),t=new Wy;await e.connect(t)};await Sp()});process.env.EPIQ_MCP="true";console.log=console.error;console.info=console.error;console.debug=console.error;console.warn=console.error;var{setVirtualNodesEnabled:Gy}=await Promise.resolve().then(()=>(ei(),$m));Gy(!1);await Ap().then(()=>Cp);