vibedoc 1.6.0 → 1.7.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 (302) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +2 -0
  3. package/.next/build-manifest.json +3 -3
  4. package/.next/prerender-manifest.json +39 -11
  5. package/.next/routes-manifest.json +12 -0
  6. package/.next/server/app/(app)/activity/page.js.nft.json +1 -1
  7. package/.next/server/app/(app)/activity/page_client-reference-manifest.js +1 -1
  8. package/.next/server/app/(app)/board/page.js.nft.json +1 -1
  9. package/.next/server/app/(app)/board/page_client-reference-manifest.js +1 -1
  10. package/.next/server/app/(app)/chat/page/app-paths-manifest.json +3 -0
  11. package/.next/server/app/(app)/chat/page/build-manifest.json +20 -0
  12. package/.next/server/app/(app)/chat/page/next-font-manifest.json +11 -0
  13. package/.next/server/app/(app)/chat/page/react-loadable-manifest.json +1 -0
  14. package/.next/server/app/(app)/chat/page/server-reference-manifest.json +4 -0
  15. package/.next/server/app/(app)/chat/page.js +15 -0
  16. package/.next/server/app/(app)/chat/page.js.map +5 -0
  17. package/.next/server/app/(app)/chat/page.js.nft.json +1 -0
  18. package/.next/server/app/(app)/chat/page_client-reference-manifest.js +3 -0
  19. package/.next/server/app/(app)/docs/page.js.nft.json +1 -1
  20. package/.next/server/app/(app)/docs/page_client-reference-manifest.js +1 -1
  21. package/.next/server/app/(app)/explorer/page.js.nft.json +1 -1
  22. package/.next/server/app/(app)/explorer/page_client-reference-manifest.js +1 -1
  23. package/.next/server/app/(app)/memory/page.js.nft.json +1 -1
  24. package/.next/server/app/(app)/memory/page_client-reference-manifest.js +1 -1
  25. package/.next/server/app/(app)/roadmap/page.js.nft.json +1 -1
  26. package/.next/server/app/(app)/roadmap/page_client-reference-manifest.js +1 -1
  27. package/.next/server/app/(app)/settings/page.js.nft.json +1 -1
  28. package/.next/server/app/(app)/settings/page_client-reference-manifest.js +1 -1
  29. package/.next/server/app/(app)/setup/page.js.nft.json +1 -1
  30. package/.next/server/app/(app)/setup/page_client-reference-manifest.js +1 -1
  31. package/.next/server/app/_global-error.html +1 -1
  32. package/.next/server/app/_global-error.rsc +1 -1
  33. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  34. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  35. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  36. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  37. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  38. package/.next/server/app/_not-found.html +1 -1
  39. package/.next/server/app/_not-found.rsc +2 -2
  40. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  41. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  42. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  43. package/.next/server/app/activity.html +1 -1
  44. package/.next/server/app/activity.rsc +22 -23
  45. package/.next/server/app/activity.segments/!KGFwcCk/activity/__PAGE__.segment.rsc +9 -10
  46. package/.next/server/app/activity.segments/_full.segment.rsc +22 -23
  47. package/.next/server/app/activity.segments/_tree.segment.rsc +2 -2
  48. package/.next/server/app/api/activity/route.js.nft.json +1 -1
  49. package/.next/server/app/api/backlinks/route.js.nft.json +1 -1
  50. package/.next/server/app/api/chat/route.js.nft.json +1 -1
  51. package/.next/server/app/api/context/route.js.nft.json +1 -1
  52. package/.next/server/app/api/conversations/route/app-paths-manifest.json +3 -0
  53. package/.next/server/app/api/conversations/route/build-manifest.json +12 -0
  54. package/.next/server/app/api/conversations/route/server-reference-manifest.json +4 -0
  55. package/.next/server/app/api/conversations/route.js +9 -0
  56. package/.next/server/app/api/conversations/route.js.map +5 -0
  57. package/.next/server/app/api/conversations/route.js.nft.json +1 -0
  58. package/.next/server/app/api/conversations/route_client-reference-manifest.js +3 -0
  59. package/.next/server/app/api/decisions/route.js.nft.json +1 -1
  60. package/.next/server/app/api/docs/route.js.nft.json +1 -1
  61. package/.next/server/app/api/explorer/route.js.nft.json +1 -1
  62. package/.next/server/app/api/mcp/route.js.nft.json +1 -1
  63. package/.next/server/app/api/memory/route.js.nft.json +1 -1
  64. package/.next/server/app/api/plan/apply/route.js.nft.json +1 -1
  65. package/.next/server/app/api/projects/route.js.nft.json +1 -1
  66. package/.next/server/app/api/registry/route.js.nft.json +1 -1
  67. package/.next/server/app/api/roadmap/create/route.js.nft.json +1 -1
  68. package/.next/server/app/api/roadmap/delete/route.js.nft.json +1 -1
  69. package/.next/server/app/api/roadmap/generate/route.js.nft.json +1 -1
  70. package/.next/server/app/api/roadmap/layout/route.js.nft.json +1 -1
  71. package/.next/server/app/api/roadmap/route.js.nft.json +1 -1
  72. package/.next/server/app/api/roadmap/update/route.js.nft.json +1 -1
  73. package/.next/server/app/api/sessions/route.js.nft.json +1 -1
  74. package/.next/server/app/api/settings/route.js.nft.json +1 -1
  75. package/.next/server/app/api/setup/generate/route.js.nft.json +1 -1
  76. package/.next/server/app/api/setup/write/route.js.nft.json +1 -1
  77. package/.next/server/app/api/summary/route.js.nft.json +1 -1
  78. package/.next/server/app/api/tasks/create/route.js.nft.json +1 -1
  79. package/.next/server/app/api/tasks/route.js.nft.json +1 -1
  80. package/.next/server/app/board.html +1 -1
  81. package/.next/server/app/board.rsc +22 -23
  82. package/.next/server/app/board.segments/!KGFwcCk/board/__PAGE__.segment.rsc +9 -10
  83. package/.next/server/app/board.segments/_full.segment.rsc +22 -23
  84. package/.next/server/app/board.segments/_tree.segment.rsc +2 -2
  85. package/.next/server/app/chat.html +1 -0
  86. package/.next/server/app/chat.meta +31 -0
  87. package/.next/server/app/chat.rsc +29 -0
  88. package/.next/server/app/chat.segments/!KGFwcCk/chat/__PAGE__.segment.rsc +31 -0
  89. package/.next/server/app/chat.segments/_full.segment.rsc +29 -0
  90. package/.next/server/app/chat.segments/_tree.segment.rsc +4 -0
  91. package/.next/server/app/docs.html +1 -1
  92. package/.next/server/app/docs.rsc +22 -27
  93. package/.next/server/app/docs.segments/!KGFwcCk/docs/__PAGE__.segment.rsc +6 -6
  94. package/.next/server/app/docs.segments/_full.segment.rsc +22 -27
  95. package/.next/server/app/docs.segments/_tree.segment.rsc +2 -2
  96. package/.next/server/app/explorer.html +1 -1
  97. package/.next/server/app/explorer.rsc +22 -23
  98. package/.next/server/app/explorer.segments/!KGFwcCk/explorer/__PAGE__.segment.rsc +9 -10
  99. package/.next/server/app/explorer.segments/_full.segment.rsc +22 -23
  100. package/.next/server/app/explorer.segments/_tree.segment.rsc +2 -2
  101. package/.next/server/app/index.html +1 -1
  102. package/.next/server/app/index.rsc +2 -2
  103. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  104. package/.next/server/app/index.segments/_full.segment.rsc +2 -2
  105. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  106. package/.next/server/app/memory.html +1 -1
  107. package/.next/server/app/memory.rsc +22 -23
  108. package/.next/server/app/memory.segments/!KGFwcCk/memory/__PAGE__.segment.rsc +9 -10
  109. package/.next/server/app/memory.segments/_full.segment.rsc +22 -23
  110. package/.next/server/app/memory.segments/_tree.segment.rsc +2 -2
  111. package/.next/server/app/page.js.nft.json +1 -1
  112. package/.next/server/app/page_client-reference-manifest.js +1 -1
  113. package/.next/server/app/roadmap.html +1 -1
  114. package/.next/server/app/roadmap.rsc +22 -26
  115. package/.next/server/app/roadmap.segments/!KGFwcCk/roadmap/__PAGE__.segment.rsc +9 -11
  116. package/.next/server/app/roadmap.segments/_full.segment.rsc +22 -26
  117. package/.next/server/app/roadmap.segments/_tree.segment.rsc +2 -2
  118. package/.next/server/app/settings.html +1 -1
  119. package/.next/server/app/settings.rsc +22 -23
  120. package/.next/server/app/settings.segments/!KGFwcCk/settings/__PAGE__.segment.rsc +9 -10
  121. package/.next/server/app/settings.segments/_full.segment.rsc +22 -23
  122. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  123. package/.next/server/app/setup.html +1 -1
  124. package/.next/server/app/setup.rsc +22 -23
  125. package/.next/server/app/setup.segments/!KGFwcCk/setup/__PAGE__.segment.rsc +9 -10
  126. package/.next/server/app/setup.segments/_full.segment.rsc +22 -23
  127. package/.next/server/app/setup.segments/_tree.segment.rsc +2 -2
  128. package/.next/server/app-paths-manifest.json +2 -0
  129. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1htgzmb._.js +3 -0
  130. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1htgzmb._.js.map +1 -0
  131. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0d2_lq6._.js +3 -0
  132. package/.next/server/chunks/[root-of-the-server]__1613hjb._.js +4 -4
  133. package/.next/server/chunks/[root-of-the-server]__1613hjb._.js.map +1 -1
  134. package/.next/server/chunks/[root-of-the-server]__1jxu2x9._.js +3 -0
  135. package/.next/server/chunks/[root-of-the-server]__1jxu2x9._.js.map +1 -0
  136. package/.next/server/chunks/_1b5fqxy._.js +1 -1
  137. package/.next/server/chunks/_1b5fqxy._.js.map +1 -1
  138. package/.next/server/chunks/_next-internal_server_app_api_conversations_route_actions_1-pu7gs.js +3 -0
  139. package/.next/server/chunks/ssr/{0_nd_mermaid_dist_mermaid_core_mjs_10jvzv6._.js → 0_nd_mermaid_dist_mermaid_core_mjs_0vv_0i3._.js} +2 -2
  140. package/.next/server/chunks/ssr/{1u84_katex_dist_katex_mjs_05prlqa._.js → 1u84_katex_dist_katex_mjs_1z0p1bs._.js} +1 -1
  141. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_0cvmffy._.js +3 -0
  142. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_0cvmffy._.js.map +1 -0
  143. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_0u3jxas._.js +3 -0
  144. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_0u3jxas._.js.map +1 -0
  145. package/.next/server/chunks/ssr/[root-of-the-server]__0xt_0w2._.js.map +1 -1
  146. package/.next/server/chunks/ssr/[root-of-the-server]__11lfnu0._.js +3 -0
  147. package/.next/server/chunks/ssr/[root-of-the-server]__11lfnu0._.js.map +1 -0
  148. package/.next/server/chunks/ssr/_059qmur._.js +3 -0
  149. package/.next/server/chunks/ssr/_059qmur._.js.map +1 -0
  150. package/.next/server/chunks/ssr/_081irea._.js +3 -0
  151. package/.next/server/chunks/ssr/_081irea._.js.map +1 -0
  152. package/.next/server/chunks/ssr/_0d8t8l4._.js +3 -0
  153. package/.next/server/chunks/ssr/_0d8t8l4._.js.map +1 -0
  154. package/.next/server/chunks/ssr/_0dyvcdg._.js +3 -0
  155. package/.next/server/chunks/ssr/_0dyvcdg._.js.map +1 -0
  156. package/.next/server/chunks/ssr/_1-ghqy4._.js +3 -0
  157. package/.next/server/chunks/ssr/_1-ghqy4._.js.map +1 -0
  158. package/.next/server/chunks/ssr/_17jy5db._.js +3 -0
  159. package/.next/server/chunks/ssr/_17jy5db._.js.map +1 -0
  160. package/.next/server/chunks/ssr/_1c95ems._.js +1 -1
  161. package/.next/server/chunks/ssr/_1c95ems._.js.map +1 -1
  162. package/.next/server/chunks/ssr/_1dllfz5._.js +4 -0
  163. package/.next/server/chunks/ssr/_1dllfz5._.js.map +1 -0
  164. package/.next/server/chunks/ssr/_next-internal_server_app_(app)_chat_page_actions_0g4tbzt.js +3 -0
  165. package/.next/server/chunks/ssr/node_modules__pnpm_006_c8z._.js +3 -0
  166. package/.next/server/chunks/ssr/node_modules__pnpm_006_c8z._.js.map +1 -0
  167. package/.next/server/chunks/ssr/{node_modules__pnpm_1kngagu._.js → node_modules__pnpm_0286-tg._.js} +1 -1
  168. package/.next/server/chunks/ssr/{node_modules__pnpm_1ad2q27._.js → node_modules__pnpm_04khl_s._.js} +1 -1
  169. package/.next/server/chunks/ssr/{node_modules__pnpm_0ns_6dd._.js → node_modules__pnpm_07t_e8c._.js} +1 -1
  170. package/.next/server/chunks/ssr/{node_modules__pnpm_0baie09._.js → node_modules__pnpm_08sqeu2._.js} +1 -1
  171. package/.next/server/chunks/ssr/{node_modules__pnpm_1jfqun_._.js → node_modules__pnpm_09_i2jk._.js} +1 -1
  172. package/.next/server/chunks/ssr/node_modules__pnpm_09_i2jk._.js.map +1 -0
  173. package/.next/server/chunks/ssr/{node_modules__pnpm_1o3_0-n._.js → node_modules__pnpm_0a9b2ei._.js} +1 -1
  174. package/.next/server/chunks/ssr/{node_modules__pnpm_0e15nhj._.js → node_modules__pnpm_0ah02mu._.js} +1 -1
  175. package/.next/server/chunks/ssr/{node_modules__pnpm_20tdqv_._.js → node_modules__pnpm_0cj8ryj._.js} +1 -1
  176. package/.next/server/chunks/ssr/{node_modules__pnpm_0wnlgm-._.js → node_modules__pnpm_0dwi7mu._.js} +2 -2
  177. package/.next/server/chunks/ssr/node_modules__pnpm_0dwi7mu._.js.map +1 -0
  178. package/.next/server/chunks/ssr/{node_modules__pnpm_1h890n6._.js → node_modules__pnpm_0f77_ng._.js} +1 -1
  179. package/.next/server/chunks/ssr/{node_modules__pnpm_1u8p2h3._.js → node_modules__pnpm_0fd3pr1._.js} +2 -2
  180. package/.next/server/chunks/ssr/{node_modules__pnpm_1zu-9we._.js → node_modules__pnpm_0gifu-u._.js} +2 -2
  181. package/.next/server/chunks/ssr/{node_modules__pnpm_1_o0jyk._.js → node_modules__pnpm_0jpv2b6._.js} +2 -2
  182. package/.next/server/chunks/ssr/{node_modules__pnpm_1f3lm9p._.js → node_modules__pnpm_0og06fy._.js} +1 -1
  183. package/.next/server/chunks/ssr/{node_modules__pnpm_12s6q4d._.js → node_modules__pnpm_0qc3gsk._.js} +1 -1
  184. package/.next/server/chunks/ssr/{node_modules__pnpm_0e3u5g-._.js → node_modules__pnpm_0ts89ne._.js} +1 -1
  185. package/.next/server/chunks/ssr/{node_modules__pnpm_1moe8b6._.js → node_modules__pnpm_0ttvopp._.js} +1 -1
  186. package/.next/server/chunks/ssr/{node_modules__pnpm_1ly58kw._.js → node_modules__pnpm_0u3u82f._.js} +1 -1
  187. package/.next/server/chunks/ssr/{node_modules__pnpm_1hw4h9e._.js → node_modules__pnpm_0y35hs4._.js} +1 -1
  188. package/.next/server/chunks/ssr/{node_modules__pnpm_0jhh7p5._.js → node_modules__pnpm_104pzhc._.js} +2 -2
  189. package/.next/server/chunks/ssr/{node_modules__pnpm_1gqkoe3._.js → node_modules__pnpm_195j8p_._.js} +1 -1
  190. package/.next/server/chunks/ssr/node_modules__pnpm_1kcnkjs._.js +3 -0
  191. package/.next/server/chunks/ssr/node_modules__pnpm_1kcnkjs._.js.map +1 -0
  192. package/.next/server/chunks/ssr/{node_modules__pnpm_0i0uccx._.js → node_modules__pnpm_1l8k8w1._.js} +1 -1
  193. package/.next/server/chunks/ssr/{node_modules__pnpm_0rd-a9g._.js → node_modules__pnpm_1w0f1m5._.js} +1 -1
  194. package/.next/server/chunks/ssr/{node_modules__pnpm_1gtgu48._.js → node_modules__pnpm_1woddr6._.js} +2 -2
  195. package/.next/server/chunks/ssr/{node_modules__pnpm_0_z3_bl._.js → node_modules__pnpm_1x0t5_z._.js} +1 -1
  196. package/.next/server/chunks/ssr/{node_modules__pnpm_07_kgbe._.js → node_modules__pnpm_1xzf8g_._.js} +1 -1
  197. package/.next/server/chunks/ssr/{node_modules__pnpm_08em703._.js → node_modules__pnpm_1yq90z7._.js} +1 -1
  198. package/.next/server/chunks/ssr/node_modules__pnpm_1yq90z7._.js.map +1 -0
  199. package/.next/server/chunks/ssr/src_app_(app)_chat_page_tsx_0c3e4l4._.js +3 -0
  200. package/.next/server/chunks/ssr/src_app_(app)_chat_page_tsx_0c3e4l4._.js.map +1 -0
  201. package/.next/server/chunks/ssr/src_app_(app)_layout_tsx_1yu5hom._.js +3 -0
  202. package/.next/server/chunks/ssr/src_app_(app)_layout_tsx_1yu5hom._.js.map +1 -0
  203. package/.next/server/chunks/ssr/src_app_(app)_roadmap_page_tsx_0vcq3jr._.js +5 -0
  204. package/.next/server/chunks/ssr/src_app_(app)_roadmap_page_tsx_0vcq3jr._.js.map +1 -0
  205. package/.next/server/chunks/ssr/src_app_(app)_settings_page_tsx_0zevtee._.js +2 -2
  206. package/.next/server/chunks/ssr/src_app_(app)_settings_page_tsx_0zevtee._.js.map +1 -1
  207. package/.next/server/chunks/ssr/src_context_ChatContext_tsx_0lowp8p._.js +5 -0
  208. package/.next/server/chunks/ssr/src_context_ChatContext_tsx_0lowp8p._.js.map +1 -0
  209. package/.next/server/chunks/ssr/{_1wf14_u._.js → src_lib_templates_index_ts_1s61uk7._.js} +2 -2
  210. package/.next/server/chunks/ssr/{_1wf14_u._.js.map → src_lib_templates_index_ts_1s61uk7._.js.map} +1 -1
  211. package/.next/server/middleware-build-manifest.js +3 -3
  212. package/.next/server/next-font-manifest.js +1 -1
  213. package/.next/server/next-font-manifest.json +4 -0
  214. package/.next/server/pages/404.html +1 -1
  215. package/.next/server/pages/500.html +1 -1
  216. package/.next/server/prefetch-hints.json +19 -0
  217. package/.next/server/server-reference-manifest.js +1 -1
  218. package/.next/server/server-reference-manifest.json +1 -1
  219. package/.next/static/chunks/050mq8l4e1ubn.js +1 -0
  220. package/.next/static/chunks/098le48845_fg.js +3 -0
  221. package/.next/static/chunks/0cw4-ebkoufdc.js +1 -0
  222. package/.next/static/chunks/0feo-go1w5nct.js +1 -0
  223. package/.next/static/chunks/14sefb904pl64.js +21 -0
  224. package/.next/static/chunks/1fer-wulyrjrs.js +3 -0
  225. package/.next/static/chunks/1o7b1x4umy8a6.js +1 -0
  226. package/.next/static/chunks/1q_io1j58aukw.js +1 -0
  227. package/.next/static/chunks/1t-cgh4477hfo.js +1 -0
  228. package/.next/static/chunks/1u-1po1qesc9f.js +1 -0
  229. package/.next/static/chunks/1u5kegkgm0xoz.js +1 -0
  230. package/.next/static/chunks/24ygzsgd-moqy.js +1 -0
  231. package/.next/static/chunks/26folxgplfa9t.js +68 -0
  232. package/.next/static/chunks/2ocixvjhv34_3.js +1 -0
  233. package/.next/static/chunks/3_lsdgxa-h7ma.css +10 -0
  234. package/.next/static/chunks/3rmv-sb9w9i3e.js +1 -0
  235. package/.next/static/chunks/3ttzomivj48jh.js +2 -0
  236. package/README.md +1 -1
  237. package/package.json +1 -1
  238. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_08ca0b4._.js +0 -3
  239. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_08ca0b4._.js.map +0 -1
  240. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_0c1k9is._.js +0 -3
  241. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_0c1k9is._.js.map +0 -1
  242. package/.next/server/chunks/ssr/_01suk2m._.js +0 -3
  243. package/.next/server/chunks/ssr/_01suk2m._.js.map +0 -1
  244. package/.next/server/chunks/ssr/_0qyglif._.js +0 -5
  245. package/.next/server/chunks/ssr/_0qyglif._.js.map +0 -1
  246. package/.next/server/chunks/ssr/_0skuoxv._.js +0 -6
  247. package/.next/server/chunks/ssr/_0skuoxv._.js.map +0 -1
  248. package/.next/server/chunks/ssr/_14i_6yb._.js +0 -3
  249. package/.next/server/chunks/ssr/_14i_6yb._.js.map +0 -1
  250. package/.next/server/chunks/ssr/_1cbhuz4._.js +0 -3
  251. package/.next/server/chunks/ssr/_1cbhuz4._.js.map +0 -1
  252. package/.next/server/chunks/ssr/_1ewk_mn._.js +0 -3
  253. package/.next/server/chunks/ssr/_1ewk_mn._.js.map +0 -1
  254. package/.next/server/chunks/ssr/node_modules__pnpm_1dcmsrg._.js +0 -3
  255. package/.next/server/chunks/ssr/node_modules__pnpm_1dcmsrg._.js.map +0 -1
  256. package/.next/server/chunks/ssr/src_components_008q3v8._.js +0 -3
  257. package/.next/server/chunks/ssr/src_components_008q3v8._.js.map +0 -1
  258. package/.next/static/chunks/02sab26ica2x3.js +0 -1
  259. package/.next/static/chunks/0eggcu0ovk8sd.js +0 -68
  260. package/.next/static/chunks/0iva6rdtfqpbz.js +0 -1
  261. package/.next/static/chunks/0qm101bdsxdyh.css +0 -10
  262. package/.next/static/chunks/0wg9n5zb8mo2p.js +0 -1
  263. package/.next/static/chunks/0wjw1laqwg-cr.js +0 -21
  264. package/.next/static/chunks/0z_y7el6m76yk.js +0 -1
  265. package/.next/static/chunks/1-ekntoveuxzd.js +0 -4
  266. package/.next/static/chunks/1g6fxjtlpv6p5.js +0 -1
  267. package/.next/static/chunks/1ytqu-ra-fylk.js +0 -3
  268. package/.next/static/chunks/3dlnlsyyysw5m.js +0 -1
  269. package/.next/static/chunks/3kkg030rcpz7l.js +0 -1
  270. package/.next/static/chunks/3pf_4ye6ju8gt.js +0 -1
  271. /package/.next/server/chunks/{ssr/0_nd_mermaid_dist_mermaid_core_mjs_10jvzv6._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0d2_lq6._.js.map} +0 -0
  272. /package/.next/server/chunks/{ssr/1u84_katex_dist_katex_mjs_05prlqa._.js.map → _next-internal_server_app_api_conversations_route_actions_1-pu7gs.js.map} +0 -0
  273. /package/.next/server/chunks/ssr/{node_modules__pnpm_08em703._.js.map → 0_nd_mermaid_dist_mermaid_core_mjs_0vv_0i3._.js.map} +0 -0
  274. /package/.next/server/chunks/ssr/{node_modules__pnpm_0wnlgm-._.js.map → 1u84_katex_dist_katex_mjs_1z0p1bs._.js.map} +0 -0
  275. /package/.next/server/chunks/ssr/{node_modules__pnpm_1jfqun_._.js.map → _next-internal_server_app_(app)_chat_page_actions_0g4tbzt.js.map} +0 -0
  276. /package/.next/server/chunks/ssr/{node_modules__pnpm_1kngagu._.js.map → node_modules__pnpm_0286-tg._.js.map} +0 -0
  277. /package/.next/server/chunks/ssr/{node_modules__pnpm_1ad2q27._.js.map → node_modules__pnpm_04khl_s._.js.map} +0 -0
  278. /package/.next/server/chunks/ssr/{node_modules__pnpm_0ns_6dd._.js.map → node_modules__pnpm_07t_e8c._.js.map} +0 -0
  279. /package/.next/server/chunks/ssr/{node_modules__pnpm_0baie09._.js.map → node_modules__pnpm_08sqeu2._.js.map} +0 -0
  280. /package/.next/server/chunks/ssr/{node_modules__pnpm_1o3_0-n._.js.map → node_modules__pnpm_0a9b2ei._.js.map} +0 -0
  281. /package/.next/server/chunks/ssr/{node_modules__pnpm_0e15nhj._.js.map → node_modules__pnpm_0ah02mu._.js.map} +0 -0
  282. /package/.next/server/chunks/ssr/{node_modules__pnpm_20tdqv_._.js.map → node_modules__pnpm_0cj8ryj._.js.map} +0 -0
  283. /package/.next/server/chunks/ssr/{node_modules__pnpm_1h890n6._.js.map → node_modules__pnpm_0f77_ng._.js.map} +0 -0
  284. /package/.next/server/chunks/ssr/{node_modules__pnpm_1u8p2h3._.js.map → node_modules__pnpm_0fd3pr1._.js.map} +0 -0
  285. /package/.next/server/chunks/ssr/{node_modules__pnpm_1zu-9we._.js.map → node_modules__pnpm_0gifu-u._.js.map} +0 -0
  286. /package/.next/server/chunks/ssr/{node_modules__pnpm_1_o0jyk._.js.map → node_modules__pnpm_0jpv2b6._.js.map} +0 -0
  287. /package/.next/server/chunks/ssr/{node_modules__pnpm_1f3lm9p._.js.map → node_modules__pnpm_0og06fy._.js.map} +0 -0
  288. /package/.next/server/chunks/ssr/{node_modules__pnpm_12s6q4d._.js.map → node_modules__pnpm_0qc3gsk._.js.map} +0 -0
  289. /package/.next/server/chunks/ssr/{node_modules__pnpm_0e3u5g-._.js.map → node_modules__pnpm_0ts89ne._.js.map} +0 -0
  290. /package/.next/server/chunks/ssr/{node_modules__pnpm_1moe8b6._.js.map → node_modules__pnpm_0ttvopp._.js.map} +0 -0
  291. /package/.next/server/chunks/ssr/{node_modules__pnpm_1ly58kw._.js.map → node_modules__pnpm_0u3u82f._.js.map} +0 -0
  292. /package/.next/server/chunks/ssr/{node_modules__pnpm_1hw4h9e._.js.map → node_modules__pnpm_0y35hs4._.js.map} +0 -0
  293. /package/.next/server/chunks/ssr/{node_modules__pnpm_0jhh7p5._.js.map → node_modules__pnpm_104pzhc._.js.map} +0 -0
  294. /package/.next/server/chunks/ssr/{node_modules__pnpm_1gqkoe3._.js.map → node_modules__pnpm_195j8p_._.js.map} +0 -0
  295. /package/.next/server/chunks/ssr/{node_modules__pnpm_0i0uccx._.js.map → node_modules__pnpm_1l8k8w1._.js.map} +0 -0
  296. /package/.next/server/chunks/ssr/{node_modules__pnpm_0rd-a9g._.js.map → node_modules__pnpm_1w0f1m5._.js.map} +0 -0
  297. /package/.next/server/chunks/ssr/{node_modules__pnpm_1gtgu48._.js.map → node_modules__pnpm_1woddr6._.js.map} +0 -0
  298. /package/.next/server/chunks/ssr/{node_modules__pnpm_0_z3_bl._.js.map → node_modules__pnpm_1x0t5_z._.js.map} +0 -0
  299. /package/.next/server/chunks/ssr/{node_modules__pnpm_07_kgbe._.js.map → node_modules__pnpm_1xzf8g_._.js.map} +0 -0
  300. /package/.next/static/{ICaoXcRMmgrIFWk8C_Z6D → uJ5RYxgFnE5svAvnuLDXN}/_buildManifest.js +0 -0
  301. /package/.next/static/{ICaoXcRMmgrIFWk8C_Z6D → uJ5RYxgFnE5svAvnuLDXN}/_clientMiddlewareManifest.js +0 -0
  302. /package/.next/static/{ICaoXcRMmgrIFWk8C_Z6D → uJ5RYxgFnE5svAvnuLDXN}/_ssgManifest.js +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/app/%28app%29/layout.tsx","../../../../src/components/layout/ProjectSwitcher.tsx","../../../../src/components/layout/StatsPills.tsx","../../../../src/components/layout/LiveIndicator.tsx","../../../../src/components/shared/SettingsApplier.tsx","../../../../src/components/layout/SidebarChats.tsx","../../../../src/components/layout/AppSidebar.tsx","../../../../src/components/layout/CommandPalette.tsx","../../../../src/lib/fuzzy.ts","../../../../src/components/layout/QuickOpen.tsx","../../../../src/components/chat/ChatModal.tsx","../../../../src/components/shared/LoadingScreen.tsx","../../../../src/components/layout/AppHeader.tsx","../../../../src/components/ui/sidebar.tsx","../../../../src/hooks/use-mobile.tsx","../../../../src/components/ui/skeleton.tsx","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/layout-dashboard.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/ban.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/clipboard-list.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/circle-check.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/brain.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/panel-left.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/circle-dot.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/file-plus.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/activity.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/folder-tree.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/messages-square.ts"],"sourcesContent":["\"use client\"\n\nimport { useState, useEffect } from \"react\"\nimport { useRouter, usePathname } from \"next/navigation\"\nimport { AppProvider, useApp } from \"@/context/AppContext\"\nimport { SettingsApplier } from \"@/components/shared/SettingsApplier\"\nimport { LoadingScreen } from \"@/components/shared/LoadingScreen\"\nimport { AppHeader } from \"@/components/layout/AppHeader\"\nimport { AppSidebar } from \"@/components/layout/AppSidebar\"\nimport { CommandPalette } from \"@/components/layout/CommandPalette\"\nimport { QuickOpen } from \"@/components/layout/QuickOpen\"\nimport { NewDocModal } from \"@/components/docs/NewDocModal\"\nimport { ChatModal } from \"@/components/chat/ChatModal\"\nimport { ChatProvider, useChats } from \"@/context/ChatContext\"\nimport { SidebarProvider, SidebarInset } from \"@/components/ui/sidebar\"\nimport { Dialog, DialogContent, DialogTitle } from \"@/components/ui/dialog\"\n\nexport default function AppLayout({ children }: { children: React.ReactNode }) {\n return (\n <AppProvider>\n <SettingsApplier />\n <ChatProvider>\n <AppLayoutInner>{children}</AppLayoutInner>\n </ChatProvider>\n </AppProvider>\n )\n}\n\nconst SHORTCUTS = [\n { key: \"Cmd+K\", description: \"Open command palette\" },\n { key: \"Cmd+P\", description: \"Go to file\" },\n { key: \"b\", description: \"Go to Board\" },\n { key: \"d\", description: \"Go to Docs\" },\n { key: \"a\", description: \"Go to Activity\" },\n { key: \"m\", description: \"Go to Memory\" },\n { key: \"e\", description: \"Go to Explorer\" },\n { key: \"c\", description: \"Open agent chat\" },\n { key: \"/\", description: \"Focus doc search\" },\n { key: \"?\", description: \"Toggle this help\" },\n { key: \"Esc\", description: \"Close panel / modal\" },\n]\n\nfunction AppLayoutInner({ children }: { children: React.ReactNode }) {\n const { loading, summary, projects, activeProject, liveIndicator, onProjectChange, board, openDoc, rootParam } = useApp()\n const router = useRouter()\n const pathname = usePathname()\n const [showHelp, setShowHelp] = useState(false)\n const [cmdOpen, setCmdOpen] = useState(false)\n const [quickOpen, setQuickOpen] = useState(false)\n const [newDocOpen, setNewDocOpen] = useState(false)\n const { modalId, closeModal, showDefault } = useChats()\n\n useEffect(() => {\n function onKey(e: KeyboardEvent) {\n if ((e.metaKey || e.ctrlKey) && e.key === \"k\") {\n e.preventDefault()\n setCmdOpen(v => !v)\n return\n }\n // Overrides the browser's print shortcut\n if ((e.metaKey || e.ctrlKey) && e.key === \"p\") {\n e.preventDefault()\n setCmdOpen(false)\n setQuickOpen(v => !v)\n return\n }\n const tag = (e.target as Element)?.tagName\n if (tag === \"INPUT\" || tag === \"TEXTAREA\") return\n switch (e.key) {\n case \"b\": router.push(\"/board\"); break\n case \"d\": router.push(\"/docs\"); break\n case \"a\": router.push(\"/activity\"); break\n case \"m\": router.push(\"/memory\"); break\n case \"e\": router.push(\"/explorer\"); break\n // preventDefault: the modal autofocuses its composer, which would otherwise receive this \"c\"\n case \"c\": e.preventDefault(); if (modalId) closeModal(); else showDefault(); break\n case \"?\": setShowHelp((v) => !v); break\n case \"Escape\": setShowHelp(false); break\n case \"/\":\n e.preventDefault()\n if (pathname === \"/docs\") {\n document.getElementById(\"doc-search\")?.focus()\n } else {\n router.push(\"/docs\")\n }\n break\n }\n }\n window.addEventListener(\"keydown\", onKey)\n return () => window.removeEventListener(\"keydown\", onKey)\n }, [router, pathname, modalId, closeModal, showDefault])\n\n if (loading) return <LoadingScreen />\n\n return (\n <SidebarProvider>\n <AppSidebar board={board} />\n <SidebarInset className=\"min-w-0\">\n <AppHeader\n summary={summary}\n projects={projects}\n activeProject={activeProject}\n liveIndicator={liveIndicator}\n onProjectChange={onProjectChange}\n onToggleChat={() => (modalId ? closeModal() : showDefault())}\n />\n <main className=\"flex-1 min-h-0 overflow-y-auto\">{children}</main>\n <ChatModal />\n\n <QuickOpen\n open={quickOpen}\n onClose={() => setQuickOpen(false)}\n onOpenDoc={openDoc}\n rootParam={rootParam}\n />\n <CommandPalette\n open={cmdOpen}\n onClose={() => setCmdOpen(false)}\n onOpenDoc={openDoc}\n onNewDoc={() => { setCmdOpen(false); setNewDocOpen(true) }}\n rootParam={rootParam}\n />\n <NewDocModal\n open={newDocOpen}\n onOpenChange={setNewDocOpen}\n rootParam={rootParam}\n onDocCreated={async (path) => { await openDoc(path) }}\n />\n\n {/* Keyboard shortcuts help modal */}\n <Dialog open={showHelp} onOpenChange={setShowHelp}>\n <DialogContent aria-describedby={undefined} className=\"block w-80 p-5 rounded-xl sm:rounded-xl shadow-2xl\">\n <DialogTitle className=\"font-display text-sm font-semibold text-txt mb-4\">Keyboard shortcuts</DialogTitle>\n <table className=\"w-full text-xs\">\n <tbody>\n {SHORTCUTS.map(({ key, description }) => (\n <tr key={key} className=\"border-t border-border first:border-0\">\n <td className=\"py-1.5 pr-4\">\n <kbd className=\"font-mono bg-surface2 border border-border rounded-sm px-1.5 py-0.5 text-accent\">\n {key}\n </kbd>\n </td>\n <td className=\"py-1.5 text-muted\">{description}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </DialogContent>\n </Dialog>\n </SidebarInset>\n </SidebarProvider>\n )\n}\n","\"use client\"\r\n\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuTrigger,\r\n} from \"@/components/ui/dropdown-menu\"\r\nimport type { Project } from \"@/types\"\r\n\r\ninterface ProjectSwitcherProps {\r\n projects: Project[]\r\n activeProject: string\r\n currentName: string\r\n onSelect: (root: string) => void\r\n}\r\n\r\nexport function ProjectSwitcher({ projects, activeProject, currentName, onSelect }: ProjectSwitcherProps) {\r\n return (\r\n <DropdownMenu>\r\n <DropdownMenuTrigger asChild>\r\n <button className=\"flex items-center gap-1.5 px-3 py-1.5 rounded-md bg-surface2 border border-border text-sm hover:border-border2 transition-colors\">\r\n <span className=\"text-txt font-medium truncate max-w-[200px]\">\r\n {currentName || \"Select project\"}\r\n </span>\r\n <span className=\"text-muted text-xs\">▾</span>\r\n </button>\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent\r\n className=\"w-64 bg-surface border-border2 text-txt\"\r\n align=\"start\"\r\n >\r\n {projects.length === 0 ? (\r\n <div className=\"px-3 py-2 text-sm text-muted\">No projects found</div>\r\n ) : (\r\n projects.map((p) => (\r\n <DropdownMenuItem\r\n key={p.root}\r\n onClick={() => onSelect(p.root)}\r\n className={`cursor-pointer hover:bg-surface2 focus:bg-surface2 ${p.root === activeProject ? \"text-accent\" : \"\"}`}\r\n >\r\n <div>\r\n <div className=\"font-medium\">{p.name}</div>\r\n <div className=\"text-xs text-muted truncate font-mono\">{p.root}</div>\r\n </div>\r\n </DropdownMenuItem>\r\n ))\r\n )}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n )\r\n}\r\n","import { Badge } from \"@/components/ui/badge\"\r\n\r\ninterface StatsPillsProps {\r\n board: Record<string, number>\r\n}\r\n\r\nexport function StatsPills({ board }: StatsPillsProps) {\r\n return (\r\n <div className=\"flex items-center gap-1.5\">\r\n <Badge variant=\"secondary\" className=\"gap-1 text-xs font-mono text-amber\">\r\n 🔨 {board[\"in-progress\"] || 0}\r\n </Badge>\r\n <Badge variant=\"secondary\" className=\"gap-1 text-xs font-mono text-muted\">\r\n 📋 {board.todo || 0}\r\n </Badge>\r\n <Badge variant=\"secondary\" className=\"gap-1 text-xs font-mono text-teal\">\r\n ✅ {board.done || 0}\r\n </Badge>\r\n </div>\r\n )\r\n}\r\n","import { cn } from \"@/lib/utils\"\r\n\r\ninterface LiveIndicatorProps {\r\n active: boolean\r\n}\r\n\r\nexport function LiveIndicator({ active }: LiveIndicatorProps) {\r\n return (\r\n <div className=\"flex items-center gap-1.5 text-xs font-mono text-muted\">\r\n <div\r\n className={cn(\r\n \"w-1.5 h-1.5 rounded-full transition-colors duration-500\",\r\n active ? \"bg-teal shadow-[0_0_6px_#4fd8b4]\" : \"bg-border2\",\r\n )}\r\n />\r\n <span>{active ? \"live update\" : \"connected\"}</span>\r\n </div>\r\n )\r\n}\r\n","\"use client\"\n\nimport { useEffect, useRef } from \"react\"\nimport { useApp } from \"@/context/AppContext\"\nimport { applyTheme, applyAccent, applyFontSize, applyFonts } from \"@/lib/applySettings\"\nimport { DEFAULT_SETTINGS, type AppSettings } from \"@/lib/settings\"\n\nexport function SettingsApplier() {\n const { rootParam, refresh, setEditorSettings, setAutoRefreshSeconds, autoRefreshSeconds } = useApp()\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null)\n\n // Load + apply settings whenever the active project changes\n useEffect(() => {\n if (!rootParam) return\n let cancelled = false\n\n fetch(`/api/settings${rootParam}&type=settings`)\n .then(r => r.ok ? r.json() : DEFAULT_SETTINGS)\n .then((settings: AppSettings) => {\n if (cancelled) return\n applyTheme(settings.theme)\n applyAccent(settings.accentColor)\n applyFontSize(settings.fontSize)\n applyFonts(settings)\n setEditorSettings(settings.editor)\n setAutoRefreshSeconds(settings.project?.autoRefresh ?? 0)\n })\n .catch(() => {})\n\n return () => { cancelled = true }\n }, [rootParam]) // eslint-disable-line react-hooks/exhaustive-deps\n\n // Manage polling interval reactively based on autoRefreshSeconds\n useEffect(() => {\n if (intervalRef.current) clearInterval(intervalRef.current)\n if (autoRefreshSeconds > 0) {\n intervalRef.current = setInterval(refresh, autoRefreshSeconds * 1000)\n }\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current)\n intervalRef.current = null\n }\n }\n }, [autoRefreshSeconds, refresh])\n\n return null\n}\n","\"use client\"\n\nimport Link from \"next/link\"\nimport { usePathname, useSearchParams } from \"next/navigation\"\nimport { Suspense } from \"react\"\nimport { Bot, MessagesSquare, Plus } from \"lucide-react\"\nimport {\n SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel,\n SidebarMenu, SidebarMenuButton, SidebarMenuItem,\n} from \"@/components/ui/sidebar\"\nimport { useChats } from \"@/context/ChatContext\"\nimport { AttachLabel, StatusMarker } from \"@/components/chat/StatusMarker\"\nimport { chatStatus, groupChats } from \"@/lib/chats\"\nimport { cn } from \"@/lib/utils\"\n\n/** Recent idle chats listed under the ones that need you or are running; the rest are on /chat. */\nconst RECENT_IN_SIDEBAR = 4\n\n/** \"Agents\" section: chats waiting on you first, then running, then recent. Click opens the chat. */\nexport function SidebarChats() {\n return (\n <Suspense>\n <SidebarChatsInner />\n </Suspense>\n )\n}\n\nfunction SidebarChatsInner() {\n const { chats, loaded, modalId, show, create, waitingCount, runningCount } = useChats()\n const pathname = usePathname()\n const pageId = useSearchParams().get(\"id\")\n const g = groupChats(chats)\n const listed = [...g.needsYou, ...g.running, ...g.recent.slice(0, RECENT_IN_SIDEBAR)]\n const hidden = chats.length - listed.length\n const isOpen = (id: string) => modalId === id || (pathname === \"/chat\" && pageId === id)\n\n return (\n <SidebarGroup role=\"group\" aria-label=\"Agent chats\">\n <SidebarGroupLabel className=\"gap-2\">\n Agents\n {runningCount > 0 && <span className=\"font-mono text-[10px] normal-case tracking-normal text-accent\">{runningCount} running</span>}\n </SidebarGroupLabel>\n <SidebarGroupAction title=\"New chat\" onClick={() => show(create())}>\n <Plus />\n <span className=\"sr-only\">New chat</span>\n </SidebarGroupAction>\n <SidebarGroupContent>\n <SidebarMenu>\n {/* Collapsed sidebar: one entry with the waiting count */}\n <SidebarMenuItem className=\"hidden group-data-[collapsible=icon]:block\">\n <SidebarMenuButton asChild tooltip={waitingCount ? `Agents · ${waitingCount} waiting for you` : \"Agents\"} isActive={pathname === \"/chat\"}>\n <Link href=\"/chat\" className=\"relative\">\n <Bot />\n <span>Agents</span>\n {waitingCount > 0 && <span className=\"absolute right-1 top-1 size-1.5 rounded-full bg-amber animate-pulse-dot\" />}\n </Link>\n </SidebarMenuButton>\n </SidebarMenuItem>\n\n {loaded && chats.length === 0 && (\n <SidebarMenuItem className=\"group-data-[collapsible=icon]:hidden\">\n <SidebarMenuButton onClick={() => show(create())} className=\"text-muted\">\n <MessagesSquare />\n <span>Start a chat</span>\n </SidebarMenuButton>\n </SidebarMenuItem>\n )}\n\n {listed.map((c) => {\n const status = chatStatus(c)\n return (\n <SidebarMenuItem key={c.id} className=\"group-data-[collapsible=icon]:hidden animate-slide-in\">\n <SidebarMenuButton\n onClick={() => show(c.id)}\n isActive={isOpen(c.id)}\n className={cn(\"h-8\", status === \"idle\" && \"text-muted\")}\n title={c.title}\n >\n <StatusMarker status={status} showIdle />\n <span className=\"min-w-0 flex-1 truncate\">{c.title}</span>\n {c.attach && <AttachLabel attach={c.attach} className=\"shrink-0 text-muted\" />}\n </SidebarMenuButton>\n </SidebarMenuItem>\n )\n })}\n\n {chats.length > 0 && (\n <SidebarMenuItem className=\"group-data-[collapsible=icon]:hidden\">\n <SidebarMenuButton asChild isActive={pathname === \"/chat\" && !pageId} className=\"h-7 text-xs text-muted\">\n <Link href=\"/chat\">\n <MessagesSquare />\n <span>{hidden > 0 ? `All chats · ${chats.length}` : \"All chats\"}</span>\n </Link>\n </SidebarMenuButton>\n </SidebarMenuItem>\n )}\n </SidebarMenu>\n </SidebarGroupContent>\n </SidebarGroup>\n )\n}\n","\"use client\"\n\nimport { LayoutDashboard, BookOpen, Zap, Brain, CircleDot, Ban, ClipboardList, CheckCircle2, Settings, FolderTree, Map } from \"lucide-react\"\nimport Link from \"next/link\"\nimport { usePathname } from \"next/navigation\"\nimport {\n Sidebar,\n SidebarContent,\n SidebarGroup,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarSeparator,\n} from \"@/components/ui/sidebar\"\nimport type { TaskBoard } from \"@/types\"\nimport { SidebarChats } from \"./SidebarChats\"\n\nconst NAV_ITEMS = [\n { href: \"/board\", icon: LayoutDashboard, label: \"Board\" },\n { href: \"/roadmap\", icon: Map, label: \"Roadmap\" },\n { href: \"/docs\", icon: BookOpen, label: \"Docs\" },\n { href: \"/activity\", icon: Zap, label: \"Activity\" },\n { href: \"/memory\", icon: Brain, label: \"Memory\" },\n { href: \"/explorer\", icon: FolderTree, label: \"Explorer\" },\n { href: \"/settings\", icon: Settings, label: \"Settings\" },\n]\n\nconst BOARD_STATS = [\n { status: \"in-progress\", icon: CircleDot, label: \"Active\" },\n { status: \"blocked\", icon: Ban, label: \"Blocked\" },\n { status: \"todo\", icon: ClipboardList, label: \"Todo\" },\n { status: \"done\", icon: CheckCircle2, label: \"Done\" },\n]\n\ninterface AppSidebarProps {\n board: TaskBoard | null\n}\n\nexport function AppSidebar({ board }: AppSidebarProps) {\n const pathname = usePathname()\n\n return (\n <Sidebar collapsible=\"icon\">\n <SidebarHeader>\n <div className=\"flex items-center gap-2 px-2 py-1\">\n <div className=\"w-6 h-6 rounded-md bg-linear-to-br from-accent to-teal flex items-center justify-center text-xs shrink-0\">\n ⬡\n </div>\n <span className=\"font-mono text-xs text-muted tracking-widest uppercase group-data-[collapsible=icon]:hidden\">\n VibeDoc\n </span>\n </div>\n </SidebarHeader>\n <SidebarContent>\n <SidebarGroup>\n <SidebarGroupContent>\n <SidebarMenu>\n {NAV_ITEMS.map(({ href, icon: Icon, label }) => (\n <SidebarMenuItem key={href}>\n <SidebarMenuButton asChild isActive={pathname.startsWith(href)} tooltip={label}>\n <Link href={href}>\n <Icon />\n <span>{label}</span>\n </Link>\n </SidebarMenuButton>\n </SidebarMenuItem>\n ))}\n </SidebarMenu>\n </SidebarGroupContent>\n </SidebarGroup>\n <SidebarSeparator />\n <SidebarChats />\n {board && (\n <>\n <SidebarSeparator />\n <SidebarGroup>\n <SidebarGroupLabel>Board</SidebarGroupLabel>\n <SidebarGroupContent>\n <SidebarMenu>\n {BOARD_STATS.map(({ status, icon: Icon, label }) => {\n const count = board[status as keyof TaskBoard]?.length || 0\n return (\n <SidebarMenuItem key={status}>\n <SidebarMenuButton tooltip={`${label}: ${count}`}>\n <Icon />\n <span>{label}</span>\n <span className=\"ml-auto font-mono text-xs\">{count}</span>\n </SidebarMenuButton>\n </SidebarMenuItem>\n )\n })}\n </SidebarMenu>\n </SidebarGroupContent>\n </SidebarGroup>\n </>\n )}\n </SidebarContent>\n </Sidebar>\n )\n}\n","\"use client\"\r\n\r\nimport { useState, useEffect } from \"react\"\r\nimport { useRouter } from \"next/navigation\"\r\nimport { Search, FilePlus, LayoutDashboard, Activity, Brain, Map } from \"lucide-react\"\r\nimport { cn } from \"@/lib/utils\"\r\nimport { Dialog, DialogContent, DialogTitle } from \"@/components/ui/dialog\"\r\nimport { Input } from \"@/components/ui/input\"\r\nimport { ScrollArea } from \"@/components/ui/scroll-area\"\r\n\r\ninterface DocFile {\r\n path: string\r\n section: string\r\n name: string\r\n}\r\n\r\ninterface CommandPaletteProps {\r\n open: boolean\r\n onClose: () => void\r\n onOpenDoc: (path: string) => void\r\n onNewDoc?: () => void\r\n rootParam: string\r\n}\r\n\r\nexport function CommandPalette({ open, onClose, onOpenDoc, onNewDoc, rootParam }: CommandPaletteProps) {\r\n const router = useRouter()\r\n const [query, setQuery] = useState(\"\")\r\n const [results, setResults] = useState<DocFile[]>([])\r\n const [activeIndex, setActiveIndex] = useState(0)\r\n\r\n const QUICK_ACTIONS = [\r\n { label: \"New Doc\", icon: FilePlus, action: () => { onNewDoc?.(); onClose() } },\r\n { label: \"Go to Board\", icon: LayoutDashboard, action: () => { router.push(\"/board\"); onClose() } },\r\n { label: \"Go to Roadmap\", icon: Map, action: () => { router.push(\"/roadmap\"); onClose() } },\r\n { label: \"Go to Activity\", icon: Activity, action: () => { router.push(\"/activity\"); onClose() } },\r\n { label: \"Go to Memory\", icon: Brain, action: () => { router.push(\"/memory\"); onClose() } },\r\n ]\r\n\r\n // Reset state when closing\r\n useEffect(() => {\r\n if (!open) {\r\n setQuery(\"\")\r\n setResults([])\r\n setActiveIndex(0)\r\n }\r\n }, [open])\r\n\r\n // Debounced search\r\n useEffect(() => {\r\n if (query.length < 2) {\r\n setResults([])\r\n setActiveIndex(0)\r\n return\r\n }\r\n const t = setTimeout(async () => {\r\n try {\r\n const res = await fetch(`/api/docs${rootParam}&q=${encodeURIComponent(query)}`)\r\n const data = await res.json()\r\n setResults(\r\n data.results?.map((r: { file: string }) => ({\r\n path: r.file,\r\n section: r.file.split(\"/\").slice(0, -1).join(\"/\"),\r\n name: r.file.split(\"/\").pop()?.replace(/\\.md$/, \"\") ?? r.file,\r\n })) ?? []\r\n )\r\n setActiveIndex(0)\r\n } catch {}\r\n }, 300)\r\n return () => clearTimeout(t)\r\n }, [query, rootParam])\r\n\r\n function handleSelect(doc: DocFile) {\r\n onOpenDoc(doc.path)\r\n onClose()\r\n }\r\n\r\n function handleKeyDown(e: React.KeyboardEvent<HTMLInputElement>) {\r\n const showingResults = results.length > 0\r\n const listLength = showingResults ? results.length : QUICK_ACTIONS.length\r\n\r\n if (e.key === \"ArrowDown\") {\r\n e.preventDefault()\r\n setActiveIndex(i => Math.min(i + 1, listLength - 1))\r\n } else if (e.key === \"ArrowUp\") {\r\n e.preventDefault()\r\n setActiveIndex(i => Math.max(i - 1, 0))\r\n } else if (e.key === \"Enter\") {\r\n if (showingResults && results[activeIndex]) {\r\n handleSelect(results[activeIndex])\r\n } else if (!showingResults && query.length < 2 && QUICK_ACTIONS[activeIndex]) {\r\n QUICK_ACTIONS[activeIndex].action()\r\n }\r\n }\r\n }\r\n\r\n const showQuickActions = query === \"\"\r\n\r\n return (\r\n <Dialog open={open} onOpenChange={(v) => { if (!v) onClose() }}>\r\n <DialogContent className=\"max-w-lg p-0 overflow-hidden bg-surface border-border gap-0\">\r\n <DialogTitle className=\"sr-only\">Command Palette</DialogTitle>\r\n <div className=\"flex items-center px-4 h-12\">\r\n <Search className=\"h-4 w-4 text-muted shrink-0 mr-3\" />\r\n <Input\r\n autoFocus\r\n value={query}\r\n onChange={(e) => setQuery(e.target.value)}\r\n onKeyDown={handleKeyDown}\r\n placeholder=\"Search docs…\"\r\n className=\"border-0 bg-transparent h-full text-sm shadow-none focus-visible:ring-0 px-0 placeholder:text-muted\"\r\n />\r\n </div>\r\n <div className=\"border-t border-border\" />\r\n <ScrollArea className=\"max-h-72\">\r\n {showQuickActions && (\r\n <div className=\"py-1\">\r\n {QUICK_ACTIONS.map((action, i) => (\r\n <button\r\n key={action.label}\r\n onClick={action.action}\r\n onMouseEnter={() => setActiveIndex(i)}\r\n className={cn(\r\n \"flex items-center gap-3 w-full px-4 py-2 text-sm text-left transition-colors\",\r\n activeIndex === i ? \"bg-accent/10 text-txt\" : \"text-muted hover:text-txt\"\r\n )}\r\n >\r\n <action.icon className=\"h-4 w-4 shrink-0\" />\r\n {action.label}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n {!showQuickActions && results.length > 0 && (\r\n <div className=\"py-1\">\r\n {results.map((doc, i) => (\r\n <button\r\n key={doc.path}\r\n onClick={() => handleSelect(doc)}\r\n onMouseEnter={() => setActiveIndex(i)}\r\n className={cn(\r\n \"flex items-center justify-between w-full px-4 py-2 text-sm text-left transition-colors\",\r\n activeIndex === i ? \"bg-accent/10\" : \"hover:bg-accent/5\"\r\n )}\r\n >\r\n <span className=\"font-medium text-txt truncate\">{doc.name}</span>\r\n {doc.section && (\r\n <span className=\"text-xs text-muted ml-3 shrink-0 truncate max-w-[40%]\">{doc.section}</span>\r\n )}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n {!showQuickActions && query.length >= 2 && results.length === 0 && (\r\n <div className=\"px-4 py-6 text-center text-sm text-muted\">No docs found</div>\r\n )}\r\n </ScrollArea>\r\n </DialogContent>\r\n </Dialog>\r\n )\r\n}\r\n","// Subsequence fuzzy match for the Cmd+P file finder (VS Code-style, much simpler).\n// Every query char must appear in order. Consecutive runs, word starts and hits\n// in the file name (not the folder) score higher.\n\nconst BOUNDARY = /[/\\-_. ]/\n\n/**\n * Score `query` against `path`; null when not every query char is found in order.\n * Greedy from the leftmost hit would let \"hld\" start in \"arcHitecture\" and miss \"HLD.md\",\n * so try every position of the first char and keep the best.\n */\nexport function fuzzyScore(query: string, path: string): number | null {\n const q = query.toLowerCase().replace(/\\s+/g, \"\")\n if (!q) return 0\n const p = path.toLowerCase()\n let best: number | null = null\n for (let start = p.indexOf(q[0]); start !== -1; start = p.indexOf(q[0], start + 1)) {\n const s = greedyScore(q, p, start)\n if (s !== null && (best === null || s > best)) best = s\n }\n return best\n}\n\n// ponytail: O(path × first-char hits); fine for a few thousand docs, swap for DP if it lags.\nfunction greedyScore(q: string, p: string, start: number): number | null {\n const nameStart = p.lastIndexOf(\"/\") + 1\n let score = 0\n let qi = 0\n let prev = -2\n for (let i = start; i < p.length && qi < q.length; i++) {\n if (p[i] !== q[qi]) continue\n score += 1\n if (i === prev + 1) score += 5\n if (i === 0 || BOUNDARY.test(p[i - 1])) score += 8\n if (i >= nameStart) score += 3\n prev = i\n qi++\n }\n return qi === q.length ? score : null\n}\n\n/** Paths matching `query`, best first; ties go to the shorter path. */\nexport function fuzzyFilter<T>(query: string, items: T[], getPath: (item: T) => string): T[] {\n return items\n .map((item) => ({ item, path: getPath(item), score: fuzzyScore(query, getPath(item)) }))\n .filter((r): r is { item: T; path: string; score: number } => r.score !== null)\n .sort((a, b) => b.score - a.score || a.path.length - b.path.length)\n .map((r) => r.item)\n}\n","\"use client\"\n\nimport { useState, useEffect, useMemo, useRef } from \"react\"\nimport { FileText } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\nimport { fuzzyFilter } from \"@/lib/fuzzy\"\nimport { Dialog, DialogContent, DialogTitle } from \"@/components/ui/dialog\"\nimport { Input } from \"@/components/ui/input\"\nimport type { DocFile } from \"@/types\"\n\nconst MAX_RESULTS = 50\n\ninterface QuickOpenProps {\n open: boolean\n onClose: () => void\n onOpenDoc: (path: string) => void\n rootParam: string\n}\n\n/** Cmd+P — jump to a doc by fuzzy-matching its path (Cmd+K searches content). */\nexport function QuickOpen({ open, onClose, onOpenDoc, rootParam }: QuickOpenProps) {\n const [docs, setDocs] = useState<DocFile[]>([])\n const [query, setQuery] = useState(\"\")\n const [activeIndex, setActiveIndex] = useState(0)\n const listRef = useRef<HTMLDivElement>(null)\n\n const [wasOpen, setWasOpen] = useState(open)\n if (open !== wasOpen) {\n setWasOpen(open)\n if (open) { setQuery(\"\"); setActiveIndex(0) }\n }\n\n // Refetch on every open so new/renamed docs show up\n useEffect(() => {\n if (!open) return\n fetch(`/api/docs${rootParam}`)\n .then((r) => r.json())\n .then((d) => setDocs(Array.isArray(d) ? d : []))\n .catch(() => setDocs([]))\n }, [open, rootParam])\n\n const matches = useMemo(() => fuzzyFilter(query, docs, (d) => d.path), [query, docs])\n const shown = matches.slice(0, MAX_RESULTS)\n\n useEffect(() => {\n listRef.current?.querySelector(`[data-index=\"${activeIndex}\"]`)?.scrollIntoView({ block: \"nearest\" })\n }, [activeIndex])\n\n function select(doc: DocFile | undefined) {\n if (!doc) return\n onOpenDoc(doc.path)\n onClose()\n }\n\n function handleKeyDown(e: React.KeyboardEvent<HTMLInputElement>) {\n if (e.key === \"ArrowDown\" || (e.ctrlKey && e.key === \"n\")) {\n e.preventDefault()\n setActiveIndex((i) => Math.min(i + 1, shown.length - 1))\n } else if (e.key === \"ArrowUp\" || (e.ctrlKey && e.key === \"p\")) {\n e.preventDefault()\n setActiveIndex((i) => Math.max(i - 1, 0))\n } else if (e.key === \"Enter\") {\n e.preventDefault()\n select(shown[activeIndex])\n }\n }\n\n return (\n <Dialog open={open} onOpenChange={(v) => { if (!v) onClose() }}>\n <DialogContent className=\"max-w-xl p-0 overflow-hidden bg-surface border-border gap-0 top-[20%] translate-y-0\">\n <DialogTitle className=\"sr-only\">Go to file</DialogTitle>\n <Input\n autoFocus\n value={query}\n onChange={(e) => { setQuery(e.target.value); setActiveIndex(0) }}\n onKeyDown={handleKeyDown}\n placeholder=\"Go to file…\"\n className=\"h-11 rounded-none border-0 border-b border-border bg-transparent px-4 text-sm shadow-none focus-visible:ring-0 placeholder:text-muted\"\n />\n <div ref={listRef} className=\"max-h-80 overflow-y-auto py-1\">\n {shown.map((doc, i) => {\n const slash = doc.path.lastIndexOf(\"/\")\n return (\n <button\n key={doc.path}\n data-index={i}\n onClick={() => select(doc)}\n onMouseMove={() => setActiveIndex(i)}\n className={cn(\n \"flex items-center gap-2.5 w-full px-4 py-1.5 text-left text-sm transition-colors\",\n activeIndex === i ? \"bg-accent/10 text-txt\" : \"text-muted\",\n )}\n >\n <FileText className=\"h-3.5 w-3.5 shrink-0 opacity-60\" />\n <span className=\"truncate text-txt\">{doc.path.slice(slash + 1)}</span>\n {slash > 0 && <span className=\"truncate text-xs text-muted\">{doc.path.slice(0, slash)}</span>}\n </button>\n )\n })}\n {shown.length === 0 && <div className=\"px-4 py-6 text-center text-sm text-muted\">No matching files</div>}\n {matches.length > MAX_RESULTS && (\n <div className=\"px-4 py-1.5 text-xs text-muted\">{matches.length - MAX_RESULTS} more — keep typing to narrow</div>\n )}\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n","\"use client\"\n\nimport { useRouter } from \"next/navigation\"\nimport { useChats } from \"@/context/ChatContext\"\nimport { Dialog, DialogContent, DialogTitle } from \"@/components/ui/dialog\"\nimport { ChatView } from \"./ChatView\"\n\n/** The chat as a modal: same ChatView as /chat, with \"Open as page\". */\nexport function ChatModal() {\n const { chats, modalId, closeModal } = useChats()\n const router = useRouter()\n const title = chats.find((c) => c.id === modalId)?.title ?? \"Chat\"\n\n return (\n <Dialog open={!!modalId} onOpenChange={(open) => { if (!open) closeModal() }}>\n <DialogContent\n aria-describedby={undefined}\n className=\"flex h-[min(82vh,780px)] w-[calc(100vw-2rem)] flex-col gap-0 overflow-hidden rounded-xl p-0 shadow-2xl sm:max-w-3xl sm:rounded-xl\"\n >\n <DialogTitle className=\"sr-only\">{title}</DialogTitle>\n {modalId && (\n <ChatView\n chatId={modalId}\n variant=\"modal\"\n onNavigate={closeModal}\n onExpand={() => { closeModal({ keep: true }); router.push(`/chat?id=${encodeURIComponent(modalId)}`) }}\n />\n )}\n </DialogContent>\n </Dialog>\n )\n}\n","export function LoadingScreen() {\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center\">\r\n <div className=\"text-center\">\r\n <div className=\"flex gap-1.5 justify-center mb-4\">\r\n {[0, 1, 2].map((i) => (\r\n <div\r\n key={i}\r\n className=\"w-2 h-2 rounded-full bg-accent animate-pulse-dot\"\r\n style={{ animationDelay: `${i * 0.15}s` }}\r\n />\r\n ))}\r\n </div>\r\n <p className=\"text-muted text-sm font-mono\">Loading project...</p>\r\n </div>\r\n </div>\r\n )\r\n}\r\n","import type { Project, Summary } from \"@/types\"\nimport { useChats } from \"@/context/ChatContext\"\nimport { ProjectSwitcher } from \"./ProjectSwitcher\"\nimport { StatsPills } from \"./StatsPills\"\nimport { LiveIndicator } from \"./LiveIndicator\"\nimport { SidebarTrigger } from \"@/components/ui/sidebar\"\nimport { Separator } from \"@/components/ui/separator\"\nimport { useOrigin } from \"@/hooks/use-origin\"\n\ninterface AppHeaderProps {\n summary: Summary | null\n projects: Project[]\n activeProject: string\n liveIndicator: boolean\n onProjectChange: (root: string) => void\n onToggleChat: () => void\n}\n\nexport function AppHeader({ summary, projects, activeProject, liveIndicator, onProjectChange, onToggleChat }: AppHeaderProps) {\n const host = useOrigin().replace(/^https?:\\/\\//, \"\")\n // Chats waiting on the user, visible even while the chat modal is closed\n const waiting = useChats().waitingCount\n return (\n <header className=\"h-12 border-b border-border flex items-center px-4 gap-4 shrink-0 bg-surface/80 backdrop-blur-xs sticky top-0 z-50\">\n <SidebarTrigger className=\"-ml-1\" />\n <Separator orientation=\"vertical\" className=\"mr-2 h-4\" />\n {/* Logo */}\n <div className=\"flex items-center gap-2 shrink-0\">\n <div className=\"w-6 h-6 rounded-md bg-linear-to-br from-accent to-teal flex items-center justify-center text-xs\">\n ⬡\n </div>\n <span className=\"font-mono text-xs text-muted tracking-widest uppercase\">\n VibeDoc\n </span>\n </div>\n\n <ProjectSwitcher\n projects={projects}\n activeProject={activeProject}\n currentName={summary?.name || \"\"}\n onSelect={onProjectChange}\n />\n\n {summary && <StatsPills board={summary.tasks.board} />}\n\n <div className=\"flex-1\" />\n\n <LiveIndicator active={liveIndicator} />\n\n <button\n onClick={onToggleChat}\n title={waiting ? `Agent chat (c) · ${waiting} waiting for you` : \"Agent chat (c)\"}\n className=\"relative px-2 py-1 rounded-sm border border-border bg-surface2 text-xs font-mono text-muted hover:text-txt\"\n >\n Agent\n {waiting > 0 && (\n <span\n aria-label={`${waiting} waiting for you`}\n className=\"absolute -right-1.5 -top-1.5 min-w-4 h-4 px-1 rounded-full bg-amber text-bg text-[10px] leading-4 font-semibold text-center\"\n >\n {waiting}\n </span>\n )}\n </button>\n\n {/* MCP endpoint hint */}\n <div className=\"hidden md:flex items-center gap-1.5 px-2 py-1 rounded-sm bg-surface2 border border-border\">\n <span className=\"text-xs font-mono text-muted\">MCP</span>\n <code className=\"text-xs font-mono text-accent\">{host}/api/mcp</code>\n </div>\n </header>\n )\n}\n","import * as React from \"react\"\r\nimport { Slot } from \"@radix-ui/react-slot\"\r\nimport { cva, type VariantProps } from \"class-variance-authority\"\r\nimport { PanelLeft } from \"lucide-react\"\r\n\r\nimport { useIsMobile } from \"@/hooks/use-mobile\"\r\nimport { cn } from \"@/lib/utils\"\r\nimport { Button } from \"@/components/ui/button\"\r\nimport { Input } from \"@/components/ui/input\"\r\nimport { Separator } from \"@/components/ui/separator\"\r\nimport {\r\n Sheet,\r\n SheetContent,\r\n SheetDescription,\r\n SheetHeader,\r\n SheetTitle,\r\n} from \"@/components/ui/sheet\"\r\nimport { Skeleton } from \"@/components/ui/skeleton\"\r\nimport {\r\n Tooltip,\r\n TooltipContent,\r\n TooltipProvider,\r\n TooltipTrigger,\r\n} from \"@/components/ui/tooltip\"\r\n\r\nconst SIDEBAR_COOKIE_NAME = \"sidebar_state\"\r\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7\r\nconst SIDEBAR_WIDTH = \"16rem\"\r\nconst SIDEBAR_WIDTH_MOBILE = \"18rem\"\r\nconst SIDEBAR_WIDTH_ICON = \"3rem\"\r\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"b\"\r\n\r\ntype SidebarContextProps = {\r\n state: \"expanded\" | \"collapsed\"\r\n open: boolean\r\n setOpen: (open: boolean) => void\r\n openMobile: boolean\r\n setOpenMobile: (open: boolean) => void\r\n isMobile: boolean\r\n toggleSidebar: () => void\r\n}\r\n\r\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null)\r\n\r\nfunction useSidebar() {\r\n const context = React.useContext(SidebarContext)\r\n if (!context) {\r\n throw new Error(\"useSidebar must be used within a SidebarProvider.\")\r\n }\r\n\r\n return context\r\n}\r\n\r\nconst SidebarProvider = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<\"div\"> & {\r\n defaultOpen?: boolean\r\n open?: boolean\r\n onOpenChange?: (open: boolean) => void\r\n }\r\n>(\r\n (\r\n {\r\n defaultOpen = true,\r\n open: openProp,\r\n onOpenChange: setOpenProp,\r\n className,\r\n style,\r\n children,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const isMobile = useIsMobile()\r\n const [openMobile, setOpenMobile] = React.useState(false)\r\n\r\n // This is the internal state of the sidebar.\r\n // We use openProp and setOpenProp for control from outside the component.\r\n const [_open, _setOpen] = React.useState(defaultOpen)\r\n const open = openProp ?? _open\r\n const setOpen = React.useCallback(\r\n (value: boolean | ((value: boolean) => boolean)) => {\r\n const openState = typeof value === \"function\" ? value(open) : value\r\n if (setOpenProp) {\r\n setOpenProp(openState)\r\n } else {\r\n _setOpen(openState)\r\n }\r\n\r\n // This sets the cookie to keep the sidebar state.\r\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`\r\n },\r\n [setOpenProp, open]\r\n )\r\n\r\n // Helper to toggle the sidebar.\r\n const toggleSidebar = React.useCallback(() => {\r\n return isMobile\r\n ? setOpenMobile((open) => !open)\r\n : setOpen((open) => !open)\r\n }, [isMobile, setOpen, setOpenMobile])\r\n\r\n // Adds a keyboard shortcut to toggle the sidebar.\r\n React.useEffect(() => {\r\n const handleKeyDown = (event: KeyboardEvent) => {\r\n if (\r\n event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\r\n (event.metaKey || event.ctrlKey)\r\n ) {\r\n event.preventDefault()\r\n toggleSidebar()\r\n }\r\n }\r\n\r\n window.addEventListener(\"keydown\", handleKeyDown)\r\n return () => window.removeEventListener(\"keydown\", handleKeyDown)\r\n }, [toggleSidebar])\r\n\r\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\r\n // This makes it easier to style the sidebar with Tailwind classes.\r\n const state = open ? \"expanded\" : \"collapsed\"\r\n\r\n const contextValue = React.useMemo<SidebarContextProps>(\r\n () => ({\r\n state,\r\n open,\r\n setOpen,\r\n isMobile,\r\n openMobile,\r\n setOpenMobile,\r\n toggleSidebar,\r\n }),\r\n [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]\r\n )\r\n\r\n return (\r\n <SidebarContext.Provider value={contextValue}>\r\n <TooltipProvider delayDuration={0}>\r\n <div\r\n style={\r\n {\r\n \"--sidebar-width\": SIDEBAR_WIDTH,\r\n \"--sidebar-width-icon\": SIDEBAR_WIDTH_ICON,\r\n ...style,\r\n } as React.CSSProperties\r\n }\r\n className={cn(\r\n \"group/sidebar-wrapper flex min-h-svh w-full has-data-[variant=inset]:bg-sidebar\",\r\n className\r\n )}\r\n ref={ref}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n </TooltipProvider>\r\n </SidebarContext.Provider>\r\n )\r\n }\r\n)\r\nSidebarProvider.displayName = \"SidebarProvider\"\r\n\r\nconst Sidebar = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<\"div\"> & {\r\n side?: \"left\" | \"right\"\r\n variant?: \"sidebar\" | \"floating\" | \"inset\"\r\n collapsible?: \"offcanvas\" | \"icon\" | \"none\"\r\n }\r\n>(\r\n (\r\n {\r\n side = \"left\",\r\n variant = \"sidebar\",\r\n collapsible = \"offcanvas\",\r\n className,\r\n children,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const { isMobile, state, openMobile, setOpenMobile } = useSidebar()\r\n\r\n if (collapsible === \"none\") {\r\n return (\r\n <div\r\n className={cn(\r\n \"flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground\",\r\n className\r\n )}\r\n ref={ref}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n )\r\n }\r\n\r\n if (isMobile) {\r\n return (\r\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\r\n <SheetContent\r\n data-sidebar=\"sidebar\"\r\n data-mobile=\"true\"\r\n className=\"w-(--sidebar-width) bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden\"\r\n style={\r\n {\r\n \"--sidebar-width\": SIDEBAR_WIDTH_MOBILE,\r\n } as React.CSSProperties\r\n }\r\n side={side}\r\n >\r\n <SheetHeader className=\"sr-only\">\r\n <SheetTitle>Sidebar</SheetTitle>\r\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\r\n </SheetHeader>\r\n <div className=\"flex h-full w-full flex-col\">{children}</div>\r\n </SheetContent>\r\n </Sheet>\r\n )\r\n }\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className=\"group peer hidden text-sidebar-foreground md:block\"\r\n data-state={state}\r\n data-collapsible={state === \"collapsed\" ? collapsible : \"\"}\r\n data-variant={variant}\r\n data-side={side}\r\n >\r\n {/* This is what handles the sidebar gap on desktop */}\r\n <div\r\n className={cn(\r\n \"relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear\",\r\n \"group-data-[collapsible=offcanvas]:w-0\",\r\n \"group-data-[side=right]:rotate-180\",\r\n variant === \"floating\" || variant === \"inset\"\r\n ? \"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]\"\r\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\"\r\n )}\r\n />\r\n <div\r\n className={cn(\r\n \"fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex\",\r\n side === \"left\"\r\n ? \"left-0 group-data-[collapsible=offcanvas]:-left-(--sidebar-width)\"\r\n : \"right-0 group-data-[collapsible=offcanvas]:-right-(--sidebar-width)\",\r\n // Adjust the padding for floating and inset variants.\r\n variant === \"floating\" || variant === \"inset\"\r\n ? \"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]\"\r\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <div\r\n data-sidebar=\"sidebar\"\r\n className=\"flex h-full w-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow-sm\"\r\n >\r\n {children}\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n }\r\n)\r\nSidebar.displayName = \"Sidebar\"\r\n\r\nconst SidebarTrigger = React.forwardRef<\r\n React.ElementRef<typeof Button>,\r\n React.ComponentProps<typeof Button>\r\n>(({ className, onClick, ...props }, ref) => {\r\n const { toggleSidebar } = useSidebar()\r\n\r\n return (\r\n <Button\r\n ref={ref}\r\n data-sidebar=\"trigger\"\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className={cn(\"h-7 w-7\", className)}\r\n onClick={(event) => {\r\n onClick?.(event)\r\n toggleSidebar()\r\n }}\r\n {...props}\r\n >\r\n <PanelLeft />\r\n <span className=\"sr-only\">Toggle Sidebar</span>\r\n </Button>\r\n )\r\n})\r\nSidebarTrigger.displayName = \"SidebarTrigger\"\r\n\r\nconst SidebarRail = React.forwardRef<\r\n HTMLButtonElement,\r\n React.ComponentProps<\"button\">\r\n>(({ className, ...props }, ref) => {\r\n const { toggleSidebar } = useSidebar()\r\n\r\n return (\r\n <button\r\n ref={ref}\r\n data-sidebar=\"rail\"\r\n aria-label=\"Toggle Sidebar\"\r\n tabIndex={-1}\r\n onClick={toggleSidebar}\r\n title=\"Toggle Sidebar\"\r\n className={cn(\r\n \"absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-[translate,background-color] ease-linear after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] hover:after:bg-sidebar-border group-data-[side=left]:-right-4 group-data-[side=right]:left-0 sm:flex\",\r\n \"in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize\",\r\n \"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize\",\r\n \"group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full hover:group-data-[collapsible=offcanvas]:bg-sidebar\",\r\n \"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\",\r\n \"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarRail.displayName = \"SidebarRail\"\r\n\r\nconst SidebarInset = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<\"main\">\r\n>(({ className, ...props }, ref) => {\r\n return (\r\n <main\r\n ref={ref}\r\n className={cn(\r\n \"relative flex w-full flex-1 flex-col bg-bg\",\r\n \"md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarInset.displayName = \"SidebarInset\"\r\n\r\nconst SidebarInput = React.forwardRef<\r\n React.ElementRef<typeof Input>,\r\n React.ComponentProps<typeof Input>\r\n>(({ className, ...props }, ref) => {\r\n return (\r\n <Input\r\n ref={ref}\r\n data-sidebar=\"input\"\r\n className={cn(\r\n \"h-8 w-full bg-bg shadow-none focus-visible:ring-2 focus-visible:ring-sidebar-ring\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarInput.displayName = \"SidebarInput\"\r\n\r\nconst SidebarHeader = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<\"div\">\r\n>(({ className, ...props }, ref) => {\r\n return (\r\n <div\r\n ref={ref}\r\n data-sidebar=\"header\"\r\n className={cn(\"flex flex-col gap-2 p-2\", className)}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarHeader.displayName = \"SidebarHeader\"\r\n\r\nconst SidebarFooter = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<\"div\">\r\n>(({ className, ...props }, ref) => {\r\n return (\r\n <div\r\n ref={ref}\r\n data-sidebar=\"footer\"\r\n className={cn(\"flex flex-col gap-2 p-2\", className)}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarFooter.displayName = \"SidebarFooter\"\r\n\r\nconst SidebarSeparator = React.forwardRef<\r\n React.ElementRef<typeof Separator>,\r\n React.ComponentProps<typeof Separator>\r\n>(({ className, ...props }, ref) => {\r\n return (\r\n <Separator\r\n ref={ref}\r\n data-sidebar=\"separator\"\r\n className={cn(\"mx-2 w-auto bg-sidebar-border\", className)}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarSeparator.displayName = \"SidebarSeparator\"\r\n\r\nconst SidebarContent = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<\"div\">\r\n>(({ className, ...props }, ref) => {\r\n return (\r\n <div\r\n ref={ref}\r\n data-sidebar=\"content\"\r\n className={cn(\r\n \"flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarContent.displayName = \"SidebarContent\"\r\n\r\nconst SidebarGroup = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<\"div\">\r\n>(({ className, ...props }, ref) => {\r\n return (\r\n <div\r\n ref={ref}\r\n data-sidebar=\"group\"\r\n className={cn(\"relative flex w-full min-w-0 flex-col p-2\", className)}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarGroup.displayName = \"SidebarGroup\"\r\n\r\nconst SidebarGroupLabel = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<\"div\"> & { asChild?: boolean }\r\n>(({ className, asChild = false, ...props }, ref) => {\r\n const Comp = asChild ? Slot : \"div\"\r\n\r\n return (\r\n <Comp\r\n ref={ref}\r\n data-sidebar=\"group-label\"\r\n className={cn(\r\n \"flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 outline-hidden ring-sidebar-ring transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\r\n \"group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarGroupLabel.displayName = \"SidebarGroupLabel\"\r\n\r\nconst SidebarGroupAction = React.forwardRef<\r\n HTMLButtonElement,\r\n React.ComponentProps<\"button\"> & { asChild?: boolean }\r\n>(({ className, asChild = false, ...props }, ref) => {\r\n const Comp = asChild ? Slot : \"button\"\r\n\r\n return (\r\n <Comp\r\n ref={ref}\r\n data-sidebar=\"group-action\"\r\n className={cn(\r\n \"absolute right-3 top-3.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-hidden ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\r\n // Increases the hit area of the button on mobile.\r\n \"after:absolute after:-inset-2 md:after:hidden\",\r\n \"group-data-[collapsible=icon]:hidden\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarGroupAction.displayName = \"SidebarGroupAction\"\r\n\r\nconst SidebarGroupContent = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<\"div\">\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n data-sidebar=\"group-content\"\r\n className={cn(\"w-full text-sm\", className)}\r\n {...props}\r\n />\r\n))\r\nSidebarGroupContent.displayName = \"SidebarGroupContent\"\r\n\r\nconst SidebarMenu = React.forwardRef<\r\n HTMLUListElement,\r\n React.ComponentProps<\"ul\">\r\n>(({ className, ...props }, ref) => (\r\n <ul\r\n ref={ref}\r\n data-sidebar=\"menu\"\r\n className={cn(\"flex w-full min-w-0 flex-col gap-1\", className)}\r\n {...props}\r\n />\r\n))\r\nSidebarMenu.displayName = \"SidebarMenu\"\r\n\r\nconst SidebarMenuItem = React.forwardRef<\r\n HTMLLIElement,\r\n React.ComponentProps<\"li\">\r\n>(({ className, ...props }, ref) => (\r\n <li\r\n ref={ref}\r\n data-sidebar=\"menu-item\"\r\n className={cn(\"group/menu-item relative\", className)}\r\n {...props}\r\n />\r\n))\r\nSidebarMenuItem.displayName = \"SidebarMenuItem\"\r\n\r\nconst sidebarMenuButtonVariants = cva(\r\n \"peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-hidden ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-data-[sidebar=menu-action]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0\",\r\n {\r\n variants: {\r\n variant: {\r\n default: \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\r\n outline:\r\n \"bg-bg shadow-[0_0_0_1px_rgb(var(--rgb-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_rgb(var(--rgb-surface2))]\",\r\n },\r\n size: {\r\n default: \"h-8 text-sm\",\r\n sm: \"h-7 text-xs\",\r\n lg: \"h-12 text-sm group-data-[collapsible=icon]:p-0!\",\r\n },\r\n },\r\n defaultVariants: {\r\n variant: \"default\",\r\n size: \"default\",\r\n },\r\n }\r\n)\r\n\r\nconst SidebarMenuButton = React.forwardRef<\r\n HTMLButtonElement,\r\n React.ComponentProps<\"button\"> & {\r\n asChild?: boolean\r\n isActive?: boolean\r\n tooltip?: string | React.ComponentProps<typeof TooltipContent>\r\n } & VariantProps<typeof sidebarMenuButtonVariants>\r\n>(\r\n (\r\n {\r\n asChild = false,\r\n isActive = false,\r\n variant = \"default\",\r\n size = \"default\",\r\n tooltip,\r\n className,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const Comp = asChild ? Slot : \"button\"\r\n const { isMobile, state } = useSidebar()\r\n\r\n const button = (\r\n <Comp\r\n ref={ref}\r\n data-sidebar=\"menu-button\"\r\n data-size={size}\r\n data-active={isActive}\r\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\r\n {...props}\r\n />\r\n )\r\n\r\n if (!tooltip) {\r\n return button\r\n }\r\n\r\n if (typeof tooltip === \"string\") {\r\n tooltip = {\r\n children: tooltip,\r\n }\r\n }\r\n\r\n return (\r\n <Tooltip>\r\n <TooltipTrigger asChild>{button}</TooltipTrigger>\r\n <TooltipContent\r\n side=\"right\"\r\n align=\"center\"\r\n hidden={state !== \"collapsed\" || isMobile}\r\n {...tooltip}\r\n />\r\n </Tooltip>\r\n )\r\n }\r\n)\r\nSidebarMenuButton.displayName = \"SidebarMenuButton\"\r\n\r\nconst SidebarMenuAction = React.forwardRef<\r\n HTMLButtonElement,\r\n React.ComponentProps<\"button\"> & {\r\n asChild?: boolean\r\n showOnHover?: boolean\r\n }\r\n>(({ className, asChild = false, showOnHover = false, ...props }, ref) => {\r\n const Comp = asChild ? Slot : \"button\"\r\n\r\n return (\r\n <Comp\r\n ref={ref}\r\n data-sidebar=\"menu-action\"\r\n className={cn(\r\n \"absolute right-1 top-1.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-hidden ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 peer-hover/menu-button:text-sidebar-accent-foreground [&>svg]:size-4 [&>svg]:shrink-0\",\r\n // Increases the hit area of the button on mobile.\r\n \"after:absolute after:-inset-2 md:after:hidden\",\r\n \"peer-data-[size=sm]/menu-button:top-1\",\r\n \"peer-data-[size=default]/menu-button:top-1.5\",\r\n \"peer-data-[size=lg]/menu-button:top-2.5\",\r\n \"group-data-[collapsible=icon]:hidden\",\r\n showOnHover &&\r\n \"group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground md:opacity-0\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarMenuAction.displayName = \"SidebarMenuAction\"\r\n\r\nconst SidebarMenuBadge = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<\"div\">\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n data-sidebar=\"menu-badge\"\r\n className={cn(\r\n \"pointer-events-none absolute right-1 flex h-5 min-w-5 select-none items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums text-sidebar-foreground\",\r\n \"peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground\",\r\n \"peer-data-[size=sm]/menu-button:top-1\",\r\n \"peer-data-[size=default]/menu-button:top-1.5\",\r\n \"peer-data-[size=lg]/menu-button:top-2.5\",\r\n \"group-data-[collapsible=icon]:hidden\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nSidebarMenuBadge.displayName = \"SidebarMenuBadge\"\r\n\r\nconst SidebarMenuSkeleton = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentProps<\"div\"> & {\r\n showIcon?: boolean\r\n }\r\n>(({ className, showIcon = false, ...props }, ref) => {\r\n // Random width between 50 to 90%.\r\n const width = React.useMemo(() => {\r\n return `${Math.floor(Math.random() * 40) + 50}%`\r\n }, [])\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n data-sidebar=\"menu-skeleton\"\r\n className={cn(\"flex h-8 items-center gap-2 rounded-md px-2\", className)}\r\n {...props}\r\n >\r\n {showIcon && (\r\n <Skeleton\r\n className=\"size-4 rounded-md\"\r\n data-sidebar=\"menu-skeleton-icon\"\r\n />\r\n )}\r\n <Skeleton\r\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\r\n data-sidebar=\"menu-skeleton-text\"\r\n style={\r\n {\r\n \"--skeleton-width\": width,\r\n } as React.CSSProperties\r\n }\r\n />\r\n </div>\r\n )\r\n})\r\nSidebarMenuSkeleton.displayName = \"SidebarMenuSkeleton\"\r\n\r\nconst SidebarMenuSub = React.forwardRef<\r\n HTMLUListElement,\r\n React.ComponentProps<\"ul\">\r\n>(({ className, ...props }, ref) => (\r\n <ul\r\n ref={ref}\r\n data-sidebar=\"menu-sub\"\r\n className={cn(\r\n \"mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5\",\r\n \"group-data-[collapsible=icon]:hidden\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nSidebarMenuSub.displayName = \"SidebarMenuSub\"\r\n\r\nconst SidebarMenuSubItem = React.forwardRef<\r\n HTMLLIElement,\r\n React.ComponentProps<\"li\">\r\n>(({ ...props }, ref) => <li ref={ref} {...props} />)\r\nSidebarMenuSubItem.displayName = \"SidebarMenuSubItem\"\r\n\r\nconst SidebarMenuSubButton = React.forwardRef<\r\n HTMLAnchorElement,\r\n React.ComponentProps<\"a\"> & {\r\n asChild?: boolean\r\n size?: \"sm\" | \"md\"\r\n isActive?: boolean\r\n }\r\n>(({ asChild = false, size = \"md\", isActive, className, ...props }, ref) => {\r\n const Comp = asChild ? Slot : \"a\"\r\n\r\n return (\r\n <Comp\r\n ref={ref}\r\n data-sidebar=\"menu-sub-button\"\r\n data-size={size}\r\n data-active={isActive}\r\n className={cn(\r\n \"flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground outline-hidden ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground\",\r\n \"data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground\",\r\n size === \"sm\" && \"text-xs\",\r\n size === \"md\" && \"text-sm\",\r\n \"group-data-[collapsible=icon]:hidden\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n})\r\nSidebarMenuSubButton.displayName = \"SidebarMenuSubButton\"\r\n\r\nexport {\r\n Sidebar,\r\n SidebarContent,\r\n SidebarFooter,\r\n SidebarGroup,\r\n SidebarGroupAction,\r\n SidebarGroupContent,\r\n SidebarGroupLabel,\r\n SidebarHeader,\r\n SidebarInput,\r\n SidebarInset,\r\n SidebarMenu,\r\n SidebarMenuAction,\r\n SidebarMenuBadge,\r\n SidebarMenuButton,\r\n SidebarMenuItem,\r\n SidebarMenuSkeleton,\r\n SidebarMenuSub,\r\n SidebarMenuSubButton,\r\n SidebarMenuSubItem,\r\n SidebarProvider,\r\n SidebarRail,\r\n SidebarSeparator,\r\n SidebarTrigger,\r\n useSidebar,\r\n}\r\n","import * as React from \"react\"\r\n\r\nconst MOBILE_BREAKPOINT = 768\r\n\r\nexport function useIsMobile() {\r\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined)\r\n\r\n React.useEffect(() => {\r\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)\r\n const onChange = () => {\r\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\r\n }\r\n mql.addEventListener(\"change\", onChange)\r\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\r\n return () => mql.removeEventListener(\"change\", onChange)\r\n }, [])\r\n\r\n return !!isMobile\r\n}\r\n","import { cn } from \"@/lib/utils\"\r\n\r\nfunction Skeleton({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) {\r\n return (\r\n <div\r\n className={cn(\"animate-pulse rounded-md bg-surface2\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport { Skeleton }\r\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'layout-dashboard',\n size: 24,\n node: [\n ['rect', { width: '7', height: '9', x: '3', y: '3', rx: '1', key: '10lvy0' }],\n ['rect', { width: '7', height: '5', x: '14', y: '3', rx: '1', key: '16une8' }],\n ['rect', { width: '7', height: '9', x: '14', y: '12', rx: '1', key: '1hutg5' }],\n ['rect', { width: '7', height: '5', x: '3', y: '16', rx: '1', key: 'ldoo1y' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name LayoutDashboard\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSI5IiB4PSIzIiB5PSIzIiByeD0iMSIgLz4KICA8cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSI1IiB4PSIxNCIgeT0iMyIgcng9IjEiIC8+CiAgPHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iOSIgeD0iMTQiIHk9IjEyIiByeD0iMSIgLz4KICA8cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSI1IiB4PSIzIiB5PSIxNiIgcng9IjEiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/layout-dashboard\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst LayoutDashboard = createLucideIcon(__iconData);\n\nexport default LayoutDashboard;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'ban',\n size: 24,\n node: [\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n ['path', { d: 'M4.929 4.929 19.07 19.071', key: '196cmz' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name Ban\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgLz4KICA8cGF0aCBkPSJNNC45MjkgNC45MjkgMTkuMDcgMTkuMDcxIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/ban\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Ban = createLucideIcon(__iconData);\n\nexport default Ban;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'clipboard-list',\n size: 24,\n node: [\n ['rect', { width: '8', height: '4', x: '8', y: '2', rx: '1', ry: '1', key: 'tgr4d6' }],\n [\n 'path',\n {\n d: 'M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2',\n key: '116196',\n },\n ],\n ['path', { d: 'M12 11h4', key: '1jrz19' }],\n ['path', { d: 'M12 16h4', key: 'n85exb' }],\n ['path', { d: 'M8 11h.01', key: '1dfujw' }],\n ['path', { d: 'M8 16h.01', key: '18s6g9' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name ClipboardList\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iOCIgaGVpZ2h0PSI0IiB4PSI4IiB5PSIyIiByeD0iMSIgcnk9IjEiIC8+CiAgPHBhdGggZD0iTTE2IDRoMmEyIDIgMCAwIDEgMiAydjE0YTIgMiAwIDAgMS0yIDJINmEyIDIgMCAwIDEtMi0yVjZhMiAyIDAgMCAxIDItMmgyIiAvPgogIDxwYXRoIGQ9Ik0xMiAxMWg0IiAvPgogIDxwYXRoIGQ9Ik0xMiAxNmg0IiAvPgogIDxwYXRoIGQ9Ik04IDExaC4wMSIgLz4KICA8cGF0aCBkPSJNOCAxNmguMDEiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/clipboard-list\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ClipboardList = createLucideIcon(__iconData);\n\nexport default ClipboardList;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'circle-check',\n size: 24,\n node: [\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n ['path', { d: 'm16 9-5.5 5.5L8 12', key: 'xofnsj' }],\n ],\n aliases: ['check-circle-2'],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name CircleCheck\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgLz4KICA8cGF0aCBkPSJtMTYgOS01LjUgNS41TDggMTIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/circle-check\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst CircleCheck = createLucideIcon(__iconData);\n\nexport default CircleCheck;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'brain',\n size: 24,\n node: [\n ['path', { d: 'M12 18V5', key: 'adv99a' }],\n ['path', { d: 'M15 13a4.17 4.17 0 0 1-3-4 4.17 4.17 0 0 1-3 4', key: '1e3is1' }],\n ['path', { d: 'M17.598 6.5A3 3 0 1 0 12 5a3 3 0 1 0-5.598 1.5', key: '1gqd8o' }],\n ['path', { d: 'M17.997 5.125a4 4 0 0 1 2.526 5.77', key: 'iwvgf7' }],\n ['path', { d: 'M18 18a4 4 0 0 0 2-7.464', key: 'efp6ie' }],\n ['path', { d: 'M19.967 17.483A4 4 0 1 1 12 18a4 4 0 1 1-7.967-.517', key: '1gq6am' }],\n ['path', { d: 'M6 18a4 4 0 0 1-2-7.464', key: 'k1g0md' }],\n ['path', { d: 'M6.003 5.125a4 4 0 0 0-2.526 5.77', key: 'q97ue3' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name Brain\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgMThWNSIgLz4KICA8cGF0aCBkPSJNMTUgMTNhNC4xNyA0LjE3IDAgMCAxLTMtNCA0LjE3IDQuMTcgMCAwIDEtMyA0IiAvPgogIDxwYXRoIGQ9Ik0xNy41OTggNi41QTMgMyAwIDEgMCAxMiA1YTMgMyAwIDEgMC01LjU5OCAxLjUiIC8+CiAgPHBhdGggZD0iTTE3Ljk5NyA1LjEyNWE0IDQgMCAwIDEgMi41MjYgNS43NyIgLz4KICA8cGF0aCBkPSJNMTggMThhNCA0IDAgMCAwIDItNy40NjQiIC8+CiAgPHBhdGggZD0iTTE5Ljk2NyAxNy40ODNBNCA0IDAgMSAxIDEyIDE4YTQgNCAwIDEgMS03Ljk2Ny0uNTE3IiAvPgogIDxwYXRoIGQ9Ik02IDE4YTQgNCAwIDAgMS0yLTcuNDY0IiAvPgogIDxwYXRoIGQ9Ik02LjAwMyA1LjEyNWE0IDQgMCAwIDAtMi41MjYgNS43NyIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/brain\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Brain = createLucideIcon(__iconData);\n\nexport default Brain;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'panel-left',\n size: 24,\n node: [\n ['rect', { width: '18', height: '18', x: '3', y: '3', rx: '2', key: 'afitv7' }],\n ['path', { d: 'M9 3v18', key: 'fh3hqa' }],\n ],\n aliases: ['sidebar'],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name PanelLeft\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHg9IjMiIHk9IjMiIHJ4PSIyIiAvPgogIDxwYXRoIGQ9Ik05IDN2MTgiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/panel-left\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst PanelLeft = createLucideIcon(__iconData);\n\nexport default PanelLeft;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'circle-dot',\n size: 24,\n node: [\n ['circle', { cx: '12', cy: '12', r: '1', key: '41hilf' }],\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name CircleDot\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxIiAvPgogIDxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjEwIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/circle-dot\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst CircleDot = createLucideIcon(__iconData);\n\nexport default CircleDot;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'file-plus',\n size: 24,\n node: [\n [\n 'path',\n {\n d: 'M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z',\n key: '1oefj6',\n },\n ],\n ['path', { d: 'M14 2v5a1 1 0 0 0 1 1h5', key: 'wfsgrz' }],\n ['path', { d: 'M9 15h6', key: 'cctwl0' }],\n ['path', { d: 'M12 18v-6', key: '17g6i2' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name FilePlus\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNiAyMmEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDQuNzA2bDMuNTg4IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHYxMmEyIDIgMCAwIDEtMiAyeiIgLz4KICA8cGF0aCBkPSJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgLz4KICA8cGF0aCBkPSJNOSAxNWg2IiAvPgogIDxwYXRoIGQ9Ik0xMiAxOHYtNiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/file-plus\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst FilePlus = createLucideIcon(__iconData);\n\nexport default FilePlus;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'activity',\n size: 24,\n node: [\n [\n 'path',\n {\n d: 'M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2',\n key: '169zse',\n },\n ],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name Activity\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjIgMTJoLTIuNDhhMiAyIDAgMCAwLTEuOTMgMS40NmwtMi4zNSA4LjM2YS4yNS4yNSAwIDAgMS0uNDggMEw5LjI0IDIuMThhLjI1LjI1IDAgMCAwLS40OCAwbC0yLjM1IDguMzZBMiAyIDAgMCAxIDQuNDkgMTJIMiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/activity\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Activity = createLucideIcon(__iconData);\n\nexport default Activity;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'folder-tree',\n size: 24,\n node: [\n [\n 'path',\n {\n d: 'M20 10a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1h-2.5a1 1 0 0 1-.8-.4l-.9-1.2A1 1 0 0 0 15 3h-2a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1Z',\n key: 'hod4my',\n },\n ],\n [\n 'path',\n {\n d: 'M20 21a1 1 0 0 0 1-1v-3a1 1 0 0 0-1-1h-2.9a1 1 0 0 1-.88-.55l-.42-.85a1 1 0 0 0-.92-.6H13a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1Z',\n key: 'w4yl2u',\n },\n ],\n ['path', { d: 'M3 5a2 2 0 0 0 2 2h3', key: 'f2jnh7' }],\n ['path', { d: 'M3 3v13a2 2 0 0 0 2 2h3', key: 'k8epm1' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name FolderTree\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjAgMTBhMSAxIDAgMCAwIDEtMVY2YTEgMSAwIDAgMC0xLTFoLTIuNWExIDEgMCAwIDEtLjgtLjRsLS45LTEuMkExIDEgMCAwIDAgMTUgM2gtMmExIDEgMCAwIDAtMSAxdjVhMSAxIDAgMCAwIDEgMVoiIC8+CiAgPHBhdGggZD0iTTIwIDIxYTEgMSAwIDAgMCAxLTF2LTNhMSAxIDAgMCAwLTEtMWgtMi45YTEgMSAwIDAgMS0uODgtLjU1bC0uNDItLjg1YTEgMSAwIDAgMC0uOTItLjZIMTNhMSAxIDAgMCAwLTEgMXY1YTEgMSAwIDAgMCAxIDFaIiAvPgogIDxwYXRoIGQ9Ik0zIDVhMiAyIDAgMCAwIDIgMmgzIiAvPgogIDxwYXRoIGQ9Ik0zIDN2MTNhMiAyIDAgMCAwIDIgMmgzIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/folder-tree\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst FolderTree = createLucideIcon(__iconData);\n\nexport default FolderTree;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'messages-square',\n size: 24,\n node: [\n [\n 'path',\n {\n d: 'M16 10a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 14.286V4a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z',\n key: '1n2ejm',\n },\n ],\n [\n 'path',\n {\n d: 'M20 9a2 2 0 0 1 2 2v10.286a.71.71 0 0 1-1.212.502l-2.202-2.202A2 2 0 0 0 17.172 19H10a2 2 0 0 1-2-2v-1',\n key: '1qfcsi',\n },\n ],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name MessagesSquare\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTYgMTBhMiAyIDAgMCAxLTIgMkg2LjgyOGEyIDIgMCAwIDAtMS40MTQuNTg2bC0yLjIwMiAyLjIwMkEuNzEuNzEgMCAwIDEgMiAxNC4yODZWNGEyIDIgMCAwIDEgMi0yaDEwYTIgMiAwIDAgMSAyIDJ6IiAvPgogIDxwYXRoIGQ9Ik0yMCA5YTIgMiAwIDAgMSAyIDJ2MTAuMjg2YS43MS43MSAwIDAgMS0xLjIxMi41MDJsLTIuMjAyLTIuMjAyQTIgMiAwIDAgMCAxNy4xNzIgMTlIMTBhMiAyIDAgMCAxLTItMnYtMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/messages-square\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst MessagesSquare = createLucideIcon(__iconData);\n\nexport default MessagesSquare;\n"],"names":["SettingsApplier","rootParam","refresh","setEditorSettings","setAutoRefreshSeconds","autoRefreshSeconds","intervalRef","cancelled","fetch","r","settings","then","fontSize","ok","json","theme","accentColor","editor","project","autoRefresh","catch","current","clearInterval","setInterval"],"mappings":"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","ignoreList":[16,17,18,19,20,21,22,23,24,25,26]}
