@ironmussa/funny 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (366) hide show
  1. package/README.md +214 -0
  2. package/bin/funny.js +80 -0
  3. package/package.json +59 -0
  4. package/packages/client/dist/assets/AddProjectView-CODm54MP.js +1 -0
  5. package/packages/client/dist/assets/AllThreadsView--Dd7YSK5.js +1 -0
  6. package/packages/client/dist/assets/AnalyticsView-eRhWGG3y.js +36 -0
  7. package/packages/client/dist/assets/AutomationInboxView-DwBaGJed.js +1 -0
  8. package/packages/client/dist/assets/CircuitBreakerDialog-C2iBwp5W.js +1 -0
  9. package/packages/client/dist/assets/CommandPalette-BXweSrdO.js +1 -0
  10. package/packages/client/dist/assets/ReviewPane-DxtlJNNu.js +10 -0
  11. package/packages/client/dist/assets/SettingsDetailView-BKh9OBM2.js +1 -0
  12. package/packages/client/dist/assets/SetupWizard-BekJX-tc.js +1 -0
  13. package/packages/client/dist/assets/TerminalPanel-DC4U0OTm.js +4 -0
  14. package/packages/client/dist/assets/ThreadListView-B6HvQ8NV.js +1 -0
  15. package/packages/client/dist/assets/abap-BdImnpbu.js +1 -0
  16. package/packages/client/dist/assets/actionscript-3-CoDkCxhg.js +1 -0
  17. package/packages/client/dist/assets/ada-bCR0ucgS.js +1 -0
  18. package/packages/client/dist/assets/addon-fit-DX4qG4td.js +1 -0
  19. package/packages/client/dist/assets/addon-web-links-DIbG5aQx.js +1 -0
  20. package/packages/client/dist/assets/andromeeda-C4gqWexZ.js +1 -0
  21. package/packages/client/dist/assets/angular-html-CU67Zn6k.js +1 -0
  22. package/packages/client/dist/assets/angular-ts-BwZT4LLn.js +1 -0
  23. package/packages/client/dist/assets/apache-Pmp26Uib.js +1 -0
  24. package/packages/client/dist/assets/apex-D8_7TLub.js +1 -0
  25. package/packages/client/dist/assets/apl-dKokRX4l.js +1 -0
  26. package/packages/client/dist/assets/applescript-Co6uUVPk.js +1 -0
  27. package/packages/client/dist/assets/ara-BRHolxvo.js +1 -0
  28. package/packages/client/dist/assets/arrow-right-3Bby9NNK.js +1 -0
  29. package/packages/client/dist/assets/asciidoc-Dv7Oe6Be.js +1 -0
  30. package/packages/client/dist/assets/asm-D_Q5rh1f.js +1 -0
  31. package/packages/client/dist/assets/astro-CbQHKStN.js +1 -0
  32. package/packages/client/dist/assets/aurora-x-D-2ljcwZ.js +1 -0
  33. package/packages/client/dist/assets/awk-DMzUqQB5.js +1 -0
  34. package/packages/client/dist/assets/ayu-dark-CMjwMIkn.js +1 -0
  35. package/packages/client/dist/assets/ayu-light-C47S-Tmv.js +1 -0
  36. package/packages/client/dist/assets/ayu-mirage-CjoLj4QM.js +1 -0
  37. package/packages/client/dist/assets/ballerina-BFfxhgS-.js +1 -0
  38. package/packages/client/dist/assets/bat-BkioyH1T.js +1 -0
  39. package/packages/client/dist/assets/beancount-k_qm7-4y.js +1 -0
  40. package/packages/client/dist/assets/berry-uYugtg8r.js +1 -0
  41. package/packages/client/dist/assets/bibtex-CHM0blh-.js +1 -0
  42. package/packages/client/dist/assets/bicep-Bmn6On1c.js +1 -0
  43. package/packages/client/dist/assets/blade-D4QpJJKB.js +1 -0
  44. package/packages/client/dist/assets/bsl-BO_Y6i37.js +1 -0
  45. package/packages/client/dist/assets/c-BIGW1oBm.js +1 -0
  46. package/packages/client/dist/assets/c3-VCDPK7BO.js +1 -0
  47. package/packages/client/dist/assets/cadence-Bv_4Rxtq.js +1 -0
  48. package/packages/client/dist/assets/cairo-KRGpt6FW.js +1 -0
  49. package/packages/client/dist/assets/catppuccin-frappe-DFWUc33u.js +1 -0
  50. package/packages/client/dist/assets/catppuccin-latte-C9dUb6Cb.js +1 -0
  51. package/packages/client/dist/assets/catppuccin-macchiato-DQyhUUbL.js +1 -0
  52. package/packages/client/dist/assets/catppuccin-mocha-D87Tk5Gz.js +1 -0
  53. package/packages/client/dist/assets/clarity-D53aC0YG.js +1 -0
  54. package/packages/client/dist/assets/clojure-P80f7IUj.js +1 -0
  55. package/packages/client/dist/assets/cmake-D1j8_8rp.js +1 -0
  56. package/packages/client/dist/assets/cobol-nwyudZeR.js +1 -0
  57. package/packages/client/dist/assets/codeowners-Bp6g37R7.js +1 -0
  58. package/packages/client/dist/assets/codeql-DsOJ9woJ.js +1 -0
  59. package/packages/client/dist/assets/coffee-Ch7k5sss.js +1 -0
  60. package/packages/client/dist/assets/command-B76T8z-A.js +1 -0
  61. package/packages/client/dist/assets/common-lisp-Cg-RD9OK.js +1 -0
  62. package/packages/client/dist/assets/coq-DkFqJrB1.js +1 -0
  63. package/packages/client/dist/assets/core-BEOw45JP.js +1 -0
  64. package/packages/client/dist/assets/cpp-CofmeUqb.js +1 -0
  65. package/packages/client/dist/assets/crystal-tKQVLTB8.js +1 -0
  66. package/packages/client/dist/assets/csharp-COcwbKMJ.js +1 -0
  67. package/packages/client/dist/assets/css-DPfMkruS.js +1 -0
  68. package/packages/client/dist/assets/csv-fuZLfV_i.js +1 -0
  69. package/packages/client/dist/assets/cue-D82EKSYY.js +1 -0
  70. package/packages/client/dist/assets/cypher-COkxafJQ.js +1 -0
  71. package/packages/client/dist/assets/d-85-TOEBH.js +1 -0
  72. package/packages/client/dist/assets/dark-plus-C3mMm8J8.js +1 -0
  73. package/packages/client/dist/assets/dart-CF10PKvl.js +1 -0
  74. package/packages/client/dist/assets/dax-CEL-wOlO.js +1 -0
  75. package/packages/client/dist/assets/desktop-BmXAJ9_W.js +1 -0
  76. package/packages/client/dist/assets/diff-D97Zzqfu.js +1 -0
  77. package/packages/client/dist/assets/docker-BcOcwvcX.js +1 -0
  78. package/packages/client/dist/assets/dotenv-Da5cRb03.js +1 -0
  79. package/packages/client/dist/assets/dracula-BzJJZx-M.js +1 -0
  80. package/packages/client/dist/assets/dracula-soft-BXkSAIEj.js +1 -0
  81. package/packages/client/dist/assets/dream-maker-BtqSS_iP.js +1 -0
  82. package/packages/client/dist/assets/edge-BkV0erSs.js +1 -0
  83. package/packages/client/dist/assets/elixir-CDX3lj18.js +1 -0
  84. package/packages/client/dist/assets/elm-DbKCFpqz.js +1 -0
  85. package/packages/client/dist/assets/emacs-lisp-C9XAeP06.js +1 -0
  86. package/packages/client/dist/assets/erb-CgJxNhIT.js +1 -0
  87. package/packages/client/dist/assets/erlang-DsQrWhSR.js +1 -0
  88. package/packages/client/dist/assets/event-DYHy0FJb.js +1 -0
  89. package/packages/client/dist/assets/everforest-dark-BgDCqdQA.js +1 -0
  90. package/packages/client/dist/assets/everforest-light-C8M2exoo.js +1 -0
  91. package/packages/client/dist/assets/fennel-BYunw83y.js +1 -0
  92. package/packages/client/dist/assets/fish-BvzEVeQv.js +1 -0
  93. package/packages/client/dist/assets/fluent-C4IJs8-o.js +1 -0
  94. package/packages/client/dist/assets/fortran-fixed-form-CkoXwp7k.js +1 -0
  95. package/packages/client/dist/assets/fortran-free-form-BxgE0vQu.js +1 -0
  96. package/packages/client/dist/assets/fsharp-CXgrBDvD.js +1 -0
  97. package/packages/client/dist/assets/gdresource-BOOCDP_w.js +1 -0
  98. package/packages/client/dist/assets/gdscript-C5YyOfLZ.js +1 -0
  99. package/packages/client/dist/assets/gdshader-DkwncUOv.js +1 -0
  100. package/packages/client/dist/assets/geist-mono-latin-100-normal-D3Rid1kg.woff +0 -0
  101. package/packages/client/dist/assets/geist-mono-latin-100-normal-pdI6W8EE.woff2 +0 -0
  102. package/packages/client/dist/assets/geist-mono-latin-200-normal-D9Q7ibyz.woff +0 -0
  103. package/packages/client/dist/assets/geist-mono-latin-200-normal-DrTlUhvP.woff2 +0 -0
  104. package/packages/client/dist/assets/geist-mono-latin-300-normal-63tOSYu7.woff +0 -0
  105. package/packages/client/dist/assets/geist-mono-latin-300-normal-DofeytYw.woff2 +0 -0
  106. package/packages/client/dist/assets/geist-mono-latin-400-normal-CoULgQGM.woff +0 -0
  107. package/packages/client/dist/assets/geist-mono-latin-400-normal-LC9RFr9I.woff2 +0 -0
  108. package/packages/client/dist/assets/geist-mono-latin-500-normal-D3o2eNa9.woff2 +0 -0
  109. package/packages/client/dist/assets/geist-mono-latin-500-normal-DOxI7kZ4.woff +0 -0
  110. package/packages/client/dist/assets/geist-mono-latin-600-normal-DQQBcVN0.woff2 +0 -0
  111. package/packages/client/dist/assets/geist-mono-latin-600-normal-DsVeri3b.woff +0 -0
  112. package/packages/client/dist/assets/geist-mono-latin-700-normal-D6izGJRP.woff2 +0 -0
  113. package/packages/client/dist/assets/geist-mono-latin-700-normal-QGw08Lff.woff +0 -0
  114. package/packages/client/dist/assets/geist-mono-latin-800-normal-DvMqam8Z.woff +0 -0
  115. package/packages/client/dist/assets/geist-mono-latin-800-normal-yoa1kcZw.woff2 +0 -0
  116. package/packages/client/dist/assets/geist-mono-latin-900-normal-CmoKXrdK.woff +0 -0
  117. package/packages/client/dist/assets/geist-mono-latin-900-normal-Cu5MFKsu.woff2 +0 -0
  118. package/packages/client/dist/assets/geist-sans-latin-100-normal-CafeGBe6.woff +0 -0
  119. package/packages/client/dist/assets/geist-sans-latin-100-normal-CdXtokqn.woff2 +0 -0
  120. package/packages/client/dist/assets/geist-sans-latin-200-normal-C4oXjfQB.woff2 +0 -0
  121. package/packages/client/dist/assets/geist-sans-latin-200-normal-CEPp-wnL.woff +0 -0
  122. package/packages/client/dist/assets/geist-sans-latin-300-normal-C3kkMBb6.woff2 +0 -0
  123. package/packages/client/dist/assets/geist-sans-latin-300-normal-plFOEHCX.woff +0 -0
  124. package/packages/client/dist/assets/geist-sans-latin-400-normal-BOaIZNA2.woff +0 -0
  125. package/packages/client/dist/assets/geist-sans-latin-400-normal-gapTbOY8.woff2 +0 -0
  126. package/packages/client/dist/assets/geist-sans-latin-500-normal-CN2lyvyL.woff +0 -0
  127. package/packages/client/dist/assets/geist-sans-latin-500-normal-uokXdC-Q.woff2 +0 -0
  128. package/packages/client/dist/assets/geist-sans-latin-600-normal-CA1yjETN.woff +0 -0
  129. package/packages/client/dist/assets/geist-sans-latin-600-normal-DFOURf8L.woff2 +0 -0
  130. package/packages/client/dist/assets/geist-sans-latin-700-normal-BmN9tIp5.woff2 +0 -0
  131. package/packages/client/dist/assets/geist-sans-latin-700-normal-CjScfYeH.woff +0 -0
  132. package/packages/client/dist/assets/geist-sans-latin-800-normal-EH2RlpXL.woff2 +0 -0
  133. package/packages/client/dist/assets/geist-sans-latin-800-normal-XNjooQKs.woff +0 -0
  134. package/packages/client/dist/assets/geist-sans-latin-900-normal-Bo3O536z.woff +0 -0
  135. package/packages/client/dist/assets/geist-sans-latin-900-normal-yM37RqPD.woff2 +0 -0
  136. package/packages/client/dist/assets/genie-D0YGMca9.js +1 -0
  137. package/packages/client/dist/assets/gherkin-DyxjwDmM.js +1 -0
  138. package/packages/client/dist/assets/git-commit-F4YmCXRG.js +1 -0
  139. package/packages/client/dist/assets/git-rebase-r7XF79zn.js +1 -0
  140. package/packages/client/dist/assets/github-dark-DHJKELXO.js +1 -0
  141. package/packages/client/dist/assets/github-dark-default-Cuk6v7N8.js +1 -0
  142. package/packages/client/dist/assets/github-dark-dimmed-DH5Ifo-i.js +1 -0
  143. package/packages/client/dist/assets/github-dark-high-contrast-E3gJ1_iC.js +1 -0
  144. package/packages/client/dist/assets/github-light-DAi9KRSo.js +1 -0
  145. package/packages/client/dist/assets/github-light-default-D7oLnXFd.js +1 -0
  146. package/packages/client/dist/assets/github-light-high-contrast-BfjtVDDH.js +1 -0
  147. package/packages/client/dist/assets/gleam-BspZqrRM.js +1 -0
  148. package/packages/client/dist/assets/glimmer-js-Rg0-pVw9.js +1 -0
  149. package/packages/client/dist/assets/glimmer-ts-U6CK756n.js +1 -0
  150. package/packages/client/dist/assets/glsl-DplSGwfg.js +1 -0
  151. package/packages/client/dist/assets/gn-n2N0HUVH.js +1 -0
  152. package/packages/client/dist/assets/gnuplot-DdkO51Og.js +1 -0
  153. package/packages/client/dist/assets/go-CxLEBnE3.js +1 -0
  154. package/packages/client/dist/assets/graphql-ChdNCCLP.js +1 -0
  155. package/packages/client/dist/assets/groovy-gcz8RCvz.js +1 -0
  156. package/packages/client/dist/assets/gruvbox-dark-hard-CFHQjOhq.js +1 -0
  157. package/packages/client/dist/assets/gruvbox-dark-medium-GsRaNv29.js +1 -0
  158. package/packages/client/dist/assets/gruvbox-dark-soft-CVdnzihN.js +1 -0
  159. package/packages/client/dist/assets/gruvbox-light-hard-CH1njM8p.js +1 -0
  160. package/packages/client/dist/assets/gruvbox-light-medium-DRw_LuNl.js +1 -0
  161. package/packages/client/dist/assets/gruvbox-light-soft-hJgmCMqR.js +1 -0
  162. package/packages/client/dist/assets/hack-CaT9iCJl.js +1 -0
  163. package/packages/client/dist/assets/haml-B8DHNrY2.js +1 -0
  164. package/packages/client/dist/assets/handlebars-BL8al0AC.js +1 -0
  165. package/packages/client/dist/assets/haskell-Df6bDoY_.js +1 -0
  166. package/packages/client/dist/assets/haxe-CzTSHFRz.js +1 -0
  167. package/packages/client/dist/assets/hcl-BWvSN4gD.js +1 -0
  168. package/packages/client/dist/assets/hjson-D5-asLiD.js +1 -0
  169. package/packages/client/dist/assets/hlsl-D3lLCCz7.js +1 -0
  170. package/packages/client/dist/assets/horizon-BUw7H-hv.js +1 -0
  171. package/packages/client/dist/assets/houston-DnULxvSX.js +1 -0
  172. package/packages/client/dist/assets/html-GMplVEZG.js +1 -0
  173. package/packages/client/dist/assets/html-derivative-BFtXZ54Q.js +1 -0
  174. package/packages/client/dist/assets/http-jrhK8wxY.js +1 -0
  175. package/packages/client/dist/assets/hurl-irOxFIW8.js +1 -0
  176. package/packages/client/dist/assets/hxml-Bvhsp5Yf.js +1 -0
  177. package/packages/client/dist/assets/hy-DFXneXwc.js +1 -0
  178. package/packages/client/dist/assets/imba-DGztddWO.js +1 -0
  179. package/packages/client/dist/assets/index-B0nLATLY.js +65 -0
  180. package/packages/client/dist/assets/index-BRi6al6L.js +99 -0
  181. package/packages/client/dist/assets/index-DXO1sSe9.css +1 -0
  182. package/packages/client/dist/assets/ini-BEwlwnbL.js +1 -0
  183. package/packages/client/dist/assets/java-CylS5w8V.js +1 -0
  184. package/packages/client/dist/assets/javascript-wDzz0qaB.js +1 -0
  185. package/packages/client/dist/assets/jinja-4LBKfQ-Z.js +1 -0
  186. package/packages/client/dist/assets/jison-wvAkD_A8.js +1 -0
  187. package/packages/client/dist/assets/json-Cp-IABpG.js +1 -0
  188. package/packages/client/dist/assets/json5-C9tS-k6U.js +1 -0
  189. package/packages/client/dist/assets/jsonc-Des-eS-w.js +1 -0
  190. package/packages/client/dist/assets/jsonl-DcaNXYhu.js +1 -0
  191. package/packages/client/dist/assets/jsonnet-DFQXde-d.js +1 -0
  192. package/packages/client/dist/assets/jssm-C2t-YnRu.js +1 -0
  193. package/packages/client/dist/assets/jsx-g9-lgVsj.js +1 -0
  194. package/packages/client/dist/assets/julia-CxzCAyBv.js +1 -0
  195. package/packages/client/dist/assets/kanagawa-dragon-CkXjmgJE.js +1 -0
  196. package/packages/client/dist/assets/kanagawa-lotus-CfQXZHmo.js +1 -0
  197. package/packages/client/dist/assets/kanagawa-wave-DWedfzmr.js +1 -0
  198. package/packages/client/dist/assets/kdl-DV7GczEv.js +1 -0
  199. package/packages/client/dist/assets/kotlin-BdnUsdx6.js +1 -0
  200. package/packages/client/dist/assets/kusto-DZf3V79B.js +1 -0
  201. package/packages/client/dist/assets/laserwave-DUszq2jm.js +1 -0
  202. package/packages/client/dist/assets/latex-DGMBWnxU.js +1 -0
  203. package/packages/client/dist/assets/lean-BZvkOJ9d.js +1 -0
  204. package/packages/client/dist/assets/less-B1dDrJ26.js +1 -0
  205. package/packages/client/dist/assets/light-plus-B7mTdjB0.js +1 -0
  206. package/packages/client/dist/assets/liquid-DYVedYrR.js +1 -0
  207. package/packages/client/dist/assets/llvm-BtvRca6l.js +1 -0
  208. package/packages/client/dist/assets/log-2UxHyX5q.js +1 -0
  209. package/packages/client/dist/assets/logo-BtOb2qkB.js +1 -0
  210. package/packages/client/dist/assets/lua-BaeVxFsk.js +1 -0
  211. package/packages/client/dist/assets/luau-C-HG3fhB.js +1 -0
  212. package/packages/client/dist/assets/make-CHLpvVh8.js +1 -0
  213. package/packages/client/dist/assets/markdown-B7CXSXYD.js +29 -0
  214. package/packages/client/dist/assets/markdown-Cvjx9yec.js +1 -0
  215. package/packages/client/dist/assets/marko-DZsq8hO1.js +1 -0
  216. package/packages/client/dist/assets/material-theme-D5KoaKCx.js +1 -0
  217. package/packages/client/dist/assets/material-theme-darker-BfHTSMKl.js +1 -0
  218. package/packages/client/dist/assets/material-theme-lighter-B0m2ddpp.js +1 -0
  219. package/packages/client/dist/assets/material-theme-ocean-CyktbL80.js +1 -0
  220. package/packages/client/dist/assets/material-theme-palenight-Csfq5Kiy.js +1 -0
  221. package/packages/client/dist/assets/matlab-D7o27uSR.js +1 -0
  222. package/packages/client/dist/assets/mdc-DUICxH0z.js +1 -0
  223. package/packages/client/dist/assets/mdx-Cmh6b_Ma.js +1 -0
  224. package/packages/client/dist/assets/mermaid-mWjccvbQ.js +1 -0
  225. package/packages/client/dist/assets/min-dark-CafNBF8u.js +1 -0
  226. package/packages/client/dist/assets/min-light-CTRr51gU.js +1 -0
  227. package/packages/client/dist/assets/mipsasm-CKIfxQSi.js +1 -0
  228. package/packages/client/dist/assets/mojo-B93PlW-d.js +1 -0
  229. package/packages/client/dist/assets/monokai-D4h5O-jR.js +1 -0
  230. package/packages/client/dist/assets/moonbit-Ba13S78F.js +1 -0
  231. package/packages/client/dist/assets/motion-DRu4QWVj.js +1 -0
  232. package/packages/client/dist/assets/move-IF9eRakj.js +1 -0
  233. package/packages/client/dist/assets/narrat-DRg8JJMk.js +1 -0
  234. package/packages/client/dist/assets/nextflow-BrzmwbiE.js +1 -0
  235. package/packages/client/dist/assets/nginx-BpAMiNFr.js +1 -0
  236. package/packages/client/dist/assets/night-owl-C39BiMTA.js +1 -0
  237. package/packages/client/dist/assets/night-owl-light-CMTm3GFP.js +1 -0
  238. package/packages/client/dist/assets/nim-CVrawwO9.js +1 -0
  239. package/packages/client/dist/assets/nix-CwoSXNpI.js +1 -0
  240. package/packages/client/dist/assets/nord-Ddv68eIx.js +1 -0
  241. package/packages/client/dist/assets/nushell-C-sUppwS.js +1 -0
  242. package/packages/client/dist/assets/objective-c-DXmwc3jG.js +1 -0
  243. package/packages/client/dist/assets/objective-cpp-CLxacb5B.js +1 -0
  244. package/packages/client/dist/assets/ocaml-C0hk2d4L.js +1 -0
  245. package/packages/client/dist/assets/odin-BBf5iR-q.js +1 -0
  246. package/packages/client/dist/assets/one-dark-pro-DVMEJ2y_.js +1 -0
  247. package/packages/client/dist/assets/one-light-C3Wv6jpd.js +1 -0
  248. package/packages/client/dist/assets/openscad-C4EeE6gA.js +1 -0
  249. package/packages/client/dist/assets/pascal-D93ZcfNL.js +1 -0
  250. package/packages/client/dist/assets/perl-C0TMdlhV.js +1 -0
  251. package/packages/client/dist/assets/php-Dhbhpdrm.js +1 -0
  252. package/packages/client/dist/assets/pkl-u5AG7uiY.js +1 -0
  253. package/packages/client/dist/assets/plastic-3e1v2bzS.js +1 -0
  254. package/packages/client/dist/assets/plsql-ChMvpjG-.js +1 -0
  255. package/packages/client/dist/assets/po-BTJTHyun.js +1 -0
  256. package/packages/client/dist/assets/poimandres-CS3Unz2-.js +1 -0
  257. package/packages/client/dist/assets/polar-C0HS_06l.js +1 -0
  258. package/packages/client/dist/assets/postcss-CXtECtnM.js +1 -0
  259. package/packages/client/dist/assets/powerquery-CEu0bR-o.js +1 -0
  260. package/packages/client/dist/assets/powershell-Dpen1YoG.js +1 -0
  261. package/packages/client/dist/assets/prisma-Dd19v3D-.js +1 -0
  262. package/packages/client/dist/assets/prolog-CbFg5uaA.js +1 -0
  263. package/packages/client/dist/assets/proto-C7zT0LnQ.js +1 -0
  264. package/packages/client/dist/assets/pug-CGlum2m_.js +1 -0
  265. package/packages/client/dist/assets/puppet-BMWR74SV.js +1 -0
  266. package/packages/client/dist/assets/purescript-CklMAg4u.js +1 -0
  267. package/packages/client/dist/assets/python-B6aJPvgy.js +1 -0
  268. package/packages/client/dist/assets/qml-3beO22l8.js +1 -0
  269. package/packages/client/dist/assets/qmldir-C8lEn-DE.js +1 -0
  270. package/packages/client/dist/assets/qss-IeuSbFQv.js +1 -0
  271. package/packages/client/dist/assets/r-Dspwwk_N.js +1 -0
  272. package/packages/client/dist/assets/racket-BqYA7rlc.js +1 -0
  273. package/packages/client/dist/assets/raku-DXvB9xmW.js +1 -0
  274. package/packages/client/dist/assets/razor-Uh8Bk_45.js +1 -0
  275. package/packages/client/dist/assets/red-bN70gL4F.js +1 -0
  276. package/packages/client/dist/assets/reg-C-SQnVFl.js +1 -0
  277. package/packages/client/dist/assets/regexp-CDVJQ6XC.js +1 -0
  278. package/packages/client/dist/assets/rel-C3B-1QV4.js +1 -0
  279. package/packages/client/dist/assets/review-pane-store-BLhxZHRI.js +1 -0
  280. package/packages/client/dist/assets/riscv-BM1_JUlF.js +1 -0
  281. package/packages/client/dist/assets/ron-BhRPY-oY.js +1 -0
  282. package/packages/client/dist/assets/rose-pine-dawn-DHQR4-dF.js +1 -0
  283. package/packages/client/dist/assets/rose-pine-moon-D4_iv3hh.js +1 -0
  284. package/packages/client/dist/assets/rose-pine-qdsjHGoJ.js +1 -0
  285. package/packages/client/dist/assets/rosmsg-BJDFO7_C.js +1 -0
  286. package/packages/client/dist/assets/rst-D5oM4XIm.js +1 -0
  287. package/packages/client/dist/assets/ruby-Cw6WdidG.js +1 -0
  288. package/packages/client/dist/assets/rust-B1yitclQ.js +1 -0
  289. package/packages/client/dist/assets/sas-cz2c8ADy.js +1 -0
  290. package/packages/client/dist/assets/sass-Cj5Yp3dK.js +1 -0
  291. package/packages/client/dist/assets/scala-C151Ov-r.js +1 -0
  292. package/packages/client/dist/assets/scheme-C98Dy4si.js +1 -0
  293. package/packages/client/dist/assets/scss-OYdSNvt2.js +1 -0
  294. package/packages/client/dist/assets/sdbl-DVxCFoDh.js +1 -0
  295. package/packages/client/dist/assets/shaderlab-Dg9Lc6iA.js +1 -0
  296. package/packages/client/dist/assets/shellscript-Yzrsuije.js +1 -0
  297. package/packages/client/dist/assets/shellsession-BADoaaVG.js +1 -0
  298. package/packages/client/dist/assets/slack-dark-BthQWCQV.js +1 -0
  299. package/packages/client/dist/assets/slack-ochin-DqwNpetd.js +1 -0
  300. package/packages/client/dist/assets/smalltalk-BERRCDM3.js +1 -0
  301. package/packages/client/dist/assets/snazzy-light-Bw305WKR.js +1 -0
  302. package/packages/client/dist/assets/solarized-dark-DXbdFlpD.js +1 -0
  303. package/packages/client/dist/assets/solarized-light-L9t79GZl.js +1 -0
  304. package/packages/client/dist/assets/solidity-rGO070M0.js +1 -0
  305. package/packages/client/dist/assets/soy-Brmx7dQM.js +1 -0
  306. package/packages/client/dist/assets/sparql-rVzFXLq3.js +1 -0
  307. package/packages/client/dist/assets/splunk-BtCnVYZw.js +1 -0
  308. package/packages/client/dist/assets/sql-BLtJtn59.js +1 -0
  309. package/packages/client/dist/assets/ssh-config-_ykCGR6B.js +1 -0
  310. package/packages/client/dist/assets/stata-BH5u7GGu.js +1 -0
  311. package/packages/client/dist/assets/stylus-BEDo0Tqx.js +1 -0
  312. package/packages/client/dist/assets/surrealql-Bq5Q-fJD.js +1 -0
  313. package/packages/client/dist/assets/svelte-zxCyuUbr.js +1 -0
  314. package/packages/client/dist/assets/swift-Dg5xB15N.js +1 -0
  315. package/packages/client/dist/assets/syntax-qKqB8BhQ.js +153 -0
  316. package/packages/client/dist/assets/synthwave-84-CbfX1IO0.js +1 -0
  317. package/packages/client/dist/assets/system-verilog-CnnmHF94.js +1 -0
  318. package/packages/client/dist/assets/systemd-4A_iFExJ.js +1 -0
  319. package/packages/client/dist/assets/talonscript-CkByrt1z.js +1 -0
  320. package/packages/client/dist/assets/tasl-QIJgUcNo.js +1 -0
  321. package/packages/client/dist/assets/tcl-dwOrl1Do.js +1 -0
  322. package/packages/client/dist/assets/templ-P3uqSqPl.js +1 -0
  323. package/packages/client/dist/assets/terraform-BETggiCN.js +1 -0
  324. package/packages/client/dist/assets/tex-CvyZ59Mk.js +1 -0
  325. package/packages/client/dist/assets/tokyo-night-hegEt444.js +1 -0
  326. package/packages/client/dist/assets/toml-vGWfd6FD.js +1 -0
  327. package/packages/client/dist/assets/ts-tags-zn1MmPIZ.js +1 -0
  328. package/packages/client/dist/assets/tsv-B_m7g4N7.js +1 -0
  329. package/packages/client/dist/assets/tsx-COt5Ahok.js +1 -0
  330. package/packages/client/dist/assets/turtle-BsS91CYL.js +1 -0
  331. package/packages/client/dist/assets/twig-ChbOoGGc.js +1 -0
  332. package/packages/client/dist/assets/typescript-BPQ3VLAy.js +1 -0
  333. package/packages/client/dist/assets/typespec-BGHnOYBU.js +1 -0
  334. package/packages/client/dist/assets/typst-DHCkPAjA.js +1 -0
  335. package/packages/client/dist/assets/v-BcVCzyr7.js +1 -0
  336. package/packages/client/dist/assets/vala-CsfeWuGM.js +1 -0
  337. package/packages/client/dist/assets/vb-D17OF-Vu.js +1 -0
  338. package/packages/client/dist/assets/verilog-BQ8w6xss.js +1 -0
  339. package/packages/client/dist/assets/vesper-DU1UobuO.js +1 -0
  340. package/packages/client/dist/assets/vhdl-CeAyd5Ju.js +1 -0
  341. package/packages/client/dist/assets/viml-CJc9bBzg.js +1 -0
  342. package/packages/client/dist/assets/vitesse-black-Bkuqu6BP.js +1 -0
  343. package/packages/client/dist/assets/vitesse-dark-D0r3Knsf.js +1 -0
  344. package/packages/client/dist/assets/vitesse-light-CVO1_9PV.js +1 -0
  345. package/packages/client/dist/assets/vue-DN_0RTcg.js +1 -0
  346. package/packages/client/dist/assets/vue-html-AaS7Mt5G.js +1 -0
  347. package/packages/client/dist/assets/vue-vine-CQOfvN7w.js +1 -0
  348. package/packages/client/dist/assets/vyper-CDx5xZoG.js +1 -0
  349. package/packages/client/dist/assets/wasm-CG6Dc4jp.js +1 -0
  350. package/packages/client/dist/assets/wasm-MzD3tlZU.js +1 -0
  351. package/packages/client/dist/assets/wenyan-BV7otONQ.js +1 -0
  352. package/packages/client/dist/assets/wgsl-Dx-B1_4e.js +1 -0
  353. package/packages/client/dist/assets/wikitext-BhOHFoWU.js +1 -0
  354. package/packages/client/dist/assets/wit-5i3qLPDT.js +1 -0
  355. package/packages/client/dist/assets/wolfram-lXgVvXCa.js +1 -0
  356. package/packages/client/dist/assets/xml-sdJ4AIDG.js +1 -0
  357. package/packages/client/dist/assets/xsl-CtQFsRM5.js +1 -0
  358. package/packages/client/dist/assets/xterm-B-qIQCd3.js +16 -0
  359. package/packages/client/dist/assets/xterm-Dv47L9lv.css +1 -0
  360. package/packages/client/dist/assets/yaml-Buea-lGh.js +1 -0
  361. package/packages/client/dist/assets/zenscript-DVFEvuxE.js +1 -0
  362. package/packages/client/dist/assets/zig-VOosw3JB.js +1 -0
  363. package/packages/client/dist/index.html +24 -0
  364. package/packages/server/dist/index.js +81207 -0
  365. package/packages/server/dist/index.js.map +838 -0
  366. package/packages/server/dist/pty-helper.mjs +115 -0
package/README.md ADDED
@@ -0,0 +1,214 @@
1
+ # funny
2
+
3
+ > Parallel Claude Code agent orchestration powered by git worktrees
4
+
5
+ funny is a web UI for orchestrating multiple [Claude Code](https://claude.ai/code) agents in parallel. It uses git worktrees to let each agent work on its own branch simultaneously without conflicts. Think of it as a Codex App clone powered by the [Claude Agent SDK](https://www.npmjs.com/package/@anthropic-ai/claude-agent-sdk) (`@anthropic-ai/claude-agent-sdk`).
6
+
7
+ ## Features
8
+
9
+ - **Parallel agent execution** — Run multiple Claude Code agents simultaneously on different branches
10
+ - **Git worktree isolation** — Each agent gets its own isolated working directory
11
+ - **Real-time monitoring** — WebSocket-based live updates for all agent activities
12
+ - **Git integration** — Built-in diff viewer, staging, commits, and PR creation
13
+ - **Kanban board** — Drag-and-drop task management with columns (backlog, in progress, review, done, archived)
14
+ - **Search** — Find threads by title, branch name, status, or message content with real-time filtering
15
+ - **Analytics dashboard** — Track task creation, completion rates, stage distribution, and cost metrics over time
16
+ - **MCP support** — Model Context Protocol integration
17
+ - **Automation scheduling** — Cron-based recurring tasks
18
+
19
+ ## Installation
20
+
21
+ ### Quick Start (bunx)
22
+
23
+ No installation needed! Run directly with:
24
+
25
+ ```bash
26
+ bunx @ironmussa/funny
27
+ ```
28
+
29
+ The app will start and open at `http://localhost:3001`
30
+
31
+ ### Global Installation
32
+
33
+ ```bash
34
+ bun install -g @ironmussa/funny
35
+ funny
36
+ ```
37
+
38
+ ### From Source
39
+
40
+ ```bash
41
+ git clone https://github.com/ironmussa/funny.git
42
+ cd funny
43
+ bun install
44
+ bun run build
45
+ bun start
46
+ ```
47
+
48
+ ## Requirements
49
+
50
+ - **Bun** >= 1.0.0 (install from [bun.sh](https://bun.sh))
51
+ - **Claude CLI** installed and authenticated ([claude.ai/code](https://claude.ai/code))
52
+ - **Git** installed and configured
53
+
54
+ ## Usage
55
+
56
+ ### Starting the Server
57
+
58
+ ```bash
59
+ # Default (port 3001)
60
+ funny
61
+
62
+ # Custom port
63
+ funny --port 8080
64
+
65
+ # Show all options
66
+ funny --help
67
+ ```
68
+
69
+ ### CLI Options
70
+
71
+ | Option | Description | Default |
72
+ |--------|-------------|---------|
73
+ | `-p, --port <port>` | Server port | `3001` |
74
+ | `-h, --host <host>` | Server host | `127.0.0.1` |
75
+ | `--help` | Show help message | - |
76
+
77
+ ### Environment Variables
78
+
79
+ | Variable | Description | Default |
80
+ |----------|-------------|---------|
81
+ | `PORT` | Server port | `3001` |
82
+ | `HOST` | Server hostname | `127.0.0.1` |
83
+ | `CORS_ORIGIN` | Custom CORS origins (comma-separated) | Auto-configured |
84
+
85
+ ## Kanban Board
86
+
87
+ Threads can be visualized and managed as a Kanban board with five columns:
88
+
89
+ - **Backlog** — Tasks waiting to be started
90
+ - **In Progress** — Tasks currently being worked on
91
+ - **Review** — Tasks ready for code review
92
+ - **Done** — Completed tasks
93
+ - **Archived** — Archived tasks
94
+
95
+ Drag and drop cards between columns to update their stage. Cards show thread status, git sync state, cost, and time since last update. Pinned threads appear first in each column. You can create new threads directly from the board and switch between list and board views.
96
+
97
+ ## Search & Filtering
98
+
99
+ Find threads quickly using the search bar. Search matches against:
100
+
101
+ - **Thread title**
102
+ - **Branch name**
103
+ - **Thread status**
104
+ - **Message content** (server-side full-text search with content snippets)
105
+
106
+ Results highlight matching text. Combine search with filters for status, git state, and mode to narrow results further. Filters sync to URL query parameters so you can share filtered views.
107
+
108
+ ## Analytics
109
+
110
+ The analytics dashboard provides an overview of task activity and costs:
111
+
112
+ - **Metric cards** — Tasks created, completed, moved to review/done/archived, and total cost
113
+ - **Stage distribution chart** — Pie chart showing current distribution of threads across stages
114
+ - **Timeline chart** — Bar chart showing task activity over time, grouped by day/week/month/year
115
+
116
+ Filter analytics by project and time range (day, week, month, or all-time).
117
+
118
+ ## Development
119
+
120
+ ```bash
121
+ # Install dependencies
122
+ bun install
123
+
124
+ # Run in development mode (client + server with hot reload)
125
+ bun run dev
126
+
127
+ # Run only server (port 3001)
128
+ bun run dev:server
129
+
130
+ # Run only client (port 5173)
131
+ bun run dev:client
132
+
133
+ # Build for production
134
+ bun run build
135
+
136
+ # Database operations
137
+ bun run db:push # Push schema changes
138
+ bun run db:studio # Open Drizzle Studio
139
+
140
+ # Run tests
141
+ bun test
142
+ ```
143
+
144
+ ## Architecture
145
+
146
+ ### Monorepo Structure
147
+
148
+ - **`packages/shared`** — Shared TypeScript types
149
+ - **`packages/server`** — Hono HTTP server with [Claude Agent SDK](https://www.npmjs.com/package/@anthropic-ai/claude-agent-sdk) (port 3001)
150
+ - **`packages/client`** — React 19 + Vite SPA (port 5173 in dev)
151
+
152
+ ### Tech Stack
153
+
154
+ **Server:**
155
+ - Hono (HTTP framework)
156
+ - [Claude Agent SDK](https://www.npmjs.com/package/@anthropic-ai/claude-agent-sdk) (`@anthropic-ai/claude-agent-sdk`)
157
+ - Drizzle ORM + SQLite
158
+ - WebSocket (real-time updates)
159
+
160
+ **Client:**
161
+ - React 19
162
+ - Vite
163
+ - Zustand (state management)
164
+ - shadcn/ui (components)
165
+ - Tailwind CSS
166
+
167
+ ## Data Storage
168
+
169
+ All data is stored in:
170
+
171
+ ```
172
+ ~/.funny/
173
+ ├── data.db # SQLite database (projects, threads, messages)
174
+ └── auth-token # Bearer token for authentication
175
+ ```
176
+
177
+ ## Git Worktrees
178
+
179
+ Worktrees are created in `.funny-worktrees/` adjacent to your project:
180
+
181
+ ```
182
+ /your-project/
183
+ ├── .git/
184
+ ├── src/
185
+ └── ...
186
+
187
+ /your-project-worktrees/
188
+ ├── feature-branch-1/
189
+ ├── feature-branch-2/
190
+ └── ...
191
+ ```
192
+
193
+ Each worktree is an isolated working directory allowing parallel agent work without conflicts.
194
+
195
+ ## Commands
196
+
197
+ See [CLAUDE.md](./CLAUDE.md) for detailed commands and architecture documentation.
198
+
199
+ ## License
200
+
201
+ MIT
202
+
203
+ ## Support
204
+
205
+ - [GitHub Issues](https://github.com/ironmussa/funny/issues)
206
+ - [Claude Code Documentation](https://claude.ai/code)
207
+
208
+ ## Contributing
209
+
210
+ Contributions are welcome! Please read [CLAUDE.md](./CLAUDE.md) for development guidelines.
211
+
212
+ ---
213
+
214
+ Built with [Claude Code](https://claude.ai/code)
package/bin/funny.js ADDED
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/env bun
2
+ import { parseArgs } from 'util';
3
+ import { resolve } from 'path';
4
+ import { existsSync } from 'fs';
5
+
6
+ // Parse CLI arguments
7
+ const { values } = parseArgs({
8
+ options: {
9
+ port: {
10
+ type: 'string',
11
+ short: 'p',
12
+ default: '3001',
13
+ },
14
+ host: {
15
+ type: 'string',
16
+ short: 'h',
17
+ default: '127.0.0.1',
18
+ },
19
+ 'auth-mode': {
20
+ type: 'string',
21
+ default: 'local',
22
+ },
23
+ help: {
24
+ type: 'boolean',
25
+ },
26
+ },
27
+ allowPositionals: true,
28
+ });
29
+
30
+ if (values.help) {
31
+ console.log(`
32
+ funny - Parallel Claude Code agent orchestration
33
+
34
+ Usage:
35
+ funny [options]
36
+
37
+ Options:
38
+ -p, --port <port> Server port (default: 3001)
39
+ -h, --host <host> Server host (default: 127.0.0.1)
40
+ --auth-mode <mode> Authentication mode: local | multi (default: local)
41
+ --help Show this help message
42
+
43
+ Examples:
44
+ funny # Start on http://127.0.0.1:3001
45
+ funny --port 8080 # Start on custom port
46
+ funny --auth-mode multi # Start in multi-user mode
47
+
48
+ Environment Variables:
49
+ PORT Server port
50
+ HOST Server host
51
+ AUTH_MODE Authentication mode (local or multi)
52
+ CORS_ORIGIN Custom CORS origins (comma-separated)
53
+
54
+ For more information, visit: https://github.com/anthropics/funny
55
+ `);
56
+ process.exit(0);
57
+ }
58
+
59
+ // Set environment variables from CLI args
60
+ process.env.PORT = values.port;
61
+ process.env.HOST = values.host;
62
+ process.env.AUTH_MODE = values['auth-mode'];
63
+
64
+ // Resolve server entry point
65
+ const serverEntry = resolve(import.meta.dir, '../packages/server/dist/index.js');
66
+ const serverSrc = resolve(import.meta.dir, '../packages/server/src/index.ts');
67
+
68
+ // Check if built version exists, otherwise use source (for development)
69
+ if (existsSync(serverEntry)) {
70
+ console.log('[funny] Starting from built server...');
71
+ await import(serverEntry);
72
+ } else if (existsSync(serverSrc)) {
73
+ console.log('[funny] Built server not found, starting from source...');
74
+ console.log('[funny] Run "npm run build" for production use.');
75
+ await import(serverSrc);
76
+ } else {
77
+ console.error('[funny] Error: Server files not found.');
78
+ console.error('Please run "npm install" and "npm run build" first.');
79
+ process.exit(1);
80
+ }
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@ironmussa/funny",
3
+ "version": "0.1.0",
4
+ "private": false,
5
+ "description": "Codex App clone powered by Claude Code — parallel agent orchestration with git worktrees",
6
+ "author": "Anthropic",
7
+ "license": "MIT",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/ironmussa/funny.git"
11
+ },
12
+ "bin": {
13
+ "funny": "./bin/funny.js"
14
+ },
15
+ "files": [
16
+ "bin",
17
+ "packages/server/dist",
18
+ "packages/client/dist"
19
+ ],
20
+ "engines": {
21
+ "bun": ">=1.0.0"
22
+ },
23
+ "workspaces": [
24
+ "packages/*"
25
+ ],
26
+ "scripts": {
27
+ "start": "bun ./bin/funny.js",
28
+ "dev": "concurrently --kill-others \"bun run --cwd packages/server dev\" \"bun run --cwd packages/client dev\"",
29
+ "dev:server": "bun run --cwd packages/server dev",
30
+ "dev:client": "bun run --cwd packages/client dev",
31
+ "dev:agent": "bun run --cwd packages/agent dev",
32
+ "build": "bun run --cwd packages/client build && bun run --cwd packages/server build",
33
+ "prepublishOnly": "npm run build",
34
+ "db:push": "bun run --cwd packages/server db:push",
35
+ "db:studio": "bun run --cwd packages/server db:studio",
36
+ "tauri": "tauri",
37
+ "tauri:dev": "tauri dev",
38
+ "tauri:build": "tauri build",
39
+ "build:sidecar": "node scripts/build-sidecar.js",
40
+ "test": "bun run --cwd packages/shared test && bun run --cwd packages/core test && bun run --cwd packages/agent test && bun run --cwd packages/server test && bun run --cwd packages/client test"
41
+ },
42
+ "devDependencies": {
43
+ "@tauri-apps/api": "^2.10.1",
44
+ "@tauri-apps/cli": "^2.10.0",
45
+ "@tauri-apps/plugin-shell": "^2.3.5",
46
+ "concurrently": "^9.2.1",
47
+ "neverthrow": "^8.2.0"
48
+ },
49
+ "dependencies": {
50
+ "node-pty": "^1.1.0"
51
+ },
52
+ "optionalDependencies": {
53
+ "playwright": "^1.50.0",
54
+ "@openai/codex-sdk": "^0.101.0"
55
+ },
56
+ "resolutions": {
57
+ "esbuild": ">=0.24.3"
58
+ }
59
+ }
@@ -0,0 +1 @@
1
+ import{d as a,j as e}from"./markdown-B7CXSXYD.js";import{$ as q,d as te,a as j,D as ce,e as oe,f as ie,g as de,B as i,aY as ue,aV as ne,S as me,I as V,a5 as xe,aZ as ke,o as he,j as fe,l as X,L as U,X as ye,ai as Ce,E as Pe,az as Se,aE as Q,t as R,q as Re,h as Ie}from"./index-BRi6al6L.js";import{A as De}from"./arrow-right-3Bby9NNK.js";import"./syntax-qKqB8BhQ.js";import"./motion-DRu4QWVj.js";const ze=[["path",{d:"M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4",key:"tonef"}],["path",{d:"M9 18c-4.51 2-5-2-7-2",key:"9comsn"}]],ee=q("github",ze);const Fe=[["path",{d:"M10 16h.01",key:"1bzywj"}],["path",{d:"M2.212 11.577a2 2 0 0 0-.212.896V18a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-5.527a2 2 0 0 0-.212-.896L18.55 5.11A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z",key:"18tbho"}],["path",{d:"M21.946 12.013H2.054",key:"zqlbp7"}],["path",{d:"M6 16h.01",key:"1pmjb7"}]],Me=q("hard-drive",Fe);const _e=[["path",{d:"M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8",key:"5wwlr5"}],["path",{d:"M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z",key:"r6nss1"}]],Ee=q("house",_e);const Ae=[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]],le=q("lock",Ae);const Oe=[["path",{d:"m16 17 5-5-5-5",key:"1bji2h"}],["path",{d:"M21 12H9",key:"dn1m92"}],["path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4",key:"1uf3rs"}]],Ge=q("log-out",Oe);function Le(t){if(!t)return[];const y=/^[A-Za-z]:\\/.test(t),d=y?"\\":"/",u=t.split(d).filter(Boolean),c=[];if(y){c.push({label:u[0],path:u[0]+"\\"});for(let l=1;l<u.length;l++)c.push({label:u[l],path:u.slice(0,l+1).join(d)+(l<u.length-1,"")})}else{c.push({label:"/",path:"/"});for(let l=0;l<u.length;l++)c.push({label:u[l],path:"/"+u.slice(0,l+1).join(d)})}return c}function pe({onSelect:t,onClose:y}){const{t:d}=te(),[u,c]=a.useState(""),[l,g]=a.useState(null),[v,N]=a.useState([]),[A,O]=a.useState([]),[M,_]=a.useState(""),[f,P]=a.useState(!0),[w,I]=a.useState(""),[S,r]=a.useState(""),m=a.useRef([]),h=a.useRef(-1),[E,H]=a.useState(-1),G=a.useRef(!1),Z=E>0,Y=E<m.current.length-1;a.useEffect(()=>{(async()=>{const n=await j.browseRoots();if(n.isErr()){I(n.error.message),P(!1);return}const o=n.value;O(o.roots||[]),_(o.home||"");const x=localStorage.getItem("funny:last-browse-path");if(x&&x!==o.home){const z=await j.browseList(x);z.isErr()||z.value.error?(localStorage.removeItem("funny:last-browse-path"),k(o.home)):(c(z.value.path),g(z.value.parent),N(z.value.dirs),L(z.value.path),P(!1))}else k(o.home)})()},[]);const W=a.useMemo(()=>{if(!S.trim())return v;const n=S.toLowerCase();return v.filter(o=>o.name.toLowerCase().includes(n))},[v,S]),L=a.useCallback(n=>{if(G.current){G.current=!1;return}const o=h.current;m.current=m.current.slice(0,o+1),m.current.push(n),h.current=m.current.length-1,H(h.current)},[]),k=async n=>{P(!0),I(""),r("");const o=await j.browseList(n);if(o.isErr()){I(o.error.message),P(!1);return}const x=o.value;if(x.path&&c(x.path),x.parent!==void 0&&g(x.parent),x.dirs&&N(x.dirs),x.error){I(x.error),P(!1);return}L(x.path),localStorage.setItem("funny:last-browse-path",x.path),P(!1)},C=a.useCallback(()=>{h.current<=0||(h.current--,H(h.current),G.current=!0,k(m.current[h.current]))},[]),J=a.useCallback(()=>{h.current>=m.current.length-1||(h.current++,H(h.current),G.current=!0,k(m.current[h.current]))},[]),D=a.useMemo(()=>Le(u),[u]);return e.jsx(ce,{open:!0,onOpenChange:n=>!n&&y(),children:e.jsxs(oe,{className:"max-w-md p-0 gap-0 flex flex-col",style:{height:"480px"},children:[e.jsx(ie,{className:"p-4 pb-0",children:e.jsx(de,{className:"text-sm",children:d("folderPicker.title")})}),e.jsxs("div",{className:"flex items-center gap-1 px-4 py-2 border-b border-border bg-muted/30",children:[e.jsx(i,{variant:"ghost",size:"icon",onClick:C,disabled:!Z,className:"h-6 w-6 flex-shrink-0",title:d("folderPicker.back"),children:e.jsx(ue,{className:"h-3.5 w-3.5"})}),e.jsx(i,{variant:"ghost",size:"icon",onClick:J,disabled:!Y,className:"h-6 w-6 flex-shrink-0",title:d("folderPicker.forward"),children:e.jsx(De,{className:"h-3.5 w-3.5"})}),e.jsxs("div",{className:"flex-1 flex items-center gap-0.5 overflow-x-auto no-scrollbar min-w-0",children:[D.length===0&&e.jsx("span",{className:"text-xs text-muted-foreground",children:d("folderPicker.loading")}),D.map((n,o)=>e.jsxs("div",{className:"flex items-center gap-0.5 flex-shrink-0",children:[o>0&&e.jsx(ne,{className:"h-3 w-3 text-muted-foreground/50 flex-shrink-0"}),e.jsx("button",{onClick:()=>k(n.path),className:`text-xs px-1 py-0.5 rounded hover:bg-accent hover:text-foreground transition-colors truncate max-w-[120px] ${o===D.length-1?"text-foreground font-medium":"text-muted-foreground"}`,title:n.path,children:n.label})]},n.path))]})]}),e.jsxs("div",{className:"flex gap-1 px-4 py-1.5 border-b border-border",children:[e.jsxs(i,{variant:"ghost",size:"sm",onClick:()=>k(M),className:"h-6 text-xs text-muted-foreground px-2",children:[e.jsx(Ee,{className:"h-3 w-3 mr-1"}),d("folderPicker.home")]}),A.map(n=>e.jsxs(i,{variant:"ghost",size:"sm",onClick:()=>k(n),className:"h-6 text-xs text-muted-foreground px-2",title:n,children:[e.jsx(Me,{className:"h-3 w-3 mr-1"}),n.replace(":\\","")]},n))]}),!f&&v.length>0&&e.jsx("div",{className:"px-4 py-2 border-b border-border",children:e.jsxs("div",{className:"relative",children:[e.jsx(me,{className:"absolute left-2 top-1/2 -translate-y-1/2 h-3 w-3 text-muted-foreground"}),e.jsx(V,{type:"text",value:S,onChange:n=>r(n.target.value),placeholder:d("folderPicker.searchPlaceholder"),className:"h-7 pl-7 pr-2 text-xs",autoFocus:!1})]})}),e.jsxs(xe,{className:"flex-1 p-2",children:[w&&e.jsx("p",{className:"text-xs text-status-error px-2 py-1",children:w}),f&&!w&&e.jsx("p",{className:"text-xs text-muted-foreground px-2 py-4 text-center",children:d("folderPicker.loading")}),!f&&v.length===0&&!w&&e.jsx("p",{className:"text-xs text-muted-foreground px-2 py-4 text-center",children:d("folderPicker.noSubdirs")}),!f&&v.length>0&&W.length===0&&e.jsx("p",{className:"text-xs text-muted-foreground px-2 py-4 text-center",children:d("folderPicker.noResults")}),W.map(n=>e.jsxs("button",{onClick:()=>k(n.path),className:"w-full flex items-center gap-2 rounded-md px-2 py-1.5 text-left text-xs text-muted-foreground hover:bg-accent hover:text-foreground transition-colors",children:[e.jsx(ke,{className:"h-3.5 w-3.5 flex-shrink-0 text-status-info"}),e.jsx("span",{className:"truncate",children:n.name}),e.jsx(ne,{className:"h-3 w-3 flex-shrink-0 ml-auto opacity-40"})]},n.path))]}),e.jsxs(he,{className:"p-4 border-t border-border",children:[e.jsx(i,{variant:"outline",size:"sm",onClick:y,children:d("folderPicker.cancel")}),e.jsx(i,{size:"sm",onClick:()=>t(u),disabled:!u,children:d("folderPicker.selectFolder")})]})]})})}function Ve(){const{t}=te(),y=fe(),d=X(s=>s.loadProjects),u=X(s=>s.setAddProjectOpen),[c,l]=a.useState("checking"),[g,v]=a.useState(null),[N,A]=a.useState(""),[O,M]=a.useState(""),[_,f]=a.useState(""),[P,w]=a.useState(5),[I,S]=a.useState(!1),r=a.useRef(null),[m,h]=a.useState([]),[E,H]=a.useState(""),[G,Z]=a.useState(1),[Y,W]=a.useState(!1),[L,k]=a.useState(!1),[C,J]=a.useState(null),[D,n]=a.useState(""),[o,x]=a.useState(""),[z,K]=a.useState(!1),[He,se]=a.useState(!1),T=a.useRef(null);a.useEffect(()=>{(async()=>{const s=await j.githubStatus();s.isOk()&&s.value.connected?(await ae(),l("repos")):l("connect")})()},[]);const ae=async()=>{const s=await j.githubUser();s.isOk()&&v(s.value)},$=a.useCallback(async(s,b,F=!1)=>{k(!0);const p=await j.githubRepos({page:b,per_page:30,search:s||void 0,sort:"updated"});p.isOk()&&(h(B=>F?[...B,...p.value.repos]:p.value.repos),W(p.value.hasMore)),k(!1)},[]);a.useEffect(()=>{c==="repos"&&$("",1)},[c,$]),a.useEffect(()=>{if(c==="repos")return T.current&&clearTimeout(T.current),T.current=setTimeout(()=>{Z(1),$(E,1)},300),()=>{T.current&&clearTimeout(T.current)}},[E,c,$]),a.useEffect(()=>()=>{r.current&&clearInterval(r.current)},[]);const ge=async()=>{const s=await j.githubStartDevice();if(s.isErr()){R.error(s.error.message);return}const b=s.value;A(b.device_code),M(b.user_code),f(b.verification_uri),w(b.interval),l("device-flow"),re(b.device_code,b.interval)},re=(s,b)=>{r.current&&clearInterval(r.current),r.current=setInterval(async()=>{const F=await j.githubPoll(s);if(F.isErr())return;const p=F.value;p.status==="success"?(r.current&&clearInterval(r.current),await ae(),l("repos"),R.success(t("github.connected",{login:""}))):p.status==="expired"||p.status==="denied"?(r.current&&clearInterval(r.current),R.error(p.status==="expired"?t("github.deviceFlow.expired"):t("github.deviceFlow.denied")),l("connect")):p.interval&&(r.current&&clearInterval(r.current),re(s,p.interval))},(b+1)*1e3)},je=()=>{navigator.clipboard.writeText(O),S(!0),setTimeout(()=>S(!1),2e3)},ve=s=>{J(s),x(s.name),l("clone-config")},be=async()=>{if(!C||!D||!o)return;se(!0),l("cloning");const s=await j.cloneRepo(C.clone_url,D,o);if(s.isErr()){R.error(s.error.message),se(!1),l("clone-config");return}R.success(t("github.clone.success")),await d(),u(!1),y(`/projects/${s.value.id}`)},Ne=async()=>{await j.githubDisconnect(),v(null),h([]),l("connect"),R.success(t("github.disconnected"))},we=s=>{const b=Date.now()-new Date(s).getTime(),F=Math.floor(b/6e4);if(F<60)return t("time.minutes",{count:F});const p=Math.floor(F/60);if(p<24)return t("time.hours",{count:p});const B=Math.floor(p/24);return B<30?t("time.days",{count:B}):t("time.months",{count:Math.floor(B/30)})};return c==="checking"?e.jsx("div",{className:"flex items-center justify-center py-12",children:e.jsx(U,{className:"h-5 w-5 animate-spin text-muted-foreground"})}):c==="connect"?e.jsxs("div",{className:"flex flex-col items-center gap-4 py-8",children:[e.jsx("div",{className:"w-12 h-12 rounded-full bg-muted flex items-center justify-center",children:e.jsx(ee,{className:"h-6 w-6"})}),e.jsxs("div",{className:"text-center space-y-1",children:[e.jsx("h3",{className:"font-medium",children:t("github.connectGithub")}),e.jsx("p",{className:"text-sm text-muted-foreground max-w-xs",children:t("github.connectDesc")})]}),e.jsxs(i,{onClick:ge,children:[e.jsx(ee,{className:"h-4 w-4 mr-2"}),t("github.connectGithub")]})]}):c==="device-flow"?e.jsxs("div",{className:"flex flex-col items-center gap-5 py-8",children:[e.jsxs("div",{className:"text-center space-y-1",children:[e.jsx("h3",{className:"font-medium",children:t("github.deviceFlow.title")}),e.jsx("p",{className:"text-sm text-muted-foreground",children:t("github.deviceFlow.desc")})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("code",{className:"text-2xl font-mono font-bold tracking-widest bg-muted px-4 py-2 rounded-md",children:O}),e.jsx(i,{variant:"outline",size:"sm",onClick:je,children:I?e.jsx(ye,{className:"h-4 w-4"}):e.jsx(Ce,{className:"h-4 w-4"})})]}),e.jsx("div",{className:"flex gap-2",children:e.jsxs(i,{variant:"outline",onClick:()=>window.open(_,"_blank"),children:[e.jsx(Pe,{className:"h-4 w-4 mr-2"}),t("github.deviceFlow.openGithub")]})}),e.jsxs("div",{className:"flex items-center gap-2 text-sm text-muted-foreground",children:[e.jsx(U,{className:"h-4 w-4 animate-spin"}),t("github.deviceFlow.waitingAuth")]}),e.jsx(i,{variant:"ghost",size:"sm",className:"text-muted-foreground",onClick:()=>{r.current&&clearInterval(r.current),l("connect")},children:t("common.cancel")})]}):c==="repos"?e.jsxs("div",{className:"flex flex-col h-full",children:[g&&e.jsxs("div",{className:"flex items-center gap-2 mb-3",children:[e.jsx("img",{src:g.avatar_url,alt:g.login,className:"h-6 w-6 rounded-full"}),e.jsx("span",{className:"text-sm font-medium",children:g.login}),e.jsxs(i,{variant:"ghost",size:"sm",className:"ml-auto h-7 text-xs text-muted-foreground",onClick:Ne,children:[e.jsx(Ge,{className:"h-3 w-3 mr-1"}),t("github.disconnect")]})]}),e.jsxs("div",{className:"relative mb-3",children:[e.jsx(me,{className:"absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground"}),e.jsx(V,{className:"w-full h-auto pl-8 pr-3 py-1.5",placeholder:t("github.repos.searchPlaceholder"),value:E,onChange:s=>H(s.target.value)})]}),e.jsxs(xe,{className:"flex-1 -mx-1",children:[m.map(s=>e.jsxs("button",{onClick:()=>ve(s),className:"w-full flex flex-col gap-0.5 rounded-md px-3 py-2 text-left hover:bg-accent transition-colors",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-sm font-medium truncate",children:s.full_name}),s.private?e.jsx(le,{className:"h-3 w-3 text-status-pending flex-shrink-0"}):e.jsx(Se,{className:"h-3 w-3 text-muted-foreground flex-shrink-0"})]}),s.description&&e.jsx("p",{className:"text-xs text-muted-foreground truncate",children:s.description}),e.jsxs("div",{className:"flex items-center gap-3 text-xs text-muted-foreground",children:[s.language&&e.jsx("span",{children:s.language}),e.jsx("span",{children:we(s.updated_at)})]})]},s.id)),L&&e.jsx("div",{className:"flex justify-center py-4",children:e.jsx(U,{className:"h-4 w-4 animate-spin text-muted-foreground"})}),!L&&m.length===0&&e.jsx("p",{className:"text-sm text-muted-foreground text-center py-8",children:t("github.repos.noRepos")}),Y&&!L&&e.jsx("div",{className:"flex justify-center py-2",children:e.jsx(i,{variant:"ghost",size:"sm",onClick:()=>{const s=G+1;Z(s),$(E,s,!0)},children:t("github.repos.loadMore")})})]})]}):c==="clone-config"&&C?e.jsxs("div",{className:"space-y-4",children:[e.jsxs(i,{variant:"ghost",size:"sm",className:"text-muted-foreground -ml-2",onClick:()=>l("repos"),children:[e.jsx(ue,{className:"h-3.5 w-3.5 mr-1"}),t("github.repos.title")]}),e.jsxs("div",{className:"rounded-md border border-border p-3 space-y-1",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-sm font-medium",children:C.full_name}),C.private&&e.jsx(le,{className:"h-3 w-3 text-status-pending"})]}),C.description&&e.jsx("p",{className:"text-xs text-muted-foreground",children:C.description})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-sm font-medium mb-1.5 block",children:t("github.clone.destination")}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(V,{className:"flex-1",placeholder:t("github.clone.destinationDesc"),value:D,onChange:s=>n(s.target.value)}),e.jsx(i,{variant:"outline",size:"sm",onClick:()=>K(!0),children:e.jsx(Q,{className:"h-4 w-4"})})]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-sm font-medium mb-1.5 block",children:t("github.clone.projectName")}),e.jsx(V,{value:o,onChange:s=>x(s.target.value)})]}),e.jsxs("div",{className:"flex gap-2 pt-2",children:[e.jsx(i,{variant:"outline",className:"flex-1",onClick:()=>l("repos"),children:t("common.cancel")}),e.jsx(i,{className:"flex-1",onClick:be,disabled:!D||!o,children:t("github.clone.cloneAndCreate")})]}),z&&e.jsx(pe,{onSelect:s=>{n(s),K(!1)},onClose:()=>K(!1)})]}):c==="cloning"?e.jsxs("div",{className:"flex flex-col items-center gap-4 py-12",children:[e.jsx(U,{className:"h-8 w-8 animate-spin text-primary"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:t("github.clone.cloning",{repo:C?.full_name})})]}):null}function Ze(){const{t}=te(),y=fe(),d=X(r=>r.loadProjects),u=X(r=>r.setAddProjectOpen),[c,l]=a.useState("local"),[g,v]=a.useState(""),[N,A]=a.useState(""),[O,M]=a.useState(!1),[_,f]=a.useState(!1),[P,w]=a.useState(!1),I=async()=>{w(!1),f(!0);const r=await j.gitInit(N);if(r.isErr()){R.error(r.error.message),f(!1);return}const m=await j.createProject(g,N);if(m.isErr()){R.error(m.error.message),f(!1);return}await d(),u(!1),y(`/projects/${m.value.id}`),f(!1)},S=async()=>{if(!g||!N||_)return;f(!0);const r=await j.createProject(g,N);if(r.isErr()){if(r.error.message?.includes("Not a git repository")){f(!1),w(!0);return}R.error(r.error.message),f(!1);return}await d(),u(!1),y(`/projects/${r.value.id}`),f(!1)};return e.jsxs("div",{className:"flex-1 flex items-center justify-center",children:[e.jsxs("div",{className:"w-full max-w-md space-y-6 px-4",children:[e.jsxs("div",{className:"text-center space-y-2",children:[e.jsx("div",{className:"mx-auto w-12 h-12 rounded-full bg-primary/10 flex items-center justify-center",children:e.jsx(Re,{className:"h-6 w-6 text-primary"})}),e.jsx("h2",{className:"text-xl font-semibold",children:t("sidebar.addProject")})]}),e.jsxs("div",{className:"flex gap-1 rounded-lg bg-muted p-1",children:[e.jsxs("button",{className:`flex-1 flex items-center justify-center gap-1.5 rounded-md px-3 py-1.5 text-sm font-medium transition-colors ${c==="local"?"bg-background text-foreground shadow-sm":"text-muted-foreground hover:text-foreground"}`,onClick:()=>l("local"),children:[e.jsx(Q,{className:"h-3.5 w-3.5"}),t("github.localFolder")]}),e.jsxs("button",{className:`flex-1 flex items-center justify-center gap-1.5 rounded-md px-3 py-1.5 text-sm font-medium transition-colors ${c==="github"?"bg-background text-foreground shadow-sm":"text-muted-foreground hover:text-foreground"}`,onClick:()=>l("github"),children:[e.jsx(ee,{className:"h-3.5 w-3.5"}),t("github.cloneFromGithub")]})]}),c==="local"?e.jsxs("div",{className:"space-y-4",children:[e.jsx("p",{className:"text-sm text-muted-foreground text-center",children:t("sidebar.addProjectDescription",{defaultValue:"Enter the project name and select the folder path."})}),e.jsxs("div",{children:[e.jsx("label",{className:"text-sm font-medium mb-1.5 block",children:t("sidebar.projectName")}),e.jsx(V,{placeholder:t("sidebar.projectName"),value:g,onChange:r=>v(r.target.value),autoFocus:!0})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-sm font-medium mb-1.5 block",children:t("sidebar.absolutePath")}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(V,{className:"flex-1",placeholder:t("sidebar.absolutePath"),value:N,onChange:r=>A(r.target.value)}),e.jsx(i,{variant:"outline",size:"sm",onClick:()=>M(!0),title:t("sidebar.browseFolder"),children:e.jsx(Q,{className:"h-4 w-4"})})]})]}),e.jsxs("div",{className:"flex gap-2 pt-2",children:[e.jsx(i,{variant:"outline",className:"flex-1",onClick:()=>u(!1),children:t("common.cancel",{defaultValue:"Cancel"})}),e.jsx(i,{className:"flex-1",onClick:S,disabled:_||!g||!N,children:_?e.jsxs(e.Fragment,{children:[e.jsx(U,{className:"h-4 w-4 animate-spin mr-2"}),t("common.loading")]}):t("sidebar.add")})]})]}):e.jsx(Ve,{})]}),O&&e.jsx(pe,{onSelect:async r=>{if(A(r),M(!1),!g){const m=await j.repoName(r);if(m.isOk()&&m.value.name)v(m.value.name);else{const h=r.split(/[\\/]/).filter(Boolean).pop()||"";v(h)}}},onClose:()=>M(!1)}),e.jsx(ce,{open:P,onOpenChange:w,children:e.jsxs(oe,{children:[e.jsxs(ie,{children:[e.jsx(de,{children:t("confirm.gitInitTitle",{defaultValue:"Initialize Git Repository"})}),e.jsx(Ie,{children:t("confirm.notGitRepo",{path:N})})]}),e.jsxs(he,{children:[e.jsx(i,{variant:"outline",onClick:()=>w(!1),children:t("common.cancel",{defaultValue:"Cancel"})}),e.jsx(i,{onClick:I,children:t("confirm.gitInitAction",{defaultValue:"Initialize"})})]})]})})]})}export{Ze as AddProjectView};
@@ -0,0 +1 @@
1
+ import{j as e,d as n}from"./markdown-B7CXSXYD.js";import{d as G,D as Me,e as Fe,f as Be,g as $e,h as Ee,P as Ge,i as Ke,j as pe,k as W,l as X,u as we,t as J,a as xe,m as qe,n as _e,o as He,B as Y,p as We,s as ue,c as w,q as Ne,r as ae,v as ne,w as oe,S as me,I as ze,x as Le,y as Je,z as ye,A as Ve,F as Qe,G as Xe,H as Te,J as Se,K as Ce,M as Ye,N as Ze,O as et,Q as tt,R as st,U as rt,V as at,W as Oe,X as Q,Y as ke,Z as Ie,_ as Pe}from"./index-BRi6al6L.js";import{H as De,n as V,T as nt}from"./ThreadListView-B6HvQ8NV.js";import"./syntax-qKqB8BhQ.js";import"./motion-DRu4QWVj.js";function ot({open:s,onClose:l,onSubmit:j,loading:f=!1,projectId:m}){const{t:p}=G(),x=async(h,o,g)=>{await j(h,o,g),l()};return e.jsx(Me,{open:s,onOpenChange:h=>{h||l()},children:e.jsxs(Fe,{className:"sm:max-w-3xl p-0 gap-0",children:[e.jsxs(Be,{className:"px-4 pt-4 pb-2",children:[e.jsx($e,{className:"text-sm",children:p("kanban.addThread","Add new thread")}),e.jsx(Ee,{className:"sr-only",children:p("thread.describeTask","Describe the task for the agent")})]}),e.jsx("div",{className:"px-4 pb-4",children:e.jsx(Ge,{onSubmit:x,loading:f,isNewThread:!0,projectId:m},m)})]})})}const Ae=["backlog","in_progress","review","done","archived"];function lt({thread:s,projectInfo:l,onDelete:j,search:f,ghost:m,contentSnippet:p}){const{t:x}=G(),h=pe(),o=Le(k=>k.statusByThread),g=n.useRef(null),[d,I]=n.useState(!1);n.useEffect(()=>{const k=g.current;if(k)return Je({element:k,getInitialData:()=>({type:"kanban-card",threadId:s.id,sourceStage:s.archived?"archived":s.stage||"backlog",projectId:s.projectId}),onDragStart:()=>I(!0),onDrop:()=>I(!1)})},[s.id,s.stage,s.archived,s.projectId]);const C=ye[s.status].icon,T=ye[s.status].className,P=o[s.id],b=P?Ve[P.state]:null,v=b?.icon;return e.jsxs("div",{ref:g,className:w("group/card relative rounded-md border bg-card p-2.5 cursor-pointer transition-opacity",d&&"opacity-40",m&&!d&&"opacity-50 hover:opacity-80"),onClick:()=>{d||h(`/projects/${s.projectId}/threads/${s.id}`)},children:[e.jsx("button",{className:"absolute top-1.5 right-1.5 p-1 rounded opacity-0 group-hover/card:opacity-100 transition-opacity hover:bg-destructive/10 hover:text-destructive text-muted-foreground",onClick:k=>{k.stopPropagation(),j(s)},children:e.jsx(Qe,{className:"h-3.5 w-3.5"})}),l&&e.jsx("span",{className:"text-xs px-1.5 py-0.5 rounded inline-block mb-1",style:{backgroundColor:l.color?`${l.color}1A`:"#3b82f61A",color:l.color||"#3b82f6"},children:l.name}),e.jsx(De,{text:s.title,query:f||"",className:"text-xs font-medium mb-1.5 line-clamp-3 pr-5 block"}),p&&f&&!V(s.title).includes(V(f))&&e.jsx(De,{text:p,query:f,className:"text-[11px] text-muted-foreground mb-1.5 line-clamp-2 block italic"}),e.jsxs("div",{className:"flex items-center justify-between gap-1.5",children:[e.jsxs("div",{className:"flex items-center gap-1 min-w-0",children:[e.jsx(C,{className:w("h-3 w-3 shrink-0",T)}),e.jsx("span",{className:"text-xs text-muted-foreground truncate",children:x(`thread.status.${s.status}`)}),s.provider==="external"&&e.jsx(Xe,{variant:"outline",className:"text-[10px] px-1 py-0 h-4 font-medium",children:"External"}),b&&v?e.jsxs(Te,{children:[e.jsx(Se,{asChild:!0,children:e.jsx(v,{className:w("h-3 w-3 shrink-0",b.className)})}),e.jsxs(Ce,{side:"top",className:"text-xs",children:[e.jsx("div",{children:x(b.labelKey)}),s.branch&&e.jsx("div",{className:"text-muted-foreground",children:s.branch})]})]}):s.branch?e.jsxs(Te,{children:[e.jsx(Se,{asChild:!0,children:e.jsx(Ye,{className:"h-3 w-3 shrink-0 text-muted-foreground"})}),e.jsx(Ce,{side:"top",className:"text-xs",children:s.branch})]}):null]}),e.jsxs("div",{className:"flex items-center gap-2 shrink-0 text-xs text-muted-foreground",children:[e.jsx("span",{children:Ze(s.completedAt||s.createdAt,x)}),s.cost>0&&e.jsxs("span",{children:["$",s.cost.toFixed(3)]})]})]})]})}function ct({projectId:s,projects:l,onSelect:j}){const{t:f}=G(),[m,p]=n.useState(!1),[x,h]=n.useState(""),o=n.useRef(null);if(s)return e.jsx("button",{className:"ml-auto p-0.5 rounded hover:bg-accent text-muted-foreground hover:text-foreground transition-colors",onClick:()=>j(s),title:f("kanban.addThread"),children:e.jsx(Ne,{className:"h-4 w-4"})});const g=x?l.filter(d=>d.name.toLowerCase().includes(x.toLowerCase())):l;return e.jsxs(ae,{open:m,onOpenChange:d=>{p(d),d||h("")},children:[e.jsx(ne,{asChild:!0,children:e.jsx("button",{className:"ml-auto p-0.5 rounded hover:bg-accent text-muted-foreground hover:text-foreground transition-colors",title:f("kanban.addThread"),children:e.jsx(Ne,{className:"h-4 w-4"})})}),e.jsxs(oe,{align:"start",className:"w-56 p-0",children:[e.jsxs("div",{className:"flex items-center gap-2 px-2.5 py-2 border-b border-border/50",children:[e.jsx(me,{className:"h-3.5 w-3.5 text-muted-foreground shrink-0"}),e.jsx(ze,{ref:o,value:x,onChange:d=>h(d.target.value),placeholder:f("kanban.searchProject"),className:"flex-1 h-auto border-0 bg-transparent text-xs shadow-none focus-visible:ring-0 px-0 py-0 placeholder:text-muted-foreground",autoFocus:!0})]}),e.jsx("div",{className:"max-h-48 overflow-y-auto py-1",children:g.length===0?e.jsx("div",{className:"text-xs text-muted-foreground text-center py-3",children:f("commandPalette.noResults")}):g.map(d=>e.jsxs("button",{className:"w-full text-left px-2.5 py-1.5 text-xs hover:bg-accent transition-colors flex items-center gap-2",onClick:()=>{p(!1),h(""),j(d.id)},children:[e.jsx("span",{className:"w-2 h-2 rounded-full shrink-0",style:{backgroundColor:d.color||"#3b82f6"}}),e.jsx("span",{className:"truncate",children:d.name})]},d.id))})]})]})}function dt({stage:s,threads:l,projectInfoById:j,onDelete:f,projectId:m,projects:p,onAddThread:x,search:h,contentSnippets:o}){const{t:g}=G(),d=n.useRef(null),[I,C]=n.useState(!1),[T,P]=n.useState(20);n.useEffect(()=>{const i=d.current;if(i)return We({element:i,getData:()=>({type:"kanban-column",stage:s}),canDrop:({source:$})=>$.data.type==="kanban-card",onDragEnter:()=>C(!0),onDragLeave:()=>C(!1),onDrop:()=>C(!1)})},[s]),n.useEffect(()=>{P(20)},[l.length]);const b=ue[s].icon,v=ue[s].className,k=l.slice(0,T),O=l.length>T;return e.jsxs("div",{ref:d,className:w("flex flex-col w-80 min-w-[20rem] flex-shrink-0 rounded-lg bg-secondary/30 transition-colors",I&&"ring-2 ring-ring bg-secondary/50"),children:[e.jsxs("div",{className:"px-3 py-2.5 border-b border-border/50 flex items-center gap-2",children:[e.jsx(b,{className:w("h-4 w-4",v)}),e.jsx("span",{className:"font-medium text-sm",children:g(ue[s].labelKey)}),e.jsxs("span",{className:"text-xs text-muted-foreground",children:["(",l.length,")"]}),p.length>0&&s!=="review"&&s!=="done"&&s!=="archived"&&e.jsx(ct,{projectId:m,projects:p,onSelect:i=>x(i,s)})]}),e.jsx("div",{className:"flex-1 overflow-y-auto p-2 space-y-2 min-h-[200px]",children:l.length===0?e.jsx("div",{className:"text-center text-xs text-muted-foreground py-8",children:g("kanban.emptyColumn")}):e.jsxs(e.Fragment,{children:[k.map(i=>e.jsx(lt,{thread:i,projectInfo:j?.[i.projectId],onDelete:f,search:h,ghost:s==="archived",contentSnippet:o?.get(i.id)},i.id)),O&&e.jsx("button",{onClick:()=>P(i=>i+20),className:"w-full py-2 text-xs text-muted-foreground hover:text-foreground hover:bg-accent rounded-md transition-colors",children:g("kanban.loadMore",{count:Math.min(20,l.length-T)})})]})})]})}function it({threads:s,projectId:l,search:j,contentSnippets:f}){const{t:m}=G();Ke();const p=pe(),x=W(r=>r.updateThreadStage),h=W(r=>r.archiveThread),o=W(r=>r.unarchiveThread),g=W(r=>r.deleteThread),d=W(r=>r.selectedThreadId),I=X(r=>r.projects),C=X(r=>r.loadThreadsForProject),T=we(r=>r.defaultThreadMode),P=we(r=>r.toolPermissions),[b,v]=n.useState(null),[k,O]=n.useState(!1),[i,$]=n.useState(void 0),[K,L]=n.useState("backlog"),[R,D]=n.useState(!1),[Z,z]=n.useState(!1),ee=n.useCallback((r,u)=>{$(r),L(u),O(!0)},[]),F=n.useCallback(r=>{v({threadId:r.id,projectId:r.projectId,title:r.title,isWorktree:r.mode==="worktree"&&!!r.branch})},[]),te=n.useCallback(async()=>{if(!b)return;z(!0);const{threadId:r,projectId:u,title:N}=b,y=d===r;await g(r,u),z(!1),v(null),J.success(m("toast.threadDeleted",{title:N})),y&&p(`/projects/${u}`)},[b,d,g,p,m]),U=n.useCallback(async(r,u,N)=>{if(!i||R)return;D(!0);const y=u.threadMode||T;if(u.sendToBacklog||K==="backlog"){const B=await xe.createIdleThread({projectId:i,title:r.slice(0,200),mode:y,baseBranch:u.baseBranch,prompt:r});if(B.isErr()){J.error(B.error.message),D(!1);return}await C(i),D(!1),J.success(m("toast.threadCreated",{title:r.slice(0,200)}))}else{const{allowedTools:B,disallowedTools:E}=qe(P),A=await xe.createThread({projectId:i,title:r.slice(0,200),mode:y,model:u.model,permissionMode:u.mode,baseBranch:u.baseBranch,prompt:r,images:N,allowedTools:B,disallowedTools:E});if(A.isErr()){J.error(A.error.message),D(!1);return}await C(i),D(!1),J.success(m("toast.threadCreated",{title:r.slice(0,200)}))}},[i,K,R,T,P,C,m]),le=n.useMemo(()=>{if(l)return;const r={};for(const u of I)r[u.id]={name:u.name,color:u.color};return r},[l,I]),q=n.useMemo(()=>{const r={backlog:[],in_progress:[],review:[],done:[],archived:[]};for(const u of s){const N=u.archived?"archived":u.stage||"backlog";r[N]&&r[N].push(u)}for(const u of Ae)r[u].sort((N,y)=>{if(N.pinned!==y.pinned)return N.pinned?-1:1;const S=N.completedAt||N.createdAt,B=y.completedAt||y.createdAt;return new Date(B).getTime()-new Date(S).getTime()});return r},[s]),_=n.useCallback(({source:r,location:u})=>{const N=u.current.dropTargets;if(!N.length||r.data.type!=="kanban-card")return;const y=r.data.threadId,S=r.data.sourceStage,B=r.data.projectId,E=N.find(ce=>ce.data.type==="kanban-column");if(!E)return;const A=E.data.stage;if(A===S)return;const H=l||B;A==="archived"?h(y,H):S==="archived"?o(y,H,A):x(y,H,A)},[l,x,h,o]);return n.useEffect(()=>_e({onDrop:_}),[_]),e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"flex gap-3 h-full overflow-x-auto p-4",children:Ae.map(r=>e.jsx(dt,{stage:r,threads:q[r],projectInfoById:le,onDelete:F,projectId:l,projects:I,onAddThread:ee,search:j,contentSnippets:f},r))}),e.jsx(Me,{open:!!b,onOpenChange:r=>{r||v(null)},children:e.jsxs(Fe,{className:"max-w-sm",children:[e.jsxs(Be,{children:[e.jsx($e,{children:m("dialog.deleteThread")}),e.jsx(Ee,{className:"break-all",children:m("dialog.deleteThreadDesc",{title:b?.title&&b.title.length>80?b.title.slice(0,80)+"…":b?.title})})]}),b?.isWorktree&&e.jsx("p",{className:"text-xs text-status-warning/80 bg-status-warning/10 rounded-md px-3 py-2",children:m("dialog.worktreeWarning")}),e.jsxs(He,{children:[e.jsx(Y,{variant:"outline",size:"sm",onClick:()=>v(null),children:m("common.cancel")}),e.jsx(Y,{variant:"destructive",size:"sm",onClick:te,loading:Z,children:m("common.delete")})]})]})}),e.jsx(ot,{open:k,onClose:()=>O(!1),onSubmit:U,loading:R,projectId:i})]})}const re=20;function he({label:s,options:l,selected:j,onToggle:f,counts:m}){const p=j.size,x=p===0?s:p===1?l.find(h=>j.has(h.value))?.label??s:`${s} (${p})`;return e.jsxs(ae,{children:[e.jsx(ne,{asChild:!0,children:e.jsxs("button",{className:w("inline-flex items-center gap-1 px-2 py-1 text-xs rounded-md border transition-colors whitespace-nowrap",p>0?"bg-accent text-accent-foreground border-accent-foreground/20":"bg-transparent text-muted-foreground border-border hover:bg-accent/50 hover:text-foreground"),children:[x,e.jsx(Oe,{className:"h-3 w-3 opacity-50"})]})}),e.jsx(oe,{align:"start",className:"w-auto min-w-[160px] p-1",children:l.map(h=>{const o=j.has(h.value),g=m?.[h.value];return e.jsxs("button",{onClick:()=>f(h.value),className:w("flex items-center gap-2 w-full px-2 py-1.5 text-xs rounded-sm transition-colors text-left","hover:bg-accent hover:text-accent-foreground",o&&"text-accent-foreground"),children:[e.jsx("span",{className:w("flex h-3.5 w-3.5 items-center justify-center rounded-sm border",o?"bg-primary border-primary text-primary-foreground":"border-muted-foreground/30"),children:o&&e.jsx(Q,{className:"h-2.5 w-2.5"})}),e.jsx("span",{className:"flex-1",children:h.label}),g!=null&&g>0&&e.jsx("span",{className:"text-muted-foreground tabular-nums",children:g})]},h.value)})})]})}function gt(){const{t:s}=G(),l=pe(),[j,f]=et(),m=X(t=>t.allThreadsProjectId),p=X(t=>t.threadsByProject),x=X(t=>t.projects),h=Le(t=>t.statusByThread),[o,g]=n.useState(()=>j.get("project")||null),[d,I]=n.useState(()=>{const t=j.get("view");if(t==="list"||t==="board")return t;const a=localStorage.getItem("threadViewMode");return a==="board"||a==="list"?a:"list"}),C=t=>{const a={},c=t?.project!==void 0?t.project:o,M=t?.view??d;return c&&(a.project=c),M==="board"&&(a.view="board"),a};n.useEffect(()=>{const t=j.get("project")||null,a=j.get("view");t!==o&&g(t),(a==="list"||a==="board")&&a!==d&&I(a)},[j]);const T=o?x.find(t=>t.id===o):null,P=t=>{g(t),i(1),f(C({project:t}),{replace:!0})},b=t=>{I(t),localStorage.setItem("threadViewMode",t),f(C({view:t}),{replace:!0})},[v,k]=n.useState(""),[O,i]=n.useState(1),[$,K]=n.useState(new Set),[L,R]=n.useState(new Set),[D,Z]=n.useState(new Set),[z,ee]=n.useState(!1),[F,te]=n.useState("updated"),[U,le]=n.useState("desc"),[q,_]=n.useState(new Map),r=n.useRef(void 0);n.useEffect(()=>{r.current&&clearTimeout(r.current);const t=v.trim();if(!t){_(new Map);return}return r.current=setTimeout(()=>{const a=o||void 0;xe.searchThreadContent(t,a).then(c=>{if(c.isOk()){const M=new Map,{threadIds:ie,snippets:se}=c.value;for(const ve of ie)M.set(ve,se[ve]||"");_(M)}})},300),()=>{r.current&&clearTimeout(r.current)}},[v,o]);const u=n.useMemo(()=>{const t={};for(const a of x)t[a.id]={name:a.name,color:a.color};return t},[x]),N=n.useMemo(()=>{const t={};for(const a of x)t[a.id]=a.name;return t},[x]),y=n.useMemo(()=>{const t=Object.values(p).flat();return o?t.filter(a=>a.projectId===o):t},[p,o]),S=n.useMemo(()=>d==="board"||z?y:y.filter(t=>!t.archived),[y,z,d]),B=tt(s),E=n.useMemo(()=>{let t=S;if(v.trim()){const a=V(v);t=t.filter(c=>V(c.title).includes(a)||c.branch&&V(c.branch).includes(a)||V(c.status).includes(a)||!o&&N[c.projectId]&&V(N[c.projectId]).includes(a)||q.has(c.id))}return $.size>0&&(t=t.filter(a=>$.has(a.status))),L.size>0&&(t=t.filter(a=>{const c=h[a.id];return c?L.has(c.state):!1})),D.size>0&&(t=t.filter(a=>D.has(a.mode))),t=[...t].sort((a,c)=>{const M=F==="updated"?a.completedAt??a.createdAt:a.createdAt,ie=F==="updated"?c.completedAt??c.createdAt:c.createdAt,se=new Date(M).getTime()-new Date(ie).getTime();return U==="desc"?-se:se}),t},[S,v,$,L,D,h,o,N,F,U,q]),A=Math.min(O,Math.max(1,Math.ceil(E.length/re))),H=E.slice((A-1)*re,A*re),ce=()=>{k(""),K(new Set),R(new Set),Z(new Set),ee(!1),o&&g(null),f(C({project:null}),{replace:!0}),i(1)},ge=t=>{k(t),i(1)},de=t=>a=>{t(c=>{const M=new Set(c);return M.has(a)?M.delete(a):M.add(a),M}),i(1)},fe=$.size>0||L.size>0||D.size>0||z||!!o;if(!m)return null;const je=n.useMemo(()=>{const t={};for(const a of S)t[a.status]=(t[a.status]||0)+1;return t},[S]),be=n.useMemo(()=>{const t={};for(const a of S){const c=h[a.id];c&&(t[c.state]=(t[c.state]||0)+1)}return t},[S,h]),Re=["running","waiting","completed","failed","stopped","pending","interrupted"],Ue=["dirty","unpushed","pushed","merged","clean"];return e.jsxs("div",{className:"flex-1 flex flex-col h-full min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-3 px-4 py-3 border-b border-border",children:[e.jsx(Y,{variant:"ghost",size:"icon-xs",onClick:()=>{l(o?`/projects/${o}`:"/")},className:"text-muted-foreground hover:text-foreground",children:o?e.jsx(st,{className:"h-4 w-4"}):e.jsx(me,{className:"h-4 w-4"})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("h2",{className:"text-sm font-medium",children:s(o&&T?"allThreads.title":"allThreads.globalTitle")}),e.jsx("p",{className:"text-xs text-muted-foreground",children:o&&T?`${T.name} · ${S.length} ${s("allThreads.threads")}`:`${x.length} ${s("allThreads.projects")} · ${S.length} ${s("allThreads.threads")}`})]}),e.jsx("div",{className:"flex items-center gap-2",children:e.jsxs("div",{className:"flex items-center gap-1 bg-secondary/50 rounded-md p-0.5",children:[e.jsx(Y,{variant:d==="list"?"secondary":"ghost",size:"icon-xs",onClick:()=>b("list"),className:"h-6 w-6",title:s("kanban.listView"),children:e.jsx(rt,{className:"h-3.5 w-3.5"})}),e.jsx(Y,{variant:d==="board"?"secondary":"ghost",size:"icon-xs",onClick:()=>b("board"),className:"h-6 w-6",title:s("kanban.boardView"),children:e.jsx(at,{className:"h-3.5 w-3.5"})})]})})]}),e.jsxs("div",{className:"px-4 py-2 border-b border-border/50 flex items-center gap-2",children:[e.jsxs("div",{className:"relative flex-shrink-0",children:[e.jsx(me,{className:"absolute left-2 top-1/2 -translate-y-1/2 h-3 w-3 text-muted-foreground text-sm"}),e.jsx(ze,{type:"text",placeholder:s(o?"allThreads.searchPlaceholder":"allThreads.globalSearchPlaceholder"),value:v,onChange:t=>ge(t.target.value),className:"w-44 h-7 pl-6 pr-2 py-1 text-xs md:text-xs bg-transparent"})]}),e.jsx("div",{className:"w-px h-4 bg-border"}),e.jsxs(ae,{children:[e.jsx(ne,{asChild:!0,children:e.jsxs("button",{className:w("inline-flex items-center gap-1 px-2 py-1 text-xs rounded-md border transition-colors whitespace-nowrap",o?"bg-accent text-accent-foreground border-accent-foreground/20":"bg-transparent text-muted-foreground border-border hover:bg-accent/50 hover:text-foreground"),children:[o&&T?T.name:s("allThreads.filterProject"),e.jsx(Oe,{className:"h-3 w-3 opacity-50"})]})}),e.jsxs(oe,{align:"start",className:"w-auto min-w-[180px] max-h-[300px] overflow-y-auto p-1",children:[e.jsxs("button",{onClick:()=>P(null),className:w("flex items-center gap-2 w-full px-2 py-1.5 text-xs rounded-sm transition-colors text-left","hover:bg-accent hover:text-accent-foreground",!o&&"text-accent-foreground"),children:[e.jsx("span",{className:w("flex h-3.5 w-3.5 items-center justify-center rounded-full border",o?"border-muted-foreground/30":"bg-primary border-primary text-primary-foreground"),children:!o&&e.jsx(Q,{className:"h-2.5 w-2.5"})}),e.jsx("span",{className:"flex-1",children:s("allThreads.allProjects")})]}),x.map(t=>{const a=o===t.id;return e.jsxs("button",{onClick:()=>P(t.id),className:w("flex items-center gap-2 w-full px-2 py-1.5 text-xs rounded-sm transition-colors text-left","hover:bg-accent hover:text-accent-foreground",a&&"text-accent-foreground"),children:[e.jsx("span",{className:w("flex h-3.5 w-3.5 items-center justify-center rounded-full border",a?"bg-primary border-primary text-primary-foreground":"border-muted-foreground/30"),children:a&&e.jsx(Q,{className:"h-2.5 w-2.5"})}),e.jsx("span",{className:"flex-1 truncate",children:t.name})]},t.id)})]})]}),e.jsx(he,{label:s("allThreads.filterStatus"),options:Re.filter(t=>(je[t]||0)>0).map(t=>({value:t,label:B[t]})),selected:$,onToggle:de(K),counts:je}),e.jsx(he,{label:"Git",options:Ue.filter(t=>(be[t]||0)>0).map(t=>({value:t,label:s(`gitStatus.${t}`)})),selected:L,onToggle:de(R),counts:be}),e.jsx(he,{label:s("allThreads.filterMode"),options:[{value:"local",label:s("thread.mode.local")},{value:"worktree",label:s("thread.mode.worktree")}],selected:D,onToggle:de(Z)}),e.jsx("div",{className:"w-px h-4 bg-border"}),e.jsxs(ae,{children:[e.jsx(ne,{asChild:!0,children:e.jsxs("button",{className:"inline-flex items-center gap-1 px-2 py-1 text-xs rounded-md border bg-transparent text-muted-foreground border-border hover:bg-accent/50 hover:text-foreground transition-colors whitespace-nowrap",children:[s("allThreads.sortLabel"),": ",s(F==="updated"?"allThreads.sortUpdated":"allThreads.sortCreated"),U==="desc"?e.jsx(ke,{className:"h-3 w-3"}):e.jsx(Ie,{className:"h-3 w-3"})]})}),e.jsxs(oe,{align:"start",className:"w-auto min-w-[140px] p-1",children:[e.jsxs("button",{onClick:()=>{te("updated"),i(1)},className:w("flex items-center gap-2 w-full px-2 py-1.5 text-xs rounded-sm transition-colors text-left","hover:bg-accent hover:text-accent-foreground"),children:[e.jsx("span",{className:w("flex h-3.5 w-3.5 items-center justify-center rounded-full border",F==="updated"?"bg-primary border-primary text-primary-foreground":"border-muted-foreground/30"),children:F==="updated"&&e.jsx(Q,{className:"h-2.5 w-2.5"})}),s("allThreads.sortUpdated")]}),e.jsxs("button",{onClick:()=>{te("created"),i(1)},className:w("flex items-center gap-2 w-full px-2 py-1.5 text-xs rounded-sm transition-colors text-left","hover:bg-accent hover:text-accent-foreground"),children:[e.jsx("span",{className:w("flex h-3.5 w-3.5 items-center justify-center rounded-full border",F==="created"?"bg-primary border-primary text-primary-foreground":"border-muted-foreground/30"),children:F==="created"&&e.jsx(Q,{className:"h-2.5 w-2.5"})}),s("allThreads.sortCreated")]}),e.jsx("div",{className:"h-px bg-border my-1"}),e.jsx("button",{onClick:()=>{le(t=>t==="desc"?"asc":"desc"),i(1)},className:"flex items-center gap-2 w-full px-2 py-1.5 text-xs rounded-sm transition-colors text-left hover:bg-accent hover:text-accent-foreground",children:U==="desc"?e.jsxs(e.Fragment,{children:[e.jsx(ke,{className:"h-3 w-3"}),s("allThreads.sortDesc")]}):e.jsxs(e.Fragment,{children:[e.jsx(Ie,{className:"h-3 w-3"}),s("allThreads.sortAsc")]})})]})]}),e.jsxs("button",{onClick:()=>{ee(!z),i(1)},className:w("inline-flex items-center gap-1 px-2 py-1 text-xs rounded-md border transition-colors whitespace-nowrap",z?"bg-status-warning/10 border-status-warning/20 text-status-warning/80":"bg-transparent text-muted-foreground border-border hover:bg-accent/50 hover:text-foreground"),children:[e.jsx(Pe,{className:"h-3 w-3"}),s("allThreads.showArchived")]}),fe&&e.jsx("button",{onClick:ce,className:"px-2 py-1 text-xs text-muted-foreground hover:text-foreground transition-colors whitespace-nowrap",children:s("allThreads.clearFilters")})]}),e.jsx("div",{className:"flex-1 min-h-0 flex flex-col",children:d==="board"?e.jsx("div",{className:"flex-1 min-h-0",children:e.jsx(it,{threads:E,projectId:o||void 0,search:v,contentSnippets:q})}):e.jsx("div",{className:"px-4 py-3 h-full",children:e.jsx(nt,{className:"h-full",autoFocusSearch:!1,threads:H,totalCount:E.length,search:v,onSearchChange:ge,searchPlaceholder:s(o?"allThreads.searchPlaceholder":"allThreads.globalSearchPlaceholder"),page:A,onPageChange:i,pageSize:re,emptyMessage:s("allThreads.noThreads"),searchEmptyMessage:s("allThreads.noMatch"),onThreadClick:t=>l(`/projects/${t.projectId}/threads/${t.id}`),paginationLabel:({total:t})=>`${t} ${s("allThreads.threads")}${v||fe?` ${s("allThreads.found")}`:""}`,hideSearch:!0,renderExtraBadges:t=>{const a=h[t.id],c=a?Ve[a.state]:null;return e.jsxs(e.Fragment,{children:[!o&&u[t.projectId]&&e.jsx("span",{className:"text-xs px-1.5 py-0.5 rounded",style:{backgroundColor:u[t.projectId].color?`${u[t.projectId].color}1A`:"#3b82f61A",color:u[t.projectId].color||"#3b82f6"},children:u[t.projectId].name}),!!t.archived&&e.jsxs("span",{className:"inline-flex items-center gap-0.5 text-xs text-status-warning/80 bg-status-warning/10 px-1.5 py-0.5 rounded",children:[e.jsx(Pe,{className:"h-2.5 w-2.5"}),s("allThreads.archived")]}),c&&e.jsx("span",{className:w("text-xs px-1.5 py-0.5 rounded bg-secondary",c.className),children:s(c.labelKey)}),e.jsx("span",{className:"text-xs text-muted-foreground bg-secondary px-1.5 py-0.5 rounded",children:s(`thread.mode.${t.mode}`)})]})}})})})]})}export{gt as AllThreadsView};