@@ -0,0 +1,5 @@
1
+ module.exports=[690793,a=>{"use strict";var b=a.i(662145),c=a.i(174897),d=a.i(365465),e=a.i(152716),f=a.i(340933),g=a.i(795667),h=a.i(926128),i=a.i(256857);let j={name:"list-tree",size:24,node:[["path",{d:"M8 5h13",key:"1pao27"}],["path",{d:"M13 12h8",key:"h98zly"}],["path",{d:"M13 19h8",key:"c3s6r1"}],["path",{d:"M3 10a2 2 0 0 0 2 2h3",key:"1npucw"}],["path",{d:"M3 5v12a2 2 0 0 0 2 2h3",key:"x1gjn2"}]]};j.node;let k=(0,i.default)(j);var l=a.i(200382),m=a.i(551729),n=a.i(913975),o=a.i(544394),p=a.i(21215),q=a.i(699570);let r=a=>"done"===a||"cancelled"===a;function s(a,b){let c=new Map(b.map(a=>[a.id,a])),d=a.tasks.map(a=>c.get(a)).filter(a=>!!a),e=a=>[...new Set((a.dependsOn.match(/\bT\d+\b/gi)??[]).map(a=>a.toUpperCase()))].filter(a=>{let b=c.get(a);return!b||!r(b.status)});for(let a of d)if("todo"===a.status&&!e(a).length)return{kind:"ready",taskId:a.id};if(d.every(a=>r(a.status)))return{kind:"finished"};let f=new Set(a.tasks),g=new Map,h=a=>{if(g.has(a))return g.get(a)??!1;g.set(a,!1);let b=c.get(a),d=!!b&&"blocked"!==b.status&&("todo"!==b.status||f.has(a)&&e(b).every(h));return g.set(a,d),d},i=[];for(let b of a.tasks){let a=c.get(b);if(a){if("in-progress"===a.status)i.push({taskId:b,reason:`${b} is in progress (claimed)`});else if("blocked"===a.status)i.push({taskId:b,reason:`${b} is blocked`});else if("todo"===a.status){let d=e(a).map(a=>`${a} (${c.get(a)?.status??"missing"})`);i.push({taskId:b,reason:`${b} waits on ${d.join(", ")}`})}}else i.push({taskId:b,reason:`${b} has no task file`})}return{kind:"waiting",waiting:i,needsHuman:i.every(a=>!h(a.taskId))}}var t=a.i(452696),u=a.i(368114),v=a.i(525395),w=a.i(618940),x=a.i(815122),y=a.i(581040);function z({items:a,today:d,onSelect:e,progressById:f}){let g=new Map(a.filter(a=>null===a.parent).sort((a,b)=>a.order-b.order).map((a,b)=>[a.id,b+1])),h=(0,c.useMemo)(()=>(0,y.buildTimeline)(a,d),[a,d]),i=(0,c.useRef)(null);(0,c.useEffect)(()=>{let a=i.current;a&&(a.scrollLeft=Math.max(0,h.todayX-(a.clientWidth-200)/3))},[h.todayX]);let j=h.lanes.some(a=>a.markers.length>0);return(0,b.jsxs)("div",{className:"flex flex-1 min-h-0 flex-col",children:[(0,b.jsx)("div",{ref:i,className:"relative flex-1 min-h-0 overflow-auto",children:(0,b.jsxs)("div",{className:"relative",style:{width:200+h.width,minHeight:"100%"},children:[(0,b.jsxs)("div",{className:"pointer-events-none absolute inset-y-0",style:{left:200,width:h.width},children:[h.months.map(a=>(0,b.jsx)("div",{className:"absolute inset-y-0 border-l border-border",style:{left:a.x}},a.x)),(0,b.jsx)("div",{className:"absolute inset-y-0 left-0 bg-surface/50",style:{width:h.todayX}}),(0,b.jsx)("div",{className:"absolute inset-y-0 w-px bg-accent shadow-[0_0_12px_rgb(var(--rgb-accent)/0.8)]",style:{left:h.todayX},children:(0,b.jsx)("span",{className:"absolute -translate-x-1/2 rounded-full bg-accent px-2 py-0.5 font-mono text-[10px] uppercase tracking-wider text-white",style:{top:42},children:"Today"})})]}),(0,b.jsxs)("div",{className:"sticky top-0 z-20 flex border-b border-border bg-bg",style:{height:36},children:[(0,b.jsx)("div",{className:"sticky left-0 z-10 shrink-0 bg-bg",style:{width:200}}),(0,b.jsx)("div",{className:"relative",children:h.months.map(a=>(0,b.jsx)("span",{className:"absolute top-3 whitespace-nowrap pl-2 font-mono text-[10px] uppercase tracking-widest text-muted",style:{left:a.x},children:a.label},a.x))})]}),h.lanes.map(a=>(0,b.jsxs)("div",{className:"relative flex border-b border-border",children:[(0,b.jsx)(A,{item:a.item,chapter:g.get(a.item.id),progress:f[a.item.id],onSelect:e}),(0,b.jsx)("div",{className:"relative",style:{width:h.width,height:a.rows*y.LANE_ROW_H+12},children:a.markers.map(a=>(0,b.jsxs)("button",{type:"button",onClick:()=>e(a.item.id),title:`${a.item.id} \xb7 ${a.item.title} \xb7 due ${a.item.due}${"overdue"===a.state?" (overdue)":""}`,className:"group absolute flex items-center gap-1.5",style:{left:a.x-10,top:6+a.row*y.LANE_ROW_H},children:[a.horizon?(0,b.jsx)("span",{className:(0,u.cn)("h-4 w-4 rotate-45 border-2 border-accent","done"===a.item.status?"bg-accent":"bg-bg","overdue"===a.state&&"border-danger")}):(0,b.jsx)("span",{className:(0,u.cn)("rounded-full","overdue"===a.state&&"ring-2 ring-danger ring-offset-1 ring-offset-bg"),children:(0,b.jsx)(w.StatusDot,{status:a.item.status})}),(0,b.jsxs)("span",{className:(0,u.cn)("flex max-w-[150px] flex-col rounded-md border px-2 py-0.5 text-left transition-colors","in-progress"===a.item.status?"border-accent/50 bg-surface shadow-[0_6px_18px_-10px_rgb(var(--rgb-accent)/0.7)]":"done"===a.item.status?"border-border bg-surface/60":"border-dashed border-border2 bg-bg","group-hover:border-accent"),children:[(0,b.jsxs)("span",{className:"flex items-center gap-1",children:[(0,b.jsx)("span",{className:(0,u.cn)("truncate text-xs","done"===a.item.status?"text-muted":"text-txt",a.horizon&&"font-semibold"),children:a.item.title}),(0,b.jsx)(x.AgentDot,{attach:{kind:"epic",id:a.item.id}})]}),(0,b.jsx)("span",{className:(0,u.cn)("font-mono text-[10px]","overdue"===a.state?"text-danger":"soon"===a.state?"text-amber":"text-muted"),children:(0,y.formatDay)(a.item.due)})]})]},a.item.id))})]},a.item.id)),!j&&(0,b.jsx)("p",{className:"px-6 py-8 text-sm text-muted",style:{marginLeft:200},children:"No due dates yet — open an item and set a Due date."})]})}),h.undated.length>0&&(0,b.jsxs)("div",{className:"max-h-28 shrink-0 overflow-y-auto border-t border-border bg-surface px-4 py-2",children:[(0,b.jsxs)("p",{className:"mb-2 font-mono text-[10px] uppercase tracking-widest text-muted",children:["No due date · ",h.undated.length]}),(0,b.jsx)("div",{className:"flex flex-wrap gap-1.5",children:h.undated.map(a=>(0,b.jsxs)("button",{type:"button",onClick:()=>e(a.id),className:"flex items-center gap-1 rounded-md border border-border px-1.5 py-0.5 text-xs text-muted hover:border-accent hover:text-txt",children:[(0,b.jsx)(w.StatusDot,{status:a.status}),a.title,(0,b.jsx)(x.AgentDot,{attach:{kind:"epic",id:a.id}})]},a.id))})]})]})}function A({item:a,chapter:c,progress:d,onSelect:e}){return(0,b.jsxs)("button",{type:"button",onClick:()=>e(a.id),className:"sticky left-0 z-10 flex shrink-0 items-center gap-3 border-r border-border bg-surface px-3 text-left hover:bg-surface2",style:{width:200},children:[(0,b.jsx)("span",{className:(0,u.cn)("font-mono text-lg font-semibold tabular-nums","in-progress"===a.status?"text-accent":"done"===a.status?"text-teal":"text-muted"),children:c?String(c).padStart(2,"0"):"··"}),(0,b.jsxs)("span",{className:"flex min-w-0 flex-1 flex-col gap-1",children:[(0,b.jsx)("span",{className:"line-clamp-2 text-[11px] font-semibold uppercase leading-snug tracking-wider text-txt",children:a.title}),d&&(0,b.jsx)("span",{className:"h-1 overflow-hidden rounded-full bg-border",children:(0,b.jsx)("span",{className:"block h-full rounded-full bg-teal",style:{width:`${d.done/d.total*100}%`}})})]})]})}var B=a.i(453161),C=a.i(156298),D=a.i(441852),E=a.i(661661),F=a.i(757061),G=a.i(866718),H=a.i(149350),I=a.i(107742),J=a.i(685698);let K=["planned","in-progress","done"],L="w-full rounded-md border border-border bg-bg px-3 py-2 text-sm text-txt focus:outline-hidden focus:ring-1 focus:ring-accent disabled:opacity-50",M="text-xs font-medium text-muted",N="font-mono text-[10px] uppercase tracking-widest text-muted";function O({item:a,onClose:c,...d}){return(0,b.jsx)(F.Sheet,{open:!!a,onOpenChange:a=>{a||c()},children:(0,b.jsx)(F.SheetContent,{className:"w-[480px] sm:max-w-[480px] gap-0 bg-surface border-border text-txt flex flex-col overflow-y-auto p-0",children:a&&(0,b.jsx)(P,{item:a,onClose:c,...d},a.id)})})}function P(a){let[d,e]=(0,c.useState)(!1);return d?(0,b.jsx)(R,{...a,onCancel:()=>e(!1)}):(0,b.jsx)(Q,{...a,onEdit:()=>e(!0)})}function Q({item:a,items:c,onClose:d,onAddFeature:e,onEditRaw:f,onSelect:i,tasksById:j,progressById:k,onEdit:m}){let n=null===a.parent,o=c.find(b=>b.id===a.parent),p=c.filter(b=>b.parent===a.id).sort((a,b)=>a.order-b.order),r=k[a.id],s=(0,t.localToday)(),{chats:y,showAbout:z}=(0,J.useChats)(),A=n?void 0:(0,I.chatFor)(y,{kind:"epic",id:a.id}),B=!n&&0===a.tasks.length&&!A;return(0,b.jsxs)("div",{className:"flex min-h-full flex-col",children:[(0,b.jsxs)("header",{className:(0,u.cn)("border-b border-border px-6 pb-5 pt-6","in-progress"===a.status&&"bg-[linear-gradient(180deg,rgb(var(--rgb-accent)/0.08),transparent)]"),children:[(0,b.jsx)(F.SheetDescription,{asChild:!0,children:(0,b.jsxs)("div",{className:"flex items-center gap-1 pr-8 font-mono text-[11px] text-muted",children:[o&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("button",{type:"button",onClick:()=>i(o.id),className:"truncate hover:text-txt",children:o.title}),(0,b.jsx)(C.ChevronRight,{className:"h-3 w-3 shrink-0"})]}),(0,b.jsxs)("span",{className:"shrink-0",children:[a.id," · ",n?"horizon":"epic"]})]})}),(0,b.jsx)(F.SheetTitle,{className:"mt-2 text-xl font-semibold leading-tight text-txt",children:a.title}),(0,b.jsxs)("div",{className:"mt-3 flex flex-wrap items-center gap-3",children:[(0,b.jsx)(w.StatusPill,{status:a.status}),(0,b.jsx)(x.AgentMark,{attach:{kind:"epic",id:a.id}}),(0,b.jsx)(w.DueChip,{due:a.due,state:(0,t.dueState)(a.due,a.status,s)})]}),r&&(0,b.jsxs)("div",{className:"mt-5 flex items-end gap-4",children:[(0,b.jsxs)("p",{className:"font-mono text-3xl font-semibold leading-none tabular-nums text-txt",children:[Math.round(r.done/r.total*100),(0,b.jsx)("span",{className:"text-base text-muted",children:"%"})]}),(0,b.jsxs)("div",{className:"flex-1 pb-1",children:[(0,b.jsxs)("p",{className:"mb-1.5 font-mono text-[10px] text-muted",children:[r.done," of ",r.total,n?"":" tasks"," done"]}),n?(0,b.jsx)("div",{className:"h-1.5 overflow-hidden rounded-full bg-border",children:(0,b.jsx)("div",{className:"h-full rounded-full bg-teal",style:{width:`${r.done/r.total*100}%`}})}):(0,b.jsx)(w.SegmentedProgress,{statuses:a.tasks.map(a=>j[a]?.status).filter(a=>!!a&&"cancelled"!==a)})]})]})]}),(0,b.jsxs)("div",{className:"flex flex-1 flex-col gap-6 px-6 py-5",children:[!n&&a.tasks.length>0&&(0,b.jsx)(S,{item:a,tasksById:j,onOpen:f}),n&&(0,b.jsxs)("section",{className:"flex flex-col gap-2",children:[(0,b.jsxs)("p",{className:N,children:["Epics · ",p.length]}),0===p.length&&(0,b.jsx)("p",{className:"text-sm text-muted",children:"No epics yet."}),(0,b.jsx)("ul",{className:"-mx-2 flex flex-col",children:p.map(a=>{let c=k[a.id];return(0,b.jsx)("li",{children:(0,b.jsxs)("button",{type:"button",onClick:()=>i(a.id),className:"flex w-full items-center gap-3 rounded-md px-2 py-2 text-left hover:bg-surface2",children:[(0,b.jsx)(w.StatusDot,{status:a.status}),(0,b.jsx)("span",{className:"shrink-0 font-mono text-[11px] text-muted",children:a.id}),(0,b.jsx)("span",{className:(0,u.cn)("min-w-0 flex-1 truncate text-sm","done"===a.status?"text-muted":"text-txt"),children:a.title}),c&&(0,b.jsxs)("span",{className:"shrink-0 font-mono text-[10px] text-muted",children:[c.done,"/",c.total]})]})},a.id)})})]}),(0,b.jsxs)("section",{className:"flex flex-col gap-2",children:[(0,b.jsx)("p",{className:N,children:"Brief"}),a.body.trim()?(0,b.jsx)(H.MarkdownRenderer,{content:a.body,className:"text-sm"}):(0,b.jsx)("p",{className:"text-sm text-muted",children:"No description. Edit to add the outcome, scope and “done when”."})]})]}),(0,b.jsxs)("footer",{className:"sticky bottom-0 flex flex-wrap items-center gap-2 border-t border-border bg-surface px-6 py-3",children:[B&&(0,b.jsxs)(q.Button,{size:"sm",onClick:()=>{d(),(0,v.askAgent)(`Break down epic ${a.id} into tasks.`)},className:"bg-accent text-white hover:bg-accent/90",children:[(0,b.jsx)(g.Bot,{})," Break down with agent"]}),!n&&(0,b.jsxs)(q.Button,{size:"sm",variant:B?"outline":"default",onClick:()=>{d(),z({kind:"epic",id:a.id})},className:(0,u.cn)(!B&&"bg-accent text-white hover:bg-accent/90"),children:[(0,b.jsx)(D.MessageSquare,{})," ",A?"Open chat":"Chat"]}),n&&(0,b.jsxs)(q.Button,{size:"sm",onClick:()=>e(a.id),className:"bg-accent text-white hover:bg-accent/90",children:[(0,b.jsx)(l.Plus,{})," Add epic"]}),(0,b.jsxs)(q.Button,{size:"sm",variant:"outline",onClick:m,children:[(0,b.jsx)(E.Pencil,{})," Edit"]}),(0,b.jsxs)(q.Button,{size:"sm",variant:"ghost",onClick:()=>f(a.file),className:"ml-auto text-muted hover:text-txt",children:[(0,b.jsx)(h.FileText,{})," Open file"]})]})]})}function R({item:a,items:d,onClose:e,onSave:f,onDelete:g,onCancel:h}){let[i]=(0,c.useState)(a),[j,k]=(0,c.useState)(a.title),[l,m]=(0,c.useState)(a.status),[n,o]=(0,c.useState)(a.parent??""),[p,r]=(0,c.useState)(String(a.order)),[s,t]=(0,c.useState)(a.tasks.join(", ")),[u,v]=(0,c.useState)(a.due??""),[w,x]=(0,c.useState)(a.body),[y,z]=(0,c.useState)(null),[A,B]=(0,c.useState)(!1),C=d.some(b=>b.parent===a.id),D=d.filter(b=>null===b.parent&&b.id!==a.id),E=null===a.parent,H=null!==a.parent&&!D.some(b=>b.id===a.parent);async function I(a){B(!0),z(null);let b=await a();return B(!1),b&&z(b),!b}async function J(){let b={},c=j.trim()||i.title;if(c!==i.title&&(b.title=c),l!==i.status&&(b.status=l),(n||null)!==i.parent&&(b.parent=n||null),p.trim()!==String(i.order)){let a=Number(p);if(""===p.trim()||!Number.isFinite(a))return void z("Order must be a number");b.order=a}let d=s.split(",").map(a=>a.trim()).filter(Boolean);(d.join(",")!==i.tasks.join(",")&&(b.tasks=d),(u||null)!==i.due&&(b.due=u||null),w!==i.body&&(b.body=w),0===Object.keys(b).length)?h():await I(()=>f(a.id,b))&&e()}async function N(){window.confirm(`Delete ${a.id}: ${a.title}?`)&&await I(()=>g(a.id))&&e()}return(0,b.jsxs)("div",{className:"flex min-h-full flex-col",children:[(0,b.jsxs)("div",{className:"border-b border-border px-6 pb-4 pt-6 pr-12",children:[(0,b.jsxs)(F.SheetDescription,{className:"font-mono text-[11px] text-muted",children:["Editing ",a.id," · ",E?"horizon":"epic"]}),(0,b.jsx)(F.SheetTitle,{className:"mt-1 text-base text-txt",children:a.title})]}),(0,b.jsxs)("div",{className:"flex flex-1 flex-col gap-4 px-6 py-5",children:[(0,b.jsxs)("label",{className:"flex flex-col gap-1",children:[(0,b.jsx)("span",{className:M,children:"Title"}),(0,b.jsx)(G.Input,{value:j,onChange:a=>k(a.target.value),className:"bg-bg border-border text-txt"})]}),(0,b.jsxs)("div",{className:"grid grid-cols-3 gap-3",children:[(0,b.jsxs)("label",{className:"flex flex-col gap-1",children:[(0,b.jsx)("span",{className:M,children:"Status"}),(0,b.jsx)("select",{value:l,onChange:a=>m(a.target.value),className:L,children:K.map(a=>(0,b.jsx)("option",{value:a,children:a},a))})]}),(0,b.jsxs)("label",{className:"flex flex-col gap-1",children:[(0,b.jsx)("span",{className:M,children:"Parent"}),(0,b.jsxs)("select",{value:n,onChange:a=>o(a.target.value),disabled:C,title:C?"Items with children must stay on the spine":void 0,className:L,children:[(0,b.jsx)("option",{value:"",children:"— (horizon)"}),H&&(0,b.jsxs)("option",{value:a.parent??"",children:[a.parent," · missing"]}),D.map(a=>(0,b.jsxs)("option",{value:a.id,children:[a.id," · ",a.title]},a.id))]})]}),(0,b.jsxs)("label",{className:"flex flex-col gap-1",children:[(0,b.jsx)("span",{className:M,children:"Order"}),(0,b.jsx)(G.Input,{type:"number",step:10,value:p,onChange:a=>r(a.target.value),title:E?"Position on the spine":"Position within the branch",className:"bg-bg border-border text-txt"})]})]}),(0,b.jsxs)("label",{className:"flex flex-col gap-1",children:[(0,b.jsx)("span",{className:M,children:"Due"}),(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)(G.Input,{type:"date",value:u,onChange:a=>v(a.target.value),className:"bg-bg border-border text-txt scheme-light dark:scheme-dark"}),u&&(0,b.jsx)("button",{type:"button",onClick:()=>v(""),className:"text-xs text-muted hover:text-txt",children:"Clear"})]})]}),(0,b.jsxs)("label",{className:"flex flex-col gap-1",children:[(0,b.jsx)("span",{className:M,children:"Tasks"}),(0,b.jsx)(G.Input,{value:s,onChange:a=>t(a.target.value),placeholder:"T001, T012",className:"bg-bg border-border text-txt font-mono"})]}),(0,b.jsxs)("label",{className:"flex flex-col gap-1",children:[(0,b.jsx)("span",{className:M,children:"Body (markdown)"}),(0,b.jsx)("textarea",{value:w,onChange:a=>x(a.target.value),rows:12,className:`${L} font-mono resize-y`})]}),y&&(0,b.jsx)("p",{className:"text-xs text-danger",children:y})]}),(0,b.jsxs)("footer",{className:"sticky bottom-0 flex items-center gap-2 border-t border-border bg-surface px-6 py-3",children:[(0,b.jsx)(q.Button,{size:"sm",onClick:J,disabled:A,className:"bg-accent text-white hover:bg-accent/90",children:"Save"}),(0,b.jsx)(q.Button,{size:"sm",variant:"ghost",onClick:h,disabled:A,className:"text-txt",children:"Cancel"}),(0,b.jsx)(q.Button,{size:"sm",variant:"ghost",onClick:N,disabled:A,className:"ml-auto text-danger hover:text-danger",children:"Delete"})]})]})}function S({item:a,tasksById:c,onOpen:d}){let e=(0,t.localToday)(),f=s(a,Object.values(c)),g="ready"===f.kind?f.taskId:null,h="waiting"===f.kind?[...f.waiting].sort((a,b)=>Number(c[b.taskId]?.status==="todo")-Number(c[a.taskId]?.status==="todo")).map(a=>a.reason):[];return(0,b.jsxs)("section",{className:"flex flex-col gap-2",children:[(0,b.jsxs)("p",{className:N,children:["Tasks · ",a.tasks.length]}),(0,b.jsx)("ul",{className:"-mx-2 flex flex-col",children:a.tasks.map(a=>{let f=c[a];if(!f)return(0,b.jsxs)("li",{className:"px-2 py-2 font-mono text-xs text-danger",children:[a," · missing task file"]},a);let h=f.id===g;return(0,b.jsxs)("li",{className:(0,u.cn)("group flex items-center rounded-md hover:bg-surface2",h&&"bg-accent/10 hover:bg-accent/15"),children:[(0,b.jsxs)("button",{type:"button",onClick:()=>d(f.file),className:"flex min-w-0 flex-1 items-center gap-3 px-2 py-2 text-left",children:[(0,b.jsx)("span",{title:f.status,className:(0,u.cn)("h-2 w-2 shrink-0 rounded-full",w.TASK_STATUS_BG[f.status])}),(0,b.jsx)("span",{className:"shrink-0 font-mono text-[11px] text-muted",children:f.id}),(0,b.jsx)("span",{className:(0,u.cn)("min-w-0 flex-1 truncate text-sm","cancelled"===f.status?"text-muted line-through":"done"===f.status?"text-muted":"text-txt"),children:f.title}),(0,b.jsx)(w.DueChip,{due:f.due,state:(0,t.dueState)(f.due,"done"===f.status?"done":"planned",e)}),h?(0,b.jsx)("span",{className:"shrink-0 font-mono text-[10px] uppercase tracking-wider text-accent",children:"Next up"}):f.size&&"—"!==f.size&&(0,b.jsx)("span",{className:"shrink-0 font-mono text-[10px] text-muted",children:f.size.split(" ")[0]}),(0,b.jsx)(x.AgentDot,{attach:{kind:"task",id:f.id}})]}),(0,b.jsx)(T,{taskId:f.id})]},a)})}),h.length>0&&(0,b.jsxs)("p",{className:"truncate text-xs text-muted",title:h.join("\n"),children:[h[0],h.length>1&&` (+${h.length-1} more)`]})]})}function T({taskId:a}){let{chats:c,showAbout:d}=(0,J.useChats)(),e=!!(0,I.chatFor)(c,{kind:"task",id:a});return(0,b.jsx)("button",{type:"button",onClick:()=>d({kind:"task",id:a}),"aria-label":`${e?"Open chat":"Chat"} about ${a}`,title:e?`Open the chat about ${a}`:`Chat about ${a}`,className:(0,u.cn)("mr-1 grid size-7 shrink-0 place-items-center rounded-md text-muted transition-[opacity,color] duration-(--duration-fast) hover:bg-surface hover:text-accent focus-visible:opacity-100",e?"text-accent opacity-100":"opacity-0 group-hover:opacity-100"),children:(0,b.jsx)(D.MessageSquare,{className:"size-3.5"})})}var U=a.i(814574);function V({open:a,heading:d,onOpenChange:e,onSubmit:f}){let[g,h]=(0,c.useState)(""),[i,j]=(0,c.useState)(null),[k,l]=(0,c.useState)(!1);function m(a){a||(h(""),j(null)),e(a)}async function n(a){if(a.preventDefault(),!g.trim())return;l(!0);let b=await f(g.trim());l(!1),b?j(b):m(!1)}return(0,b.jsx)(U.Dialog,{open:a,onOpenChange:m,children:(0,b.jsxs)(U.DialogContent,{className:"max-w-sm bg-surface border-border text-txt",children:[(0,b.jsx)(U.DialogTitle,{className:"text-sm font-semibold text-txt",children:d}),(0,b.jsxs)("form",{onSubmit:n,className:"flex flex-col gap-3",children:[(0,b.jsx)(G.Input,{autoFocus:!0,value:g,onChange:a=>h(a.target.value),placeholder:"Title",className:"bg-bg border-border text-txt"}),i&&(0,b.jsx)("p",{className:"text-xs text-danger",children:i}),(0,b.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,b.jsx)(q.Button,{type:"button",variant:"ghost",size:"sm",onClick:()=>m(!1),children:"Cancel"}),(0,b.jsx)(q.Button,{type:"submit",size:"sm",disabled:k||!g.trim(),className:"bg-accent text-white hover:bg-accent/90",children:"Create"})]})]})]})})}function W({open:a,onOpenChange:d}){let[e,f]=(0,c.useState)("");return(0,b.jsx)(U.Dialog,{open:a,onOpenChange:d,children:(0,b.jsxs)(U.DialogContent,{className:"max-w-lg bg-surface border-border text-txt",children:[(0,b.jsx)(U.DialogTitle,{className:"text-sm font-semibold text-txt",children:"Plan from spec"}),(0,b.jsxs)("form",{onSubmit:function(a){a.preventDefault(),e.trim()&&(d(!1),(0,v.askAgent)(`Break down this spec into tasks:
2
+
3
+ ${e.trim()}`))},className:"flex flex-col gap-3",children:[(0,b.jsx)("textarea",{autoFocus:!0,value:e,onChange:a=>f(a.target.value),placeholder:"Paste a feature spec…",rows:12,className:"w-full resize-y rounded-md border border-border bg-bg px-3 py-2 text-sm text-txt placeholder:text-muted focus:outline-none focus:ring-1 focus:ring-accent"}),(0,b.jsx)("p",{className:"text-xs text-muted",children:"The agent asks where the tasks go (a new epic, an existing epic, or no epic) and shows a plan before writing anything."}),(0,b.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,b.jsx)(q.Button,{type:"button",variant:"ghost",size:"sm",onClick:()=>{f(""),d(!1)},children:"Cancel"}),(0,b.jsx)(q.Button,{type:"submit",size:"sm",disabled:!e.trim(),className:"bg-accent text-white hover:bg-accent/90",children:"Break down"})]})]})]})})}function X({open:a,onOpenChange:c,items:d}){return(0,b.jsx)(U.Dialog,{open:a,onOpenChange:c,children:(0,b.jsxs)(U.DialogContent,{className:"max-w-lg bg-surface border-border text-txt",children:[(0,b.jsx)(U.DialogTitle,{className:"text-sm font-semibold text-txt",children:"Break down epics"}),(0,b.jsx)(Y,{items:d,onDone:()=>c(!1)})]})})}function Y({items:a,onDone:d}){let e,f=(e=(a,b)=>a.order-b.order,a.filter(a=>null===a.parent).sort(e).map(b=>({horizon:b,epics:a.filter(a=>a.parent===b.id&&"done"!==a.status).sort((a,b)=>Number(a.tasks.length>0)-Number(b.tasks.length>0)||e(a,b))})).filter(a=>a.epics.length>0)),[g,h]=(0,c.useState)(()=>new Set(f.flatMap(a=>a.epics.filter(a=>0===a.tasks.length).map(a=>a.id)))),i=(0,J.useChats)().runningCount,j=Math.max(0,I.MAX_RUNNING_CHATS-i),k=g.size>j;return(0,b.jsxs)("form",{onSubmit:function(a){if(a.preventDefault(),g.size&&!k)for(let a of(d(),f))for(let b of a.epics)g.has(b.id)&&(0,v.askAgent)(`Break down epic ${b.id} into tasks.`,{newChat:!0})},className:"flex flex-col gap-3",children:[(0,b.jsx)("div",{className:"max-h-[50vh] overflow-y-auto rounded-md border border-border",children:f.map(a=>(0,b.jsxs)("div",{children:[(0,b.jsxs)("div",{className:"sticky top-0 bg-surface2 px-3 py-1 text-[10px] font-mono uppercase tracking-widest text-muted",children:[a.horizon.id," · ",a.horizon.title]}),(0,b.jsx)("ul",{children:a.epics.map(a=>{let c=g.has(a.id);return(0,b.jsx)("li",{className:"border-b border-border last:border-b-0",children:(0,b.jsxs)("label",{className:"flex items-start gap-2 px-3 py-1.5 text-xs cursor-pointer has-[:disabled]:cursor-not-allowed",children:[(0,b.jsx)("input",{type:"checkbox",checked:c,disabled:!c&&g.size>=j,onChange:()=>{var b;return b=a.id,void h(a=>{let c=new Set(a);return c.delete(b)||c.add(b),c})},className:"mt-0.5 accent-accent"}),(0,b.jsxs)("span",{className:"flex-1 min-w-0 text-txt",children:[(0,b.jsx)("span",{className:"font-mono text-muted mr-1",children:a.id}),a.title]}),a.tasks.length>0&&(0,b.jsxs)("span",{className:"shrink-0 text-[10px] font-mono text-muted",children:["has ",a.tasks.length," task",1===a.tasks.length?"":"s"]})]})},a.id)})})]},a.horizon.id))}),(0,b.jsx)("p",{className:k||0===j?"text-xs text-amber":"text-xs text-muted",children:0===j?`All ${I.MAX_RUNNING_CHATS} agent slots are busy. Stop a chat or wait for one to finish.`:k?`${g.size} selected, but only ${j} of ${I.MAX_RUNNING_CHATS} agent slots ${1===j?"is":"are"} free (${i} running). Uncheck some or stop a chat.`:`One chat per epic, running at once (${j} of ${I.MAX_RUNNING_CHATS} agent slots free). Each shows a plan before writing anything.`}),(0,b.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,b.jsx)(q.Button,{type:"button",variant:"ghost",size:"sm",onClick:d,children:"Cancel"}),(0,b.jsxs)(q.Button,{type:"submit",size:"sm",disabled:!g.size||k,className:"bg-accent text-white hover:bg-accent/90",children:["Break down ",g.size||""," epic",1===g.size?"":"s"]})]})]})}async function Z(a,b){try{let c=await fetch(a,void 0===b?void 0:{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(b)}),d=await c.json().catch(()=>null);if(!c.ok)return{error:d?.error??`Request failed (${c.status})`};return{data:d}}catch{return{error:"Could not reach the server"}}}function $(a,b,c,d){var f;let g,h,i,j,k,[l,m]=(f=!d,h=(g=a=>({x:a.position.x+(a.measured?.width??("horizon"===a.type?B.HORIZON_W:B.FEATURE_W))/2,y:a.position.y+(a.measured?.height??48)/2}))(b),j=(i=g(c)).x-h.x,k=i.y-h.y,f||Math.abs(j)>Math.abs(k)?j>0?[e.Position.Right,e.Position.Left]:[e.Position.Left,e.Position.Right]:k>0?[e.Position.Bottom,e.Position.Top]:[e.Position.Top,e.Position.Bottom]);return{id:a,source:b.id,target:c.id,sourceHandle:l,targetHandle:`${m}-t`,type:d?"straight":"default",selectable:!1,...function(a,b,c){if(c)return"done"===a.data.item.status?{style:{stroke:"var(--color-accent)",strokeWidth:3}}:{style:{stroke:"var(--color-border2)",strokeWidth:3,strokeDasharray:"6 6"}};let d=b.data.item.status;return"in-progress"===d?{animated:!0,style:{stroke:"var(--color-accent)",strokeWidth:2}}:"done"===d?{style:{stroke:"var(--color-border2)",strokeWidth:1.5}}:{style:{stroke:"var(--color-border2)",strokeWidth:1.5,strokeDasharray:"2 5",strokeLinecap:"round"}}}(b,c,d)}}function _(a){let b=new MutationObserver(a);return b.observe(document.documentElement,{attributes:!0,attributeFilter:["class"]}),()=>b.disconnect()}let aa={"--xy-background-color":"var(--color-bg)"};function ab(){let{rootParam:a,openDoc:e,board:f}=(0,o.useApp)(),i=(0,n.useRouter)(),j=(0,n.useSearchParams)(),r="timeline"===j.get("view")?"timeline":"map",x=(0,t.localToday)(),[y,A]=(0,c.useState)([]),[C,D]=(0,c.useState)({}),[E,F]=(0,c.useState)([]),[G,H]=(0,c.useState)(!0),[I,J]=(0,c.useState)(null),[K,L]=(0,c.useState)(null),M=j.get("item"),[N,P]=(0,c.useState)(null);M!==N&&(P(M),M&&L(M));let[Q,R]=(0,c.useState)(null),[S,T]=(0,c.useState)(!1),[U,Y]=(0,c.useState)(null),[ab,ae]=(0,c.useState)(!1),[af,ag]=(0,c.useState)(!1),ah=(0,c.useRef)(!1),ai=(0,c.useRef)(null),aj=(0,c.useCallback)(a=>{let b=ai.current?.clientWidth??0,c=a.getNodesBounds(a.getNodes());if(!b||!c.width)return;let d=Math.min(1,Math.max(.75,(b-80)/c.width));a.setViewport({x:b/2-(c.x+c.width/2)*d,y:40-c.y*d,zoom:d})},[]),ak=(0,c.useRef)(!1),al=(0,c.useRef)(0),am=(0,c.useSyncExternalStore)(_,()=>document.documentElement.classList.contains("dark"),()=>!0),an=(0,c.useCallback)((a,b)=>{A(a),D(b),F(c=>{let d,e;return d=(0,B.resolvePositions)(a,b),e=new Map(c.map(a=>[a.id,a])),a.map(a=>{let b=e.get(a.id);return{id:a.id,type:null===a.parent?"horizon":"feature",position:d[a.id]??{x:0,y:0},data:{item:a},measured:b?.measured,selected:b?.selected}})})},[]),ao=(0,c.useCallback)(()=>{let b=++al.current;return Z(`/api/roadmap${a}`).then(({data:a,error:c})=>{if(b===al.current){if(H(!1),c){J(c),an([],{}),L(null);return}J(null),R(a?.generateSource??null),an(a?.items??[],a?.layout??{})}})},[a,an]);(0,c.useEffect)(()=>{ao()},[ao]),(0,c.useEffect)(()=>{let a=new EventSource("/api/events");return a.onmessage=a=>{try{let b=JSON.parse(a.data);if("roadmap_updated"!==b.type)return;ah.current?ak.current=!0:ao()}catch{}},()=>a.close()},[ao]);let ap=(0,c.useMemo)(()=>{let a=new Map(E.map(a=>[a.id,a])),b=[],c=y.filter(a=>null===a.parent).sort((a,b)=>a.order-b.order);for(let d of(c.forEach((d,e)=>{let f=a.get(d.id),g=c[e+1]&&a.get(c[e+1].id);f&&g&&b.push($(`spine-${d.id}`,f,g,!0))}),y)){let c=d.parent&&a.get(d.parent),e=a.get(d.id);c&&e&&"horizon"===c.type&&b.push($(`branch-${d.id}`,c,e,!1))}return b},[y,E]),aq=(0,c.useMemo)(()=>Object.fromEntries(Object.values(f??{}).flat().map(a=>[a.id,a])),[f]),ar=(0,c.useMemo)(()=>(0,t.roadmapHealth)(y,aq,x),[y,aq,x]),as=(0,c.useMemo)(()=>{let a=Object.values(aq),b=new Map(y.filter(a=>null===a.parent).sort((a,b)=>a.order-b.order).map((a,b)=>[a.id,b+1]));return E.map(c=>{var d;let e,{item:f}=c.data,g=y.filter(a=>a.parent===f.id),h="feature"===c.type&&"in-progress"===f.status?s(f,a):null;return{...c,data:{...c.data,progress:ar.progress[c.id],drift:ar.drift.filter(a=>a.id===c.id).map(a=>a.message),dueState:(0,t.dueState)(f.due,f.status,x),..."feature"===c.type&&{...(d=f.tasks,{taskDue:e=(0,t.taskDueSummary)(d,aq,x),taskDueSoon:!!e?.next&&"soon"===(0,t.dueState)(e.next,"planned",x)}),taskStatuses:f.tasks.map(a=>aq[a]?.status).filter(a=>!!a&&"cancelled"!==a),nextTaskId:h?.kind==="ready"?h.taskId:null},..."horizon"===c.type&&{chapter:b.get(f.id),epics:{done:g.filter(a=>"done"===a.status).length,total:g.length}}}}})},[E,y,ar,x,aq]),at=(0,c.useCallback)(a=>F(b=>(0,d.applyNodeChanges)(a,b)),[]);async function au(){T(!0),J(null);let{data:b,error:c}=await Z(`/api/roadmap/generate${a}`,{});if(c){J(c),T(!1);return}let d=Object.fromEntries(Object.entries((0,B.resolvePositions)(b?.items??[],{})).map(([a,b])=>[a,{x:Math.round(b.x),y:Math.round(b.y)}])),{error:e}=await Z(`/api/roadmap/layout${a}`,{positions:d});await ao(),e&&J(e),T(!1)}let av=Object.values(f??{}).flat().filter(a=>"cancelled"!==a.status).length,aw="roadmap-md"===Q?"from ROADMAP.md":"tasks"===Q?`from ${av} tasks, grouped by phase`:"starter horizons: Shipped · Now · Next · Later";async function ax(b){let{error:c}=await Z(`/api/roadmap/create${a}`,{title:b,parent:U||null});return c||(await ao(),null)}async function ay(b,c){let{data:d,error:e}=await Z(`/api/roadmap/update${a}`,{id:b,patch:c});if(e)return e;let f=d?.item;return f?an(y.map(a=>a.id===b?f:a),C):await ao(),null}async function az(b){let{error:c}=await Z(`/api/roadmap/delete${a}`,{id:b});return c||(an(y.filter(a=>a.id!==b),C),null)}let aA=y.find(a=>a.id===K)??null,aB=(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(V,{open:null!==U,heading:U?`New feature under ${U}`:"New horizon",onOpenChange:a=>{a||Y(null)},onSubmit:ax}),(0,b.jsx)(W,{open:ab,onOpenChange:ae}),(0,b.jsx)(X,{open:af,onOpenChange:ag,items:y})]});return G?(0,b.jsx)("div",{className:"flex-1 flex items-center justify-center text-sm text-muted",children:"Loading…"}):0===y.length?(0,b.jsxs)("div",{className:"flex-1 p-6",children:[I&&(0,b.jsx)("p",{className:"mb-4 text-sm text-danger",children:I}),(0,b.jsx)(p.EmptyState,{icon:"🗺️",message:"No roadmap yet",subMessage:"Items live in plans/roadmap/R*.md",bordered:!0}),(0,b.jsxs)("div",{className:"mt-4 flex flex-col items-center gap-2",children:[(0,b.jsxs)("div",{className:"flex gap-2",children:[(0,b.jsxs)(q.Button,{size:"sm",onClick:au,disabled:S,className:"bg-accent text-white hover:bg-accent/90",children:[(0,b.jsx)(m.Sparkles,{})," ",S?"Generating…":"Generate roadmap"]}),(0,b.jsxs)(q.Button,{size:"sm",variant:"outline",onClick:()=>(0,v.askAgent)("Plan a roadmap for this project."),disabled:S,children:[(0,b.jsx)(g.Bot,{})," Plan with agent"]}),(0,b.jsxs)(q.Button,{size:"sm",variant:"outline",onClick:()=>ae(!0),disabled:S,children:[(0,b.jsx)(h.FileText,{})," Plan from spec"]}),(0,b.jsxs)(q.Button,{size:"sm",variant:"outline",onClick:()=>Y(""),disabled:S,children:[(0,b.jsx)(l.Plus,{})," Create first horizon"]})]}),(0,b.jsxs)("p",{className:"text-xs text-muted",children:["Generate ",aw,". Existing files are not modified."]})]}),aB]}):(0,b.jsxs)("div",{className:"relative flex flex-1 min-h-0 flex-col",children:[(0,b.jsxs)("div",{className:"flex shrink-0 items-center gap-4 border-b border-border px-3 py-2",children:[(0,b.jsx)("div",{className:"flex rounded-md border border-border p-0.5 text-xs",children:["map","timeline"].map(a=>(0,b.jsx)("button",{type:"button",onClick:()=>{let b,c;return b=new URLSearchParams(j.toString()),"map"===a?b.delete("view"):b.set("view",a),c=b.toString(),void i.replace(c?`/roadmap?${c}`:"/roadmap")},className:(0,u.cn)("rounded-sm px-3 py-1 capitalize",r===a?"bg-surface2 text-txt":"text-muted hover:text-txt"),children:a},a))}),(0,b.jsx)(ac,{items:y,tasksById:aq}),(0,b.jsxs)("div",{className:"ml-auto flex items-center gap-2",children:[I&&(0,b.jsx)("p",{className:"text-xs text-danger",children:I}),ar.drift.length>0&&(0,b.jsx)(ad,{drift:ar.drift,onSelect:L,onApply:a=>a.suggestedStatus&&ay(a.id,{status:a.suggestedStatus}).then(a=>{a&&J(a)})}),(0,b.jsxs)(q.Button,{size:"sm",variant:"outline",onClick:()=>ae(!0),children:[(0,b.jsx)(h.FileText,{})," Plan from spec"]}),y.some(a=>null!==a.parent&&"done"!==a.status)&&(0,b.jsxs)(q.Button,{size:"sm",variant:"outline",onClick:()=>ag(!0),children:[(0,b.jsx)(k,{})," Break down epics…"]}),(0,b.jsxs)(q.Button,{size:"sm",onClick:()=>Y(""),className:"bg-accent text-white hover:bg-accent/90",children:[(0,b.jsx)(l.Plus,{})," Horizon"]})]})]}),"map"===r?(0,b.jsx)("div",{ref:ai,className:"relative flex-1 min-h-0",children:(0,b.jsxs)(d.ReactFlow,{nodes:as,edges:ap,nodeTypes:w.nodeTypes,onNodesChange:at,onNodeClick:(a,b)=>L(b.id),onNodeDragStart:()=>{ah.current=!0},onNodeDragStop:(b,c,d)=>{let e;return ah.current=!1,e=Object.fromEntries(d.map(a=>[a.id,{x:Math.round(a.position.x),y:Math.round(a.position.y)}])),void(an(y,{...C,...e}),Z(`/api/roadmap/layout${a}`,{positions:e}).then(({error:a})=>{a&&J(a),ak.current&&(ak.current=!1,ao())}))},nodesConnectable:!1,deleteKeyCode:null,colorMode:am?"dark":"light",onInit:aj,minZoom:.2,style:aa,children:[(0,b.jsx)(d.Background,{variant:d.BackgroundVariant.Dots,gap:20,size:1}),(0,b.jsx)(d.Controls,{showInteractive:!1})]})}):(0,b.jsx)(z,{items:y,today:x,onSelect:L,progressById:ar.progress}),(0,b.jsx)(O,{item:aA,items:y,onClose:()=>L(null),onSave:ay,onDelete:az,onAddFeature:a=>{L(null),Y(a)},onEditRaw:a=>{e(a)},tasksById:aq,progressById:ar.progress,onSelect:L}),aB]})}function ac({items:a,tasksById:c}){let d=a.filter(a=>null!==a.parent),e=a=>d.filter(b=>b.status===a).length,f=[...new Set(d.flatMap(a=>a.tasks))].map(a=>c[a]).filter(a=>a&&"cancelled"!==a.status),g=f.filter(a=>"done"===a.status).length;return(0,b.jsxs)("div",{className:"hidden items-center gap-4 font-mono text-[11px] text-muted md:flex",children:[["in-progress","done","planned"].map(a=>(0,b.jsxs)("span",{className:"flex items-center gap-1.5",children:[(0,b.jsx)(w.StatusDot,{status:a}),(0,b.jsx)("span",{className:(0,u.cn)("tabular-nums","in-progress"===a&&e(a)>0?"text-accent":"text-txt"),children:e(a)}),w.STATUS_LABEL[a].toLowerCase()]},a)),f.length>0&&(0,b.jsxs)("span",{className:"flex items-center gap-2 border-l border-border pl-4",children:[(0,b.jsx)("span",{className:"relative h-1 w-20 overflow-hidden rounded-full bg-border",children:(0,b.jsx)("span",{className:"absolute inset-y-0 left-0 rounded-full bg-teal",style:{width:`${g/f.length*100}%`}})}),(0,b.jsxs)("span",{children:[(0,b.jsxs)("span",{className:"tabular-nums text-txt",children:[g,"/",f.length]})," tasks"]})]})]})}function ad({drift:a,onSelect:c,onApply:d}){return(0,b.jsxs)("details",{className:"group relative",children:[(0,b.jsxs)("summary",{className:"flex h-8 cursor-pointer list-none items-center gap-1.5 rounded-md border border-amber/40 bg-amber/10 px-2.5 text-xs font-medium text-txt hover:bg-amber/15 [&::-webkit-details-marker]:hidden",children:[(0,b.jsx)(f.AlertTriangle,{className:"h-3.5 w-3.5 text-amber"})," ",a.length," need attention"]}),(0,b.jsx)("ul",{className:"absolute right-0 top-full z-30 mt-1.5 max-h-72 w-80 overflow-y-auto rounded-lg border border-border bg-surface text-xs shadow-xl",children:a.map(a=>(0,b.jsxs)("li",{className:"flex items-start gap-2 border-b border-border px-3 py-2.5 last:border-0",children:[(0,b.jsx)("span",{className:"mt-1 h-1.5 w-1.5 shrink-0 rounded-full bg-amber"}),(0,b.jsx)("button",{type:"button",onClick:()=>c(a.id),className:"flex-1 text-left leading-relaxed text-muted hover:text-txt",children:a.message}),a.suggestedStatus&&(0,b.jsxs)("button",{type:"button",onClick:()=>d(a),className:"shrink-0 rounded-sm border border-border px-1.5 py-0.5 font-mono text-[10px] text-txt hover:border-accent hover:text-accent",title:`Set status to ${a.suggestedStatus}`,children:["→ ",a.suggestedStatus]})]},`${a.id}-${a.kind}`))})]})}a.s(["default",0,function(){return(0,b.jsx)("div",{className:"flex flex-col h-[calc(100svh-3rem)]",children:(0,b.jsx)(c.Suspense,{children:(0,b.jsx)(ab,{})})})}],690793)}];
4
+
5
+ //# sourceMappingURL=src_app_%28app%29_roadmap_page_tsx_0vcq3jr._.js.map