vibedoc 1.6.1 → 1.8.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 (651) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +11 -0
  3. package/.next/build-manifest.json +3 -3
  4. package/.next/prerender-manifest.json +69 -13
  5. package/.next/routes-manifest.json +66 -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)/manual-tests/page/app-paths-manifest.json +3 -0
  24. package/.next/server/app/(app)/manual-tests/page/build-manifest.json +20 -0
  25. package/.next/server/app/(app)/manual-tests/page/next-font-manifest.json +11 -0
  26. package/.next/server/app/(app)/manual-tests/page/react-loadable-manifest.json +1 -0
  27. package/.next/server/app/(app)/manual-tests/page/server-reference-manifest.json +4 -0
  28. package/.next/server/app/(app)/manual-tests/page.js +15 -0
  29. package/.next/server/app/(app)/manual-tests/page.js.map +5 -0
  30. package/.next/server/app/(app)/manual-tests/page.js.nft.json +1 -0
  31. package/.next/server/app/(app)/manual-tests/page_client-reference-manifest.js +3 -0
  32. package/.next/server/app/(app)/memory/page.js.nft.json +1 -1
  33. package/.next/server/app/(app)/memory/page_client-reference-manifest.js +1 -1
  34. package/.next/server/app/(app)/roadmap/page.js.nft.json +1 -1
  35. package/.next/server/app/(app)/roadmap/page_client-reference-manifest.js +1 -1
  36. package/.next/server/app/(app)/settings/page.js.nft.json +1 -1
  37. package/.next/server/app/(app)/settings/page_client-reference-manifest.js +1 -1
  38. package/.next/server/app/(app)/setup/page.js.nft.json +1 -1
  39. package/.next/server/app/(app)/setup/page_client-reference-manifest.js +1 -1
  40. package/.next/server/app/_global-error.html +1 -1
  41. package/.next/server/app/_global-error.rsc +1 -1
  42. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  43. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  44. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  45. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  46. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  47. package/.next/server/app/_not-found.html +1 -1
  48. package/.next/server/app/_not-found.rsc +3 -2
  49. package/.next/server/app/_not-found.segments/_full.segment.rsc +3 -2
  50. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +3 -2
  51. package/.next/server/app/_not-found.segments/_tree.segment.rsc +3 -2
  52. package/.next/server/app/activity.html +1 -1
  53. package/.next/server/app/activity.rsc +14 -13
  54. package/.next/server/app/activity.segments/!KGFwcCk/activity/__PAGE__.segment.rsc +10 -10
  55. package/.next/server/app/activity.segments/_full.segment.rsc +14 -13
  56. package/.next/server/app/activity.segments/_tree.segment.rsc +3 -2
  57. package/.next/server/app/api/activity/route.js +2 -2
  58. package/.next/server/app/api/activity/route.js.nft.json +1 -1
  59. package/.next/server/app/api/backlinks/route.js +2 -2
  60. package/.next/server/app/api/backlinks/route.js.nft.json +1 -1
  61. package/.next/server/app/api/chat/route.js +1 -1
  62. package/.next/server/app/api/chat/route.js.nft.json +1 -1
  63. package/.next/server/app/api/context/route.js +2 -2
  64. package/.next/server/app/api/context/route.js.nft.json +1 -1
  65. package/.next/server/app/api/conversations/route/app-paths-manifest.json +3 -0
  66. package/.next/server/app/api/conversations/route/build-manifest.json +12 -0
  67. package/.next/server/app/api/conversations/route/server-reference-manifest.json +4 -0
  68. package/.next/server/app/api/conversations/route.js +9 -0
  69. package/.next/server/app/api/conversations/route.js.map +5 -0
  70. package/.next/server/app/api/conversations/route.js.nft.json +1 -0
  71. package/.next/server/app/api/conversations/route_client-reference-manifest.js +3 -0
  72. package/.next/server/app/api/decisions/route.js +2 -2
  73. package/.next/server/app/api/decisions/route.js.nft.json +1 -1
  74. package/.next/server/app/api/docs/route.js +1 -1
  75. package/.next/server/app/api/docs/route.js.nft.json +1 -1
  76. package/.next/server/app/api/explorer/route.js +2 -2
  77. package/.next/server/app/api/explorer/route.js.nft.json +1 -1
  78. package/.next/server/app/api/mcp/route.js +1 -1
  79. package/.next/server/app/api/mcp/route.js.nft.json +1 -1
  80. package/.next/server/app/api/memory/route.js +2 -2
  81. package/.next/server/app/api/memory/route.js.nft.json +1 -1
  82. package/.next/server/app/api/plan/apply/route.js +3 -3
  83. package/.next/server/app/api/plan/apply/route.js.nft.json +1 -1
  84. package/.next/server/app/api/projects/route.js +2 -2
  85. package/.next/server/app/api/projects/route.js.nft.json +1 -1
  86. package/.next/server/app/api/registry/route.js +2 -2
  87. package/.next/server/app/api/registry/route.js.nft.json +1 -1
  88. package/.next/server/app/api/roadmap/create/route.js +3 -3
  89. package/.next/server/app/api/roadmap/create/route.js.nft.json +1 -1
  90. package/.next/server/app/api/roadmap/delete/route.js +3 -3
  91. package/.next/server/app/api/roadmap/delete/route.js.nft.json +1 -1
  92. package/.next/server/app/api/roadmap/generate/route.js +3 -3
  93. package/.next/server/app/api/roadmap/generate/route.js.nft.json +1 -1
  94. package/.next/server/app/api/roadmap/layout/route.js +3 -3
  95. package/.next/server/app/api/roadmap/layout/route.js.nft.json +1 -1
  96. package/.next/server/app/api/roadmap/restore/route/app-paths-manifest.json +3 -0
  97. package/.next/server/app/api/roadmap/restore/route/build-manifest.json +12 -0
  98. package/.next/server/app/api/roadmap/restore/route/server-reference-manifest.json +4 -0
  99. package/.next/server/app/api/roadmap/restore/route.js +9 -0
  100. package/.next/server/app/api/roadmap/restore/route.js.map +5 -0
  101. package/.next/server/app/api/roadmap/restore/route.js.nft.json +1 -0
  102. package/.next/server/app/api/roadmap/restore/route_client-reference-manifest.js +3 -0
  103. package/.next/server/app/api/roadmap/route.js +3 -3
  104. package/.next/server/app/api/roadmap/route.js.nft.json +1 -1
  105. package/.next/server/app/api/roadmap/update/route.js +3 -3
  106. package/.next/server/app/api/roadmap/update/route.js.nft.json +1 -1
  107. package/.next/server/app/api/sessions/route.js +2 -2
  108. package/.next/server/app/api/sessions/route.js.nft.json +1 -1
  109. package/.next/server/app/api/settings/route.js +3 -3
  110. package/.next/server/app/api/settings/route.js.nft.json +1 -1
  111. package/.next/server/app/api/setup/generate/route.js +1 -1
  112. package/.next/server/app/api/setup/generate/route.js.nft.json +1 -1
  113. package/.next/server/app/api/setup/write/route.js +2 -2
  114. package/.next/server/app/api/setup/write/route.js.nft.json +1 -1
  115. package/.next/server/app/api/summary/route.js +2 -2
  116. package/.next/server/app/api/summary/route.js.nft.json +1 -1
  117. package/.next/server/app/api/tasks/bulk/route/app-paths-manifest.json +3 -0
  118. package/.next/server/app/api/tasks/bulk/route/build-manifest.json +12 -0
  119. package/.next/server/app/api/tasks/bulk/route/server-reference-manifest.json +4 -0
  120. package/.next/server/app/api/tasks/bulk/route.js +9 -0
  121. package/.next/server/app/api/tasks/bulk/route.js.map +5 -0
  122. package/.next/server/app/api/tasks/bulk/route.js.nft.json +1 -0
  123. package/.next/server/app/api/tasks/bulk/route_client-reference-manifest.js +3 -0
  124. package/.next/server/app/api/tasks/create/route.js +2 -2
  125. package/.next/server/app/api/tasks/create/route.js.nft.json +1 -1
  126. package/.next/server/app/api/tasks/delete/route/app-paths-manifest.json +3 -0
  127. package/.next/server/app/api/tasks/delete/route/build-manifest.json +12 -0
  128. package/.next/server/app/api/tasks/delete/route/server-reference-manifest.json +4 -0
  129. package/.next/server/app/api/tasks/delete/route.js +9 -0
  130. package/.next/server/app/api/tasks/delete/route.js.map +5 -0
  131. package/.next/server/app/api/tasks/delete/route.js.nft.json +1 -0
  132. package/.next/server/app/api/tasks/delete/route_client-reference-manifest.js +3 -0
  133. package/.next/server/app/api/tasks/manual-tests/route/app-paths-manifest.json +3 -0
  134. package/.next/server/app/api/tasks/manual-tests/route/build-manifest.json +12 -0
  135. package/.next/server/app/api/tasks/manual-tests/route/server-reference-manifest.json +4 -0
  136. package/.next/server/app/api/tasks/manual-tests/route.js +8 -0
  137. package/.next/server/app/api/tasks/manual-tests/route.js.map +5 -0
  138. package/.next/server/app/api/tasks/manual-tests/route.js.nft.json +1 -0
  139. package/.next/server/app/api/tasks/manual-tests/route_client-reference-manifest.js +3 -0
  140. package/.next/server/app/api/tasks/restore/route/app-paths-manifest.json +3 -0
  141. package/.next/server/app/api/tasks/restore/route/build-manifest.json +12 -0
  142. package/.next/server/app/api/tasks/restore/route/server-reference-manifest.json +4 -0
  143. package/.next/server/app/api/tasks/restore/route.js +9 -0
  144. package/.next/server/app/api/tasks/restore/route.js.map +5 -0
  145. package/.next/server/app/api/tasks/restore/route.js.nft.json +1 -0
  146. package/.next/server/app/api/tasks/restore/route_client-reference-manifest.js +3 -0
  147. package/.next/server/app/api/tasks/review/route/app-paths-manifest.json +3 -0
  148. package/.next/server/app/api/tasks/review/route/build-manifest.json +12 -0
  149. package/.next/server/app/api/tasks/review/route/server-reference-manifest.json +4 -0
  150. package/.next/server/app/api/tasks/review/route.js +9 -0
  151. package/.next/server/app/api/tasks/review/route.js.map +5 -0
  152. package/.next/server/app/api/tasks/review/route.js.nft.json +1 -0
  153. package/.next/server/app/api/tasks/review/route_client-reference-manifest.js +3 -0
  154. package/.next/server/app/api/tasks/route.js +2 -2
  155. package/.next/server/app/api/tasks/route.js.nft.json +1 -1
  156. package/.next/server/app/api/tasks/update/route/app-paths-manifest.json +3 -0
  157. package/.next/server/app/api/tasks/update/route/build-manifest.json +12 -0
  158. package/.next/server/app/api/tasks/update/route/server-reference-manifest.json +4 -0
  159. package/.next/server/app/api/tasks/update/route.js +9 -0
  160. package/.next/server/app/api/tasks/update/route.js.map +5 -0
  161. package/.next/server/app/api/tasks/update/route.js.nft.json +1 -0
  162. package/.next/server/app/api/tasks/update/route_client-reference-manifest.js +3 -0
  163. package/.next/server/app/api/views/route/app-paths-manifest.json +3 -0
  164. package/.next/server/app/api/views/route/build-manifest.json +12 -0
  165. package/.next/server/app/api/views/route/server-reference-manifest.json +4 -0
  166. package/.next/server/app/api/views/route.js +9 -0
  167. package/.next/server/app/api/views/route.js.map +5 -0
  168. package/.next/server/app/api/views/route.js.nft.json +1 -0
  169. package/.next/server/app/api/views/route_client-reference-manifest.js +3 -0
  170. package/.next/server/app/board.html +1 -1
  171. package/.next/server/app/board.rsc +14 -13
  172. package/.next/server/app/board.segments/!KGFwcCk/board/__PAGE__.segment.rsc +10 -10
  173. package/.next/server/app/board.segments/_full.segment.rsc +14 -13
  174. package/.next/server/app/board.segments/_tree.segment.rsc +3 -2
  175. package/.next/server/app/chat.html +1 -0
  176. package/.next/server/app/chat.meta +31 -0
  177. package/.next/server/app/chat.rsc +31 -0
  178. package/.next/server/app/chat.segments/!KGFwcCk/chat/__PAGE__.segment.rsc +34 -0
  179. package/.next/server/app/chat.segments/_full.segment.rsc +31 -0
  180. package/.next/server/app/chat.segments/_tree.segment.rsc +5 -0
  181. package/.next/server/app/docs.html +1 -1
  182. package/.next/server/app/docs.rsc +24 -27
  183. package/.next/server/app/docs.segments/!KGFwcCk/docs/__PAGE__.segment.rsc +7 -6
  184. package/.next/server/app/docs.segments/_full.segment.rsc +24 -27
  185. package/.next/server/app/docs.segments/_tree.segment.rsc +3 -2
  186. package/.next/server/app/explorer.html +1 -1
  187. package/.next/server/app/explorer.rsc +14 -13
  188. package/.next/server/app/explorer.segments/!KGFwcCk/explorer/__PAGE__.segment.rsc +6 -5
  189. package/.next/server/app/explorer.segments/_full.segment.rsc +14 -13
  190. package/.next/server/app/explorer.segments/_tree.segment.rsc +3 -2
  191. package/.next/server/app/index.html +1 -1
  192. package/.next/server/app/index.rsc +3 -2
  193. package/.next/server/app/index.segments/__PAGE__.segment.rsc +3 -2
  194. package/.next/server/app/index.segments/_full.segment.rsc +3 -2
  195. package/.next/server/app/index.segments/_tree.segment.rsc +3 -2
  196. package/.next/server/app/manual-tests.html +1 -0
  197. package/.next/server/app/manual-tests.meta +31 -0
  198. package/.next/server/app/manual-tests.rsc +31 -0
  199. package/.next/server/app/manual-tests.segments/!KGFwcCk/manual-tests/__PAGE__.segment.rsc +33 -0
  200. package/.next/server/app/manual-tests.segments/_full.segment.rsc +31 -0
  201. package/.next/server/app/manual-tests.segments/_tree.segment.rsc +5 -0
  202. package/.next/server/app/memory.html +1 -1
  203. package/.next/server/app/memory.rsc +14 -13
  204. package/.next/server/app/memory.segments/!KGFwcCk/memory/__PAGE__.segment.rsc +6 -5
  205. package/.next/server/app/memory.segments/_full.segment.rsc +14 -13
  206. package/.next/server/app/memory.segments/_tree.segment.rsc +3 -2
  207. package/.next/server/app/page.js.nft.json +1 -1
  208. package/.next/server/app/page_client-reference-manifest.js +1 -1
  209. package/.next/server/app/roadmap.html +1 -1
  210. package/.next/server/app/roadmap.rsc +24 -26
  211. package/.next/server/app/roadmap.segments/!KGFwcCk/roadmap/__PAGE__.segment.rsc +10 -11
  212. package/.next/server/app/roadmap.segments/_full.segment.rsc +24 -26
  213. package/.next/server/app/roadmap.segments/_tree.segment.rsc +3 -2
  214. package/.next/server/app/settings.html +1 -1
  215. package/.next/server/app/settings.rsc +14 -13
  216. package/.next/server/app/settings.segments/!KGFwcCk/settings/__PAGE__.segment.rsc +10 -10
  217. package/.next/server/app/settings.segments/_full.segment.rsc +14 -13
  218. package/.next/server/app/settings.segments/_tree.segment.rsc +3 -2
  219. package/.next/server/app/setup.html +1 -1
  220. package/.next/server/app/setup.rsc +14 -13
  221. package/.next/server/app/setup.segments/!KGFwcCk/setup/__PAGE__.segment.rsc +6 -5
  222. package/.next/server/app/setup.segments/_full.segment.rsc +14 -13
  223. package/.next/server/app/setup.segments/_tree.segment.rsc +3 -2
  224. package/.next/server/app-paths-manifest.json +11 -0
  225. package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0-5bkpj._.js → 11mp_@anthropic-ai_sdk_00p3fu1._.js} +1 -1
  226. package/.next/server/chunks/{11mp_@anthropic-ai_sdk_01l5h3i._.js → 11mp_@anthropic-ai_sdk_01amtux._.js} +1 -1
  227. package/.next/server/chunks/{11mp_@anthropic-ai_sdk_00psb_y._.js → 11mp_@anthropic-ai_sdk_01jjl08._.js} +1 -1
  228. package/.next/server/chunks/{11mp_@anthropic-ai_sdk_072r2bd._.js → 11mp_@anthropic-ai_sdk_071zfm8._.js} +1 -1
  229. package/.next/server/chunks/11mp_@anthropic-ai_sdk_07v3boe._.js +3 -0
  230. package/.next/server/chunks/11mp_@anthropic-ai_sdk_09iva72._.js +3 -0
  231. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0bom1b1._.js +3 -0
  232. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0dvji7p._.js +3 -0
  233. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0dzo8jn._.js +3 -0
  234. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0hvqsqq._.js +3 -0
  235. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0i7i-jw._.js +3 -0
  236. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0k0iop5._.js +3 -0
  237. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0l3-6aq._.js +3 -0
  238. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0oegm3y._.js +3 -0
  239. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0p5cyes._.js +3 -0
  240. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0qw8i6_._.js +3 -0
  241. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0yk-a7v._.js +3 -0
  242. package/.next/server/chunks/11mp_@anthropic-ai_sdk_11fsqvb._.js +3 -0
  243. package/.next/server/chunks/11mp_@anthropic-ai_sdk_143_7ez._.js +3 -0
  244. package/.next/server/chunks/11mp_@anthropic-ai_sdk_14a4-64._.js +3 -0
  245. package/.next/server/chunks/11mp_@anthropic-ai_sdk_17d_oma._.js +3 -0
  246. package/.next/server/chunks/11mp_@anthropic-ai_sdk_18qwuyb._.js +3 -0
  247. package/.next/server/chunks/11mp_@anthropic-ai_sdk_19au8y6._.js +3 -0
  248. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1ak_hy5._.js +3 -0
  249. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1cqa0nq._.js +3 -0
  250. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1i-x_q0._.js +3 -0
  251. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1i-x_q0._.js.map +1 -0
  252. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1jmtliz._.js +3 -0
  253. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1jmtliz._.js.map +1 -0
  254. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1jouwlj._.js +3 -0
  255. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1jouwlj._.js.map +1 -0
  256. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1r_q5um._.js +3 -0
  257. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1r_q5um._.js.map +1 -0
  258. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1t959xd._.js +3 -0
  259. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1t959xd._.js.map +1 -0
  260. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1vkprw9._.js +3 -0
  261. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1vkprw9._.js.map +1 -0
  262. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1y95ax9._.js +3 -0
  263. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1y95ax9._.js.map +1 -0
  264. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1y9misr._.js +3 -0
  265. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1y9misr._.js.map +1 -0
  266. package/.next/server/chunks/11mp_@anthropic-ai_sdk_21b8wwy._.js +3 -0
  267. package/.next/server/chunks/11mp_@anthropic-ai_sdk_21b8wwy._.js.map +1 -0
  268. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_08ecfgc._.js +3 -0
  269. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_09--sd6._.js +3 -0
  270. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0e3mwc6._.js +3 -0
  271. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0go4301._.js +3 -0
  272. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0iq9dmt._.js +3 -0
  273. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0n9ijke._.js +3 -0
  274. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0szcyrx._.js +3 -0
  275. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0xy2s3x._.js +3 -0
  276. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0yaujn7._.js +3 -0
  277. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0z9ly74._.js +3 -0
  278. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1hmq3al._.js +3 -0
  279. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1tqk4bp._.js +3 -0
  280. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1x-hr6f._.js +3 -0
  281. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1zsdhg0._.js +3 -0
  282. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_20t__fe._.js +3 -0
  283. package/.next/server/chunks/{[root-of-the-server]__1u_q61h._.js → [root-of-the-server]__0-pmfg2._.js} +2 -2
  284. package/.next/server/chunks/[root-of-the-server]__02co2yq._.js +3 -0
  285. package/.next/server/chunks/[root-of-the-server]__02co2yq._.js.map +1 -0
  286. package/.next/server/chunks/{[root-of-the-server]__1y3u5ud._.js → [root-of-the-server]__04tibmn._.js} +2 -2
  287. package/.next/server/chunks/{[root-of-the-server]__17xb02p._.js → [root-of-the-server]__05g5cgo._.js} +2 -2
  288. package/.next/server/chunks/{[root-of-the-server]__0aynzrb._.js → [root-of-the-server]__0b5pwze._.js} +2 -2
  289. package/.next/server/chunks/{[root-of-the-server]__142icjb._.js → [root-of-the-server]__0druay_._.js} +2 -2
  290. package/.next/server/chunks/{[root-of-the-server]__106gpvh._.js → [root-of-the-server]__0p6ja6l._.js} +2 -2
  291. package/.next/server/chunks/[root-of-the-server]__0q3-t8a._.js +3 -0
  292. package/.next/server/chunks/[root-of-the-server]__0q3-t8a._.js.map +1 -0
  293. package/.next/server/chunks/[root-of-the-server]__0vcsqzd._.js +3 -0
  294. package/.next/server/chunks/[root-of-the-server]__0vcsqzd._.js.map +1 -0
  295. package/.next/server/chunks/{[root-of-the-server]__0nfvvy9._.js → [root-of-the-server]__1-e3i_5._.js} +2 -2
  296. package/.next/server/chunks/[root-of-the-server]__1-ic3af._.js +3 -0
  297. package/.next/server/chunks/[root-of-the-server]__1-ic3af._.js.map +1 -0
  298. package/.next/server/chunks/[root-of-the-server]__11a4ptn._.js +3 -0
  299. package/.next/server/chunks/[root-of-the-server]__11a4ptn._.js.map +1 -0
  300. package/.next/server/chunks/{[root-of-the-server]__0e59y5j._.js → [root-of-the-server]__11c8641._.js} +2 -2
  301. package/.next/server/chunks/[root-of-the-server]__11c8641._.js.map +1 -0
  302. package/.next/server/chunks/[root-of-the-server]__12nzy_6._.js +3 -0
  303. package/.next/server/chunks/[root-of-the-server]__12nzy_6._.js.map +1 -0
  304. package/.next/server/chunks/[root-of-the-server]__15ck1wv._.js +3 -0
  305. package/.next/server/chunks/[root-of-the-server]__15ck1wv._.js.map +1 -0
  306. package/.next/server/chunks/[root-of-the-server]__1613hjb._.js +30 -19
  307. package/.next/server/chunks/[root-of-the-server]__1613hjb._.js.map +1 -1
  308. package/.next/server/chunks/{[root-of-the-server]__06zf_sh._.js → [root-of-the-server]__197vw9g._.js} +2 -2
  309. package/.next/server/chunks/{[root-of-the-server]__1j0rrps._.js → [root-of-the-server]__19k8t87._.js} +2 -2
  310. package/.next/server/chunks/{[root-of-the-server]__0eqd-tw._.js → [root-of-the-server]__1ezzeji._.js} +2 -2
  311. package/.next/server/chunks/[root-of-the-server]__1jxu2x9._.js +3 -0
  312. package/.next/server/chunks/[root-of-the-server]__1jxu2x9._.js.map +1 -0
  313. package/.next/server/chunks/[root-of-the-server]__1mrmaf9._.js +3 -0
  314. package/.next/server/chunks/{[root-of-the-server]__17p0rkn._.js → [root-of-the-server]__1n68akx._.js} +2 -2
  315. package/.next/server/chunks/[root-of-the-server]__1n68akx._.js.map +1 -0
  316. package/.next/server/chunks/{[root-of-the-server]__11s76m8._.js → [root-of-the-server]__1npya5q._.js} +2 -2
  317. package/.next/server/chunks/[root-of-the-server]__1npya5q._.js.map +1 -0
  318. package/.next/server/chunks/[root-of-the-server]__1qusy4g._.js +3 -0
  319. package/.next/server/chunks/[root-of-the-server]__1qusy4g._.js.map +1 -0
  320. package/.next/server/chunks/{[root-of-the-server]__1q4ahvz._.js → [root-of-the-server]__1umrorf._.js} +2 -2
  321. package/.next/server/chunks/{[root-of-the-server]__093hlkh._.js → [root-of-the-server]__1vh9g2o._.js} +2 -2
  322. package/.next/server/chunks/{[root-of-the-server]__1y-tt29._.js → [root-of-the-server]__1vq38ov._.js} +2 -2
  323. package/.next/server/chunks/[root-of-the-server]__1xb0fmp._.js +1 -1
  324. package/.next/server/chunks/[root-of-the-server]__1xb0fmp._.js.map +1 -1
  325. package/.next/server/chunks/_04byth9._.js +24 -19
  326. package/.next/server/chunks/_04byth9._.js.map +1 -1
  327. package/.next/server/chunks/_1au4syj._.js +1 -1
  328. package/.next/server/chunks/_1au4syj._.js.map +1 -1
  329. package/.next/server/chunks/_1b5fqxy._.js.map +1 -1
  330. package/.next/server/chunks/_1ivswa9._.js +3 -0
  331. package/.next/server/chunks/_1ivswa9._.js.map +1 -0
  332. package/.next/server/chunks/_next-internal_server_app_api_conversations_route_actions_1-pu7gs.js +3 -0
  333. package/.next/server/chunks/_next-internal_server_app_api_conversations_route_actions_1-pu7gs.js.map +1 -0
  334. package/.next/server/chunks/_next-internal_server_app_api_roadmap_restore_route_actions_0skshp1.js +3 -0
  335. package/.next/server/chunks/_next-internal_server_app_api_roadmap_restore_route_actions_0skshp1.js.map +1 -0
  336. package/.next/server/chunks/_next-internal_server_app_api_tasks_bulk_route_actions_1k75mlb.js +3 -0
  337. package/.next/server/chunks/_next-internal_server_app_api_tasks_bulk_route_actions_1k75mlb.js.map +1 -0
  338. package/.next/server/chunks/_next-internal_server_app_api_tasks_delete_route_actions_1k1g6mw.js +3 -0
  339. package/.next/server/chunks/_next-internal_server_app_api_tasks_delete_route_actions_1k1g6mw.js.map +1 -0
  340. package/.next/server/chunks/_next-internal_server_app_api_tasks_manual-tests_route_actions_1rpog0y.js +3 -0
  341. package/.next/server/chunks/_next-internal_server_app_api_tasks_manual-tests_route_actions_1rpog0y.js.map +1 -0
  342. package/.next/server/chunks/_next-internal_server_app_api_tasks_restore_route_actions_1ecsti8.js +3 -0
  343. package/.next/server/chunks/_next-internal_server_app_api_tasks_restore_route_actions_1ecsti8.js.map +1 -0
  344. package/.next/server/chunks/_next-internal_server_app_api_tasks_review_route_actions_1dly07f.js +3 -0
  345. package/.next/server/chunks/_next-internal_server_app_api_tasks_review_route_actions_1dly07f.js.map +1 -0
  346. package/.next/server/chunks/_next-internal_server_app_api_tasks_update_route_actions_0z-ho6g.js +3 -0
  347. package/.next/server/chunks/_next-internal_server_app_api_tasks_update_route_actions_0z-ho6g.js.map +1 -0
  348. package/.next/server/chunks/_next-internal_server_app_api_views_route_actions_10-2c0e.js +3 -0
  349. package/.next/server/chunks/_next-internal_server_app_api_views_route_actions_10-2c0e.js.map +1 -0
  350. package/.next/server/chunks/ssr/{_0qyglif._.js → 0_g__next_dist_000c5_m._.js} +2 -4
  351. package/.next/server/chunks/ssr/0_g__next_dist_000c5_m._.js.map +1 -0
  352. package/.next/server/chunks/ssr/{0_nd_mermaid_dist_mermaid_core_mjs_1vulg1x._.js → 0_nd_mermaid_dist_mermaid_core_mjs_027n2yl._.js} +2 -2
  353. package/.next/server/chunks/ssr/0_nd_mermaid_dist_mermaid_core_mjs_027n2yl._.js.map +1 -0
  354. package/.next/server/chunks/ssr/{1u84_katex_dist_katex_mjs_0mwkb-i._.js → 1u84_katex_dist_katex_mjs_1kb5xea._.js} +1 -1
  355. package/.next/server/chunks/ssr/1u84_katex_dist_katex_mjs_1kb5xea._.js.map +1 -0
  356. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_05ggp3i._.js +1 -1
  357. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_05ggp3i._.js.map +1 -1
  358. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_0wurouw._.js +3 -0
  359. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_0wurouw._.js.map +1 -0
  360. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_14hl50o._.js +3 -0
  361. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_14hl50o._.js.map +1 -0
  362. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_folder-open_mjs_117ipzw._.js +3 -0
  363. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_folder-open_mjs_117ipzw._.js.map +1 -0
  364. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_triangle-alert_mjs_0ei-mpz._.js +3 -0
  365. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_triangle-alert_mjs_0ei-mpz._.js.map +1 -0
  366. package/.next/server/chunks/ssr/[root-of-the-server]__0hcextx._.js +3 -0
  367. package/.next/server/chunks/ssr/[root-of-the-server]__0hcextx._.js.map +1 -0
  368. package/.next/server/chunks/ssr/[root-of-the-server]__0xt_0w2._.js.map +1 -1
  369. package/.next/server/chunks/ssr/[root-of-the-server]__11lfnu0._.js +3 -0
  370. package/.next/server/chunks/ssr/[root-of-the-server]__11lfnu0._.js.map +1 -0
  371. package/.next/server/chunks/ssr/_04xff_2._.js +1 -1
  372. package/.next/server/chunks/ssr/_04xff_2._.js.map +1 -1
  373. package/.next/server/chunks/ssr/_071j6mr._.js +4 -0
  374. package/.next/server/chunks/ssr/_071j6mr._.js.map +1 -0
  375. package/.next/server/chunks/ssr/_09b02z-._.js +3 -0
  376. package/.next/server/chunks/ssr/_09b02z-._.js.map +1 -0
  377. package/.next/server/chunks/ssr/_0d0f1s1._.js +3 -0
  378. package/.next/server/chunks/ssr/_0d0f1s1._.js.map +1 -0
  379. package/.next/server/chunks/ssr/_0idb-vo._.js +151 -0
  380. package/.next/server/chunks/ssr/_0idb-vo._.js.map +1 -0
  381. package/.next/server/chunks/ssr/_0lnt_va._.js +4 -0
  382. package/.next/server/chunks/ssr/_0lnt_va._.js.map +1 -0
  383. package/.next/server/chunks/ssr/_0qlymco._.js +3 -0
  384. package/.next/server/chunks/ssr/_0qlymco._.js.map +1 -0
  385. package/.next/server/chunks/ssr/_0qp3gu7._.js +3 -0
  386. package/.next/server/chunks/ssr/_0qp3gu7._.js.map +1 -0
  387. package/.next/server/chunks/ssr/_0sg1oeq._.js +3 -0
  388. package/.next/server/chunks/ssr/_0sg1oeq._.js.map +1 -0
  389. package/.next/server/chunks/ssr/_14emfpq._.js +3 -0
  390. package/.next/server/chunks/ssr/_14emfpq._.js.map +1 -0
  391. package/.next/server/chunks/ssr/_1ftruw6._.js +4 -0
  392. package/.next/server/chunks/ssr/_1ftruw6._.js.map +1 -0
  393. package/.next/server/chunks/ssr/_1gxjjvh._.js +1 -1
  394. package/.next/server/chunks/ssr/_1gxjjvh._.js.map +1 -1
  395. package/.next/server/chunks/ssr/_1ncdakv._.js +4 -0
  396. package/.next/server/chunks/ssr/_1ncdakv._.js.map +1 -0
  397. package/.next/server/chunks/ssr/_1t76zdx._.js +3 -0
  398. package/.next/server/chunks/ssr/_1t76zdx._.js.map +1 -0
  399. package/.next/server/chunks/ssr/_1x7ggg5._.js +4 -0
  400. package/.next/server/chunks/ssr/_1x7ggg5._.js.map +1 -0
  401. package/.next/server/chunks/ssr/_next-internal_server_app_(app)_chat_page_actions_0g4tbzt.js +3 -0
  402. package/.next/server/chunks/ssr/_next-internal_server_app_(app)_chat_page_actions_0g4tbzt.js.map +1 -0
  403. package/.next/server/chunks/ssr/_next-internal_server_app_(app)_manual-tests_page_actions_1g5zjb7.js +3 -0
  404. package/.next/server/chunks/ssr/_next-internal_server_app_(app)_manual-tests_page_actions_1g5zjb7.js.map +1 -0
  405. package/.next/server/chunks/ssr/{node_modules__pnpm_0w9uewb._.js → node_modules__pnpm_01bjcv9._.js} +1 -1
  406. package/.next/server/chunks/ssr/{node_modules__pnpm_0p10j87._.js → node_modules__pnpm_03qrzdb._.js} +1 -1
  407. package/.next/server/chunks/ssr/{node_modules__pnpm_1a3fo7j._.js → node_modules__pnpm_06d-fdo._.js} +2 -2
  408. package/.next/server/chunks/ssr/{node_modules__pnpm_1o30a9w._.js → node_modules__pnpm_0ctisl0._.js} +1 -1
  409. package/.next/server/chunks/ssr/{node_modules__pnpm_17o8zbz._.js → node_modules__pnpm_0fwp8jm._.js} +1 -1
  410. package/.next/server/chunks/ssr/{node_modules__pnpm_19ys1iv._.js → node_modules__pnpm_0kpu0-2._.js} +1 -1
  411. package/.next/server/chunks/ssr/{node_modules__pnpm_1r4w_7k._.js → node_modules__pnpm_0vry74x._.js} +2 -2
  412. package/.next/server/chunks/ssr/{node_modules__pnpm_11lluiq._.js → node_modules__pnpm_0ycbjbd._.js} +2 -2
  413. package/.next/server/chunks/ssr/{node_modules__pnpm_1_34wt2._.js → node_modules__pnpm_1-76qxg._.js} +1 -1
  414. package/.next/server/chunks/ssr/{node_modules__pnpm_0ma8hho._.js → node_modules__pnpm_1-r94f7._.js} +1 -1
  415. package/.next/server/chunks/ssr/{node_modules__pnpm_0--x5-5._.js → node_modules__pnpm_14piqi4._.js} +1 -1
  416. package/.next/server/chunks/ssr/node_modules__pnpm_14piqi4._.js.map +1 -0
  417. package/.next/server/chunks/ssr/{node_modules__pnpm_04xoqd9._.js → node_modules__pnpm_16u1vfb._.js} +2 -2
  418. package/.next/server/chunks/ssr/node_modules__pnpm_16u1vfb._.js.map +1 -0
  419. package/.next/server/chunks/ssr/{node_modules__pnpm_19ejwjv._.js → node_modules__pnpm_17i6z2d._.js} +1 -1
  420. package/.next/server/chunks/ssr/{node_modules__pnpm_0cj37c-._.js → node_modules__pnpm_189m48n._.js} +1 -1
  421. package/.next/server/chunks/ssr/node_modules__pnpm_189m48n._.js.map +1 -0
  422. package/.next/server/chunks/ssr/{node_modules__pnpm_18pu1wl._.js → node_modules__pnpm_192f222._.js} +1 -1
  423. package/.next/server/chunks/ssr/{node_modules__pnpm_1zsbfem._.js → node_modules__pnpm_1a48_nl._.js} +1 -1
  424. package/.next/server/chunks/ssr/{node_modules__pnpm_00i3mh2._.js → node_modules__pnpm_1aa37e1._.js} +1 -1
  425. package/.next/server/chunks/ssr/{node_modules__pnpm_0kna82c._.js → node_modules__pnpm_1f440kx._.js} +1 -1
  426. package/.next/server/chunks/ssr/{node_modules__pnpm_1-poetj._.js → node_modules__pnpm_1fn3ejy._.js} +1 -1
  427. package/.next/server/chunks/ssr/{node_modules__pnpm_0yixxj2._.js → node_modules__pnpm_1min2jl._.js} +1 -1
  428. package/.next/server/chunks/ssr/node_modules__pnpm_1q89l7p._.js +3 -0
  429. package/.next/server/chunks/ssr/node_modules__pnpm_1q89l7p._.js.map +1 -0
  430. package/.next/server/chunks/ssr/{node_modules__pnpm_1l-posw._.js → node_modules__pnpm_1q_hhr3._.js} +2 -2
  431. package/.next/server/chunks/ssr/{node_modules__pnpm_0fk-8nl._.js → node_modules__pnpm_1qmkxyo._.js} +1 -1
  432. package/.next/server/chunks/ssr/{node_modules__pnpm_1xolwvc._.js → node_modules__pnpm_1qp_jvj._.js} +2 -2
  433. package/.next/server/chunks/ssr/{node_modules__pnpm_07j8gcu._.js → node_modules__pnpm_1ssjj4u._.js} +1 -1
  434. package/.next/server/chunks/ssr/{node_modules__pnpm_042y3e-._.js → node_modules__pnpm_1txccoj._.js} +1 -1
  435. package/.next/server/chunks/ssr/{node_modules__pnpm_0nbxdp_._.js → node_modules__pnpm_1uwkcin._.js} +1 -1
  436. package/.next/server/chunks/ssr/node_modules__pnpm_1xeothw._.js +3 -0
  437. package/.next/server/chunks/ssr/node_modules__pnpm_1xeothw._.js.map +1 -0
  438. package/.next/server/chunks/ssr/{node_modules__pnpm_00wjhj4._.js → node_modules__pnpm_1ygal0c._.js} +1 -1
  439. package/.next/server/chunks/ssr/src_app_(app)_activity_page_tsx_13jd6bn._.js +1 -1
  440. package/.next/server/chunks/ssr/src_app_(app)_activity_page_tsx_13jd6bn._.js.map +1 -1
  441. package/.next/server/chunks/ssr/src_app_(app)_board_page_tsx_0gpfc77._.js +3 -0
  442. package/.next/server/chunks/ssr/src_app_(app)_board_page_tsx_0gpfc77._.js.map +1 -0
  443. package/.next/server/chunks/ssr/src_app_(app)_chat_page_tsx_0c3e4l4._.js +3 -0
  444. package/.next/server/chunks/ssr/src_app_(app)_chat_page_tsx_0c3e4l4._.js.map +1 -0
  445. package/.next/server/chunks/ssr/src_app_(app)_layout_tsx_1yu5hom._.js +3 -0
  446. package/.next/server/chunks/ssr/src_app_(app)_layout_tsx_1yu5hom._.js.map +1 -0
  447. package/.next/server/chunks/ssr/src_app_(app)_manual-tests_page_tsx_01tnunf._.js +3 -0
  448. package/.next/server/chunks/ssr/src_app_(app)_manual-tests_page_tsx_01tnunf._.js.map +1 -0
  449. package/.next/server/chunks/ssr/src_app_(app)_roadmap_page_tsx_0vcq3jr._.js +5 -0
  450. package/.next/server/chunks/ssr/src_app_(app)_roadmap_page_tsx_0vcq3jr._.js.map +1 -0
  451. package/.next/server/chunks/ssr/src_app_(app)_settings_page_tsx_0zevtee._.js +2 -2
  452. package/.next/server/chunks/ssr/src_app_(app)_settings_page_tsx_0zevtee._.js.map +1 -1
  453. package/.next/server/chunks/ssr/src_app_(app)_setup_page_tsx_1yids_n._.js +1 -1
  454. package/.next/server/chunks/ssr/src_app_(app)_setup_page_tsx_1yids_n._.js.map +1 -1
  455. package/.next/server/chunks/ssr/src_components_chat_ChatView_tsx_0h5j-e2._.js +3 -0
  456. package/.next/server/chunks/ssr/src_components_chat_ChatView_tsx_0h5j-e2._.js.map +1 -0
  457. package/.next/server/chunks/ssr/src_context_ChatContext_tsx_0lowp8p._.js +5 -0
  458. package/.next/server/chunks/ssr/src_context_ChatContext_tsx_0lowp8p._.js.map +1 -0
  459. package/.next/server/chunks/ssr/{_1wf14_u._.js → src_lib_templates_index_ts_1s61uk7._.js} +2 -2
  460. package/.next/server/chunks/ssr/{_1wf14_u._.js.map → src_lib_templates_index_ts_1s61uk7._.js.map} +1 -1
  461. package/.next/server/middleware-build-manifest.js +3 -3
  462. package/.next/server/next-font-manifest.js +1 -1
  463. package/.next/server/next-font-manifest.json +8 -0
  464. package/.next/server/pages/404.html +1 -1
  465. package/.next/server/pages/500.html +1 -1
  466. package/.next/server/prefetch-hints.json +38 -0
  467. package/.next/server/server-reference-manifest.js +1 -1
  468. package/.next/server/server-reference-manifest.json +1 -1
  469. package/.next/static/chunks/02cj5_i9np4sg.js +3 -0
  470. package/.next/static/chunks/02i5hsdat1nuq.css +9 -0
  471. package/.next/static/chunks/0mgifb98wbesa.js +1 -0
  472. package/.next/static/chunks/0p1-hkgnm2ll2.js +1 -0
  473. package/.next/static/chunks/0pgu5q5vodev6.js +1 -0
  474. package/.next/static/chunks/0rqzvayflendx.js +2 -0
  475. package/.next/static/chunks/0vcfs7dii85tw.js +21 -0
  476. package/.next/static/chunks/13l4l-boqg8fx.js +1 -0
  477. package/.next/static/chunks/14hxe1qiaram9.js +1 -0
  478. package/.next/static/chunks/150y5rwg6gwvx.css +1 -0
  479. package/.next/static/chunks/16k196zyl-n9q.js +1 -0
  480. package/.next/static/chunks/18b5l8p0vd9f8.js +1 -0
  481. package/.next/static/chunks/1c_8t2kecjnua.js +1 -0
  482. package/.next/static/chunks/1fd43t9y42wd3.js +1 -0
  483. package/.next/static/chunks/1q50zh5z-fq2k.js +2 -0
  484. package/.next/static/chunks/1tu8lforstp1o.js +1 -0
  485. package/.next/static/chunks/23-xknrz6o748.js +1 -0
  486. package/.next/static/chunks/2_xpm7qhr69n8.js +2 -0
  487. package/.next/static/chunks/2ls_yp4-qgb42.js +1 -0
  488. package/.next/static/chunks/2zz0ip2l_29c3.js +3 -0
  489. package/.next/static/chunks/3ly7b47esdb7j.js +1 -0
  490. package/.next/static/chunks/3ruw8lu2_re-h.js +1 -0
  491. package/.next/static/chunks/3vf5nnd4xjo5_.js +1 -0
  492. package/.next/static/chunks/{0eggcu0ovk8sd.js → 40jaenrnspnlh.js} +26 -26
  493. package/.next/static/chunks/41oxcdcw-pcwt.js +1 -0
  494. package/README.md +3 -2
  495. package/package.json +1 -1
  496. package/skills/work-epic/SKILL.md +22 -3
  497. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0am8bw2._.js +0 -3
  498. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0enefn6._.js +0 -3
  499. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0k3n_5f._.js +0 -3
  500. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0lcfjm4._.js +0 -3
  501. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0lfx9av._.js +0 -3
  502. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0qau3qw._.js +0 -3
  503. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0r1pmvm._.js +0 -3
  504. package/.next/server/chunks/11mp_@anthropic-ai_sdk_11t-z2t._.js +0 -3
  505. package/.next/server/chunks/11mp_@anthropic-ai_sdk_15hyn79._.js +0 -3
  506. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1_qk07x._.js +0 -3
  507. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1b2929e._.js +0 -3
  508. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1e72c89._.js +0 -3
  509. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1eq7asn._.js +0 -3
  510. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1fhdojs._.js +0 -3
  511. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1lh_vwq._.js +0 -3
  512. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1ludf-o._.js +0 -3
  513. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1m3luz3._.js +0 -3
  514. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1x1iz3d._.js +0 -3
  515. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1xsmwlh._.js +0 -3
  516. package/.next/server/chunks/11mp_@anthropic-ai_sdk_202spah._.js +0 -3
  517. package/.next/server/chunks/11mp_@anthropic-ai_sdk_215hw9u._.js +0 -3
  518. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0n-i0pd._.js +0 -3
  519. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_13pos4j._.js +0 -3
  520. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_17b4pqr._.js +0 -3
  521. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1bkcmom._.js +0 -3
  522. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1hlj_3l._.js +0 -3
  523. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1ip-sor._.js +0 -3
  524. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1pex5o1._.js +0 -3
  525. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1s8lc8_._.js +0 -3
  526. package/.next/server/chunks/[root-of-the-server]__1o4a-4j._.js +0 -3
  527. package/.next/server/chunks/[root-of-the-server]__1o4a-4j._.js.map +0 -1
  528. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_08ca0b4._.js +0 -3
  529. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_08ca0b4._.js.map +0 -1
  530. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_0c1k9is._.js +0 -3
  531. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_0c1k9is._.js.map +0 -1
  532. package/.next/server/chunks/ssr/_0qyglif._.js.map +0 -1
  533. package/.next/server/chunks/ssr/_0skuoxv._.js +0 -6
  534. package/.next/server/chunks/ssr/_0skuoxv._.js.map +0 -1
  535. package/.next/server/chunks/ssr/_14i_6yb._.js +0 -3
  536. package/.next/server/chunks/ssr/_14i_6yb._.js.map +0 -1
  537. package/.next/server/chunks/ssr/_1c95ems._.js +0 -151
  538. package/.next/server/chunks/ssr/_1c95ems._.js.map +0 -1
  539. package/.next/server/chunks/ssr/_1cbhuz4._.js +0 -3
  540. package/.next/server/chunks/ssr/_1cbhuz4._.js.map +0 -1
  541. package/.next/server/chunks/ssr/_1ewk_mn._.js +0 -3
  542. package/.next/server/chunks/ssr/_1ewk_mn._.js.map +0 -1
  543. package/.next/server/chunks/ssr/_1y-ofyw._.js +0 -3
  544. package/.next/server/chunks/ssr/_1y-ofyw._.js.map +0 -1
  545. package/.next/server/chunks/ssr/node_modules__pnpm_0bmkw6o._.js +0 -3
  546. package/.next/server/chunks/ssr/node_modules__pnpm_0bmkw6o._.js.map +0 -1
  547. package/.next/server/chunks/ssr/node_modules__pnpm_1imm4ut._.js +0 -3
  548. package/.next/server/chunks/ssr/node_modules__pnpm_1imm4ut._.js.map +0 -1
  549. package/.next/server/chunks/ssr/src_components_008q3v8._.js +0 -3
  550. package/.next/server/chunks/ssr/src_components_008q3v8._.js.map +0 -1
  551. package/.next/server/chunks/ssr/src_components_14pwej-._.js +0 -3
  552. package/.next/server/chunks/ssr/src_components_14pwej-._.js.map +0 -1
  553. package/.next/server/chunks/ssr/src_components_ui_scroll-area_tsx_0i-n_27._.js +0 -3
  554. package/.next/server/chunks/ssr/src_components_ui_scroll-area_tsx_0i-n_27._.js.map +0 -1
  555. package/.next/static/chunks/0-vk2d2nnzav2.js +0 -3
  556. package/.next/static/chunks/0-z7kyblalrea.js +0 -1
  557. package/.next/static/chunks/02sab26ica2x3.js +0 -1
  558. package/.next/static/chunks/0iva6rdtfqpbz.js +0 -1
  559. package/.next/static/chunks/0k2qhx29amdgs.js +0 -1
  560. package/.next/static/chunks/0qm101bdsxdyh.css +0 -10
  561. package/.next/static/chunks/0wg9n5zb8mo2p.js +0 -1
  562. package/.next/static/chunks/0z_y7el6m76yk.js +0 -1
  563. package/.next/static/chunks/1-ekntoveuxzd.js +0 -4
  564. package/.next/static/chunks/10neasnz6hhq1.js +0 -1
  565. package/.next/static/chunks/1r7z33e9jk3vp.js +0 -1
  566. package/.next/static/chunks/22dw7r8x0h2sx.js +0 -1
  567. package/.next/static/chunks/26ee8jsbellqk.js +0 -21
  568. package/.next/static/chunks/3kkg030rcpz7l.js +0 -1
  569. package/.next/static/chunks/3pf_4ye6ju8gt.js +0 -1
  570. package/.next/static/chunks/3smp1lj103j-l.js +0 -1
  571. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0-5bkpj._.js.map → 11mp_@anthropic-ai_sdk_00p3fu1._.js.map} +0 -0
  572. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_00psb_y._.js.map → 11mp_@anthropic-ai_sdk_01amtux._.js.map} +0 -0
  573. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_01l5h3i._.js.map → 11mp_@anthropic-ai_sdk_01jjl08._.js.map} +0 -0
  574. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_072r2bd._.js.map → 11mp_@anthropic-ai_sdk_071zfm8._.js.map} +0 -0
  575. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0am8bw2._.js.map → 11mp_@anthropic-ai_sdk_07v3boe._.js.map} +0 -0
  576. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0enefn6._.js.map → 11mp_@anthropic-ai_sdk_09iva72._.js.map} +0 -0
  577. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0k3n_5f._.js.map → 11mp_@anthropic-ai_sdk_0bom1b1._.js.map} +0 -0
  578. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0lcfjm4._.js.map → 11mp_@anthropic-ai_sdk_0dvji7p._.js.map} +0 -0
  579. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0lfx9av._.js.map → 11mp_@anthropic-ai_sdk_0dzo8jn._.js.map} +0 -0
  580. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0qau3qw._.js.map → 11mp_@anthropic-ai_sdk_0hvqsqq._.js.map} +0 -0
  581. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0r1pmvm._.js.map → 11mp_@anthropic-ai_sdk_0i7i-jw._.js.map} +0 -0
  582. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_11t-z2t._.js.map → 11mp_@anthropic-ai_sdk_0k0iop5._.js.map} +0 -0
  583. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_15hyn79._.js.map → 11mp_@anthropic-ai_sdk_0l3-6aq._.js.map} +0 -0
  584. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1_qk07x._.js.map → 11mp_@anthropic-ai_sdk_0oegm3y._.js.map} +0 -0
  585. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1b2929e._.js.map → 11mp_@anthropic-ai_sdk_0p5cyes._.js.map} +0 -0
  586. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1e72c89._.js.map → 11mp_@anthropic-ai_sdk_0qw8i6_._.js.map} +0 -0
  587. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1eq7asn._.js.map → 11mp_@anthropic-ai_sdk_0yk-a7v._.js.map} +0 -0
  588. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1fhdojs._.js.map → 11mp_@anthropic-ai_sdk_11fsqvb._.js.map} +0 -0
  589. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1lh_vwq._.js.map → 11mp_@anthropic-ai_sdk_143_7ez._.js.map} +0 -0
  590. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1ludf-o._.js.map → 11mp_@anthropic-ai_sdk_14a4-64._.js.map} +0 -0
  591. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1m3luz3._.js.map → 11mp_@anthropic-ai_sdk_17d_oma._.js.map} +0 -0
  592. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1x1iz3d._.js.map → 11mp_@anthropic-ai_sdk_18qwuyb._.js.map} +0 -0
  593. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1xsmwlh._.js.map → 11mp_@anthropic-ai_sdk_19au8y6._.js.map} +0 -0
  594. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_202spah._.js.map → 11mp_@anthropic-ai_sdk_1ak_hy5._.js.map} +0 -0
  595. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_215hw9u._.js.map → 11mp_@anthropic-ai_sdk_1cqa0nq._.js.map} +0 -0
  596. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_0n-i0pd._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_08ecfgc._.js.map} +0 -0
  597. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_13pos4j._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_09--sd6._.js.map} +0 -0
  598. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_17b4pqr._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0e3mwc6._.js.map} +0 -0
  599. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1bkcmom._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0go4301._.js.map} +0 -0
  600. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1hlj_3l._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0iq9dmt._.js.map} +0 -0
  601. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1ip-sor._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0n9ijke._.js.map} +0 -0
  602. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1pex5o1._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0szcyrx._.js.map} +0 -0
  603. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1s8lc8_._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0xy2s3x._.js.map} +0 -0
  604. /package/.next/server/chunks/{[root-of-the-server]__0e59y5j._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0yaujn7._.js.map} +0 -0
  605. /package/.next/server/chunks/{[root-of-the-server]__11s76m8._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0z9ly74._.js.map} +0 -0
  606. /package/.next/server/chunks/{ssr/0_nd_mermaid_dist_mermaid_core_mjs_1vulg1x._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1hmq3al._.js.map} +0 -0
  607. /package/.next/server/chunks/{ssr/1u84_katex_dist_katex_mjs_0mwkb-i._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1tqk4bp._.js.map} +0 -0
  608. /package/.next/server/chunks/{ssr/node_modules__pnpm_0--x5-5._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1x-hr6f._.js.map} +0 -0
  609. /package/.next/server/chunks/{ssr/node_modules__pnpm_04xoqd9._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1zsdhg0._.js.map} +0 -0
  610. /package/.next/server/chunks/{ssr/node_modules__pnpm_0cj37c-._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_20t__fe._.js.map} +0 -0
  611. /package/.next/server/chunks/{[root-of-the-server]__1u_q61h._.js.map → [root-of-the-server]__0-pmfg2._.js.map} +0 -0
  612. /package/.next/server/chunks/{[root-of-the-server]__1y3u5ud._.js.map → [root-of-the-server]__04tibmn._.js.map} +0 -0
  613. /package/.next/server/chunks/{[root-of-the-server]__17xb02p._.js.map → [root-of-the-server]__05g5cgo._.js.map} +0 -0
  614. /package/.next/server/chunks/{[root-of-the-server]__0aynzrb._.js.map → [root-of-the-server]__0b5pwze._.js.map} +0 -0
  615. /package/.next/server/chunks/{[root-of-the-server]__142icjb._.js.map → [root-of-the-server]__0druay_._.js.map} +0 -0
  616. /package/.next/server/chunks/{[root-of-the-server]__106gpvh._.js.map → [root-of-the-server]__0p6ja6l._.js.map} +0 -0
  617. /package/.next/server/chunks/{[root-of-the-server]__0nfvvy9._.js.map → [root-of-the-server]__1-e3i_5._.js.map} +0 -0
  618. /package/.next/server/chunks/{[root-of-the-server]__06zf_sh._.js.map → [root-of-the-server]__197vw9g._.js.map} +0 -0
  619. /package/.next/server/chunks/{[root-of-the-server]__1j0rrps._.js.map → [root-of-the-server]__19k8t87._.js.map} +0 -0
  620. /package/.next/server/chunks/{[root-of-the-server]__0eqd-tw._.js.map → [root-of-the-server]__1ezzeji._.js.map} +0 -0
  621. /package/.next/server/chunks/{[root-of-the-server]__17p0rkn._.js.map → [root-of-the-server]__1mrmaf9._.js.map} +0 -0
  622. /package/.next/server/chunks/{[root-of-the-server]__1q4ahvz._.js.map → [root-of-the-server]__1umrorf._.js.map} +0 -0
  623. /package/.next/server/chunks/{[root-of-the-server]__093hlkh._.js.map → [root-of-the-server]__1vh9g2o._.js.map} +0 -0
  624. /package/.next/server/chunks/{[root-of-the-server]__1y-tt29._.js.map → [root-of-the-server]__1vq38ov._.js.map} +0 -0
  625. /package/.next/server/chunks/ssr/{node_modules__pnpm_0w9uewb._.js.map → node_modules__pnpm_01bjcv9._.js.map} +0 -0
  626. /package/.next/server/chunks/ssr/{node_modules__pnpm_0p10j87._.js.map → node_modules__pnpm_03qrzdb._.js.map} +0 -0
  627. /package/.next/server/chunks/ssr/{node_modules__pnpm_1a3fo7j._.js.map → node_modules__pnpm_06d-fdo._.js.map} +0 -0
  628. /package/.next/server/chunks/ssr/{node_modules__pnpm_1o30a9w._.js.map → node_modules__pnpm_0ctisl0._.js.map} +0 -0
  629. /package/.next/server/chunks/ssr/{node_modules__pnpm_17o8zbz._.js.map → node_modules__pnpm_0fwp8jm._.js.map} +0 -0
  630. /package/.next/server/chunks/ssr/{node_modules__pnpm_19ys1iv._.js.map → node_modules__pnpm_0kpu0-2._.js.map} +0 -0
  631. /package/.next/server/chunks/ssr/{node_modules__pnpm_1r4w_7k._.js.map → node_modules__pnpm_0vry74x._.js.map} +0 -0
  632. /package/.next/server/chunks/ssr/{node_modules__pnpm_11lluiq._.js.map → node_modules__pnpm_0ycbjbd._.js.map} +0 -0
  633. /package/.next/server/chunks/ssr/{node_modules__pnpm_1_34wt2._.js.map → node_modules__pnpm_1-76qxg._.js.map} +0 -0
  634. /package/.next/server/chunks/ssr/{node_modules__pnpm_0ma8hho._.js.map → node_modules__pnpm_1-r94f7._.js.map} +0 -0
  635. /package/.next/server/chunks/ssr/{node_modules__pnpm_19ejwjv._.js.map → node_modules__pnpm_17i6z2d._.js.map} +0 -0
  636. /package/.next/server/chunks/ssr/{node_modules__pnpm_18pu1wl._.js.map → node_modules__pnpm_192f222._.js.map} +0 -0
  637. /package/.next/server/chunks/ssr/{node_modules__pnpm_1zsbfem._.js.map → node_modules__pnpm_1a48_nl._.js.map} +0 -0
  638. /package/.next/server/chunks/ssr/{node_modules__pnpm_00i3mh2._.js.map → node_modules__pnpm_1aa37e1._.js.map} +0 -0
  639. /package/.next/server/chunks/ssr/{node_modules__pnpm_0kna82c._.js.map → node_modules__pnpm_1f440kx._.js.map} +0 -0
  640. /package/.next/server/chunks/ssr/{node_modules__pnpm_1-poetj._.js.map → node_modules__pnpm_1fn3ejy._.js.map} +0 -0
  641. /package/.next/server/chunks/ssr/{node_modules__pnpm_0yixxj2._.js.map → node_modules__pnpm_1min2jl._.js.map} +0 -0
  642. /package/.next/server/chunks/ssr/{node_modules__pnpm_1l-posw._.js.map → node_modules__pnpm_1q_hhr3._.js.map} +0 -0
  643. /package/.next/server/chunks/ssr/{node_modules__pnpm_0fk-8nl._.js.map → node_modules__pnpm_1qmkxyo._.js.map} +0 -0
  644. /package/.next/server/chunks/ssr/{node_modules__pnpm_1xolwvc._.js.map → node_modules__pnpm_1qp_jvj._.js.map} +0 -0
  645. /package/.next/server/chunks/ssr/{node_modules__pnpm_07j8gcu._.js.map → node_modules__pnpm_1ssjj4u._.js.map} +0 -0
  646. /package/.next/server/chunks/ssr/{node_modules__pnpm_042y3e-._.js.map → node_modules__pnpm_1txccoj._.js.map} +0 -0
  647. /package/.next/server/chunks/ssr/{node_modules__pnpm_0nbxdp_._.js.map → node_modules__pnpm_1uwkcin._.js.map} +0 -0
  648. /package/.next/server/chunks/ssr/{node_modules__pnpm_00wjhj4._.js.map → node_modules__pnpm_1ygal0c._.js.map} +0 -0
  649. /package/.next/static/{gJtrYenzL6_deB-6pdvIL → fGPda81_8-K4GmaNUE6KA}/_buildManifest.js +0 -0
  650. /package/.next/static/{gJtrYenzL6_deB-6pdvIL → fGPda81_8-K4GmaNUE6KA}/_clientMiddlewareManifest.js +0 -0
  651. /package/.next/static/{gJtrYenzL6_deB-6pdvIL → fGPda81_8-K4GmaNUE6KA}/_ssgManifest.js +0 -0
@@ -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(553415),j=a.i(200382),k=a.i(551729),l=a.i(913975),m=a.i(544394),n=a.i(21215),o=a.i(699570);let p=a=>"done"===a||"cancelled"===a;function q(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||!p(b.status)});for(let a of d)if("todo"===a.status&&!e(a).length)return{kind:"ready",taskId:a.id};if(d.every(a=>p(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&&"paused"!==b.status&&"review"!==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("paused"===a.status)i.push({taskId:b,reason:`${b} is paused — needs a human to resume it`});else if("review"===a.status)i.push({taskId:b,reason:`${b} in review — needs a human`});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 r=a.i(452696),s=a.i(368114),t=a.i(525395),u=a.i(618940),v=a.i(815122),w=a.i(581040);function x({items:a,today:d,onSelect:e,onItemContextMenu:f,progressById:g}){let h=new Map(a.filter(a=>null===a.parent).sort((a,b)=>a.order-b.order).map((a,b)=>[a.id,b+1])),i=(0,c.useMemo)(()=>(0,w.buildTimeline)(a,d),[a,d]),j=(0,c.useRef)(null);(0,c.useEffect)(()=>{let a=j.current;a&&(a.scrollLeft=Math.max(0,i.todayX-(a.clientWidth-200)/3))},[i.todayX]);let k=i.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:j,className:"relative flex-1 min-h-0 overflow-auto",children:(0,b.jsxs)("div",{className:"relative",style:{width:200+i.width,minHeight:"100%"},children:[(0,b.jsxs)("div",{className:"pointer-events-none absolute inset-y-0",style:{left:200,width:i.width},children:[i.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:i.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:i.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-accent-fg",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:i.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))})]}),i.lanes.map(a=>(0,b.jsxs)("div",{className:"relative flex border-b border-border",children:[(0,b.jsx)(y,{item:a.item,chapter:h.get(a.item.id),progress:g[a.item.id],onSelect:e,onContextMenu:f}),(0,b.jsx)("div",{className:"relative",style:{width:i.width,height:a.rows*w.LANE_ROW_H+12},children:a.markers.map(a=>(0,b.jsxs)("button",{type:"button",onClick:()=>e(a.item.id),onContextMenu:b=>f?.(a.item.id,b),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*w.LANE_ROW_H},children:[a.horizon?(0,b.jsx)("span",{className:(0,s.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,s.cn)("rounded-full","overdue"===a.state&&"ring-2 ring-danger ring-offset-1 ring-offset-bg"),children:(0,b.jsx)(u.StatusDot,{status:a.item.status})}),(0,b.jsxs)("span",{className:(0,s.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,s.cn)("truncate text-xs","done"===a.item.status?"text-muted":"text-txt",a.horizon&&"font-semibold"),children:a.item.title}),(0,b.jsx)(v.AgentDot,{attach:{kind:"epic",id:a.item.id}})]}),(0,b.jsx)("span",{className:(0,s.cn)("font-mono text-[10px]","overdue"===a.state?"text-danger":"soon"===a.state?"text-amber":"text-muted"),children:(0,w.formatDay)(a.item.due)})]})]},a.item.id))})]},a.item.id)),!k&&(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."})]})}),i.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 · ",i.undated.length]}),(0,b.jsx)("div",{className:"flex flex-wrap gap-1.5",children:i.undated.map(a=>(0,b.jsxs)("button",{type:"button",onClick:()=>e(a.id),onContextMenu:b=>f?.(a.id,b),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)(u.StatusDot,{status:a.status}),a.title,(0,b.jsx)(v.AgentDot,{attach:{kind:"epic",id:a.id}})]},a.id))})]})]})}function y({item:a,chapter:c,progress:d,onSelect:e,onContextMenu:f}){return(0,b.jsxs)("button",{type:"button",onClick:()=>e(a.id),onContextMenu:b=>f?.(a.id,b),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,s.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 z=a.i(453161),A=a.i(156298),B=a.i(441852),C=a.i(661661),D=a.i(757061),E=a.i(866718),F=a.i(149350),G=a.i(107742),H=a.i(685698),I=a.i(60084),J=a.i(717143),K=a.i(763747),L=a.i(28386),M=a.i(335732),N=a.i(890728);let O=["planned","in-progress","paused","done"];function P({item:a,items:c,actions:d}){let e=null===a.parent,f=c.filter(b=>null===b.parent&&b.id!==a.parent).sort((a,b)=>a.order-b.order),g=c.filter(b=>b.parent===a.id).length;return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)(M.DropdownMenuItem,{onSelect:()=>d.edit(a.id),children:[(0,b.jsx)(C.Pencil,{})," Edit",(0,b.jsx)(M.DropdownMenuShortcut,{children:(0,N.itemKeyLabel)("edit")})]}),(0,b.jsxs)(M.DropdownMenuSub,{children:[(0,b.jsxs)(M.DropdownMenuSubTrigger,{children:[(0,b.jsx)(u.StatusDot,{status:a.status})," Status",(0,b.jsx)(M.DropdownMenuShortcut,{children:(0,N.itemKeyLabel)("status")})]}),(0,b.jsx)(M.DropdownMenuSubContent,{children:O.map(c=>(0,b.jsxs)(M.DropdownMenuItem,{disabled:c===a.status,onSelect:()=>d.setStatus(a.id,c),children:[(0,b.jsx)(u.StatusDot,{status:c})," ",u.STATUS_LABEL[c]]},c))})]}),!e&&f.length>0&&(0,b.jsxs)(M.DropdownMenuSub,{children:[(0,b.jsxs)(M.DropdownMenuSubTrigger,{children:[(0,b.jsx)(J.FolderInput,{})," Move to horizon"]}),(0,b.jsx)(M.DropdownMenuSubContent,{className:"max-h-72 overflow-y-auto",children:f.map(c=>(0,b.jsxs)(M.DropdownMenuItem,{onSelect:()=>d.move(a.id,c.id),children:[(0,b.jsx)("span",{className:"font-mono text-[11px] text-muted",children:c.id})," ",c.title]},c.id))})]}),e&&(0,b.jsxs)(M.DropdownMenuItem,{onSelect:()=>d.addEpic(a.id),children:[(0,b.jsx)(j.Plus,{})," Add epic"]}),(0,b.jsxs)(M.DropdownMenuItem,{onSelect:()=>d.duplicate(a.id),children:[(0,b.jsx)(I.Copy,{})," Duplicate",(0,b.jsx)(M.DropdownMenuShortcut,{children:(0,N.itemKeyLabel)("duplicate")})]}),(0,b.jsx)(M.DropdownMenuSeparator,{}),!e&&(0,b.jsxs)(M.DropdownMenuItem,{onSelect:()=>d.chat(a.id),children:[(0,b.jsx)(B.MessageSquare,{})," Chat about it",(0,b.jsx)(M.DropdownMenuShortcut,{children:(0,N.itemKeyLabel)("chat")})]}),(0,b.jsxs)(M.DropdownMenuItem,{onSelect:()=>d.openFile(a.file),children:[(0,b.jsx)(h.FileText,{})," Open file"]}),(0,b.jsx)(M.DropdownMenuSeparator,{}),g>0?(0,b.jsxs)(M.DropdownMenuItem,{disabled:!0,className:"flex-col items-start gap-0",children:[(0,b.jsxs)("span",{className:"flex items-center gap-2",children:[(0,b.jsx)(L.Trash2,{})," Delete"]}),(0,b.jsxs)("span",{className:"pl-6 text-[11px]",children:["Move or delete its ",g," epic",1===g?"":"s"," first"]})]}):(0,b.jsxs)(M.DropdownMenuItem,{onSelect:()=>d.remove(a.id),className:"text-danger focus:text-danger",children:[(0,b.jsx)(L.Trash2,{})," Delete",(0,b.jsx)(M.DropdownMenuShortcut,{children:(0,N.itemKeyLabel)("remove")})]})]})}function Q({item:a,items:c,actions:d,className:e,open:f,onOpenChange:g}){return(0,b.jsxs)(M.DropdownMenu,{open:f,onOpenChange:g,children:[(0,b.jsx)(M.DropdownMenuTrigger,{asChild:!0,children:(0,b.jsx)("button",{type:"button","aria-label":`Actions for ${a.id}`,className:(0,s.cn)("grid size-7 place-items-center rounded-md text-muted hover:bg-surface2 hover:text-txt",e),children:(0,b.jsx)(K.MoreHorizontal,{className:"size-4"})})}),(0,b.jsx)(M.DropdownMenuContent,{align:"end",className:"w-52",children:(0,b.jsx)(P,{item:a,items:c,actions:d})})]})}function R({at:a,items:c,actions:d,onClose:e}){let f=a&&c.find(b=>b.id===a.id);return a&&f?(0,b.jsxs)(M.DropdownMenu,{open:!0,onOpenChange:a=>{a||e()},children:[(0,b.jsx)(M.DropdownMenuTrigger,{asChild:!0,children:(0,b.jsx)("span",{"aria-hidden":!0,className:"pointer-events-none fixed size-0",style:{left:a.x,top:a.y}})}),(0,b.jsx)(M.DropdownMenuContent,{align:"start",className:"w-52",children:(0,b.jsx)(P,{item:f,items:c,actions:d})})]},`${a.id}:${a.x}:${a.y}`):null}var S=a.i(813722),T=a.i(192698),U=a.i(787714),V=a.i(269769);let W=["planned","in-progress","paused","done"],X="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",Y="text-xs font-medium text-muted",Z="font-mono text-[10px] uppercase tracking-widest text-muted";function $({item:a,onClose:c,...d}){return(0,b.jsx)(D.Sheet,{open:!!a,onOpenChange:a=>{a||c()},children:(0,b.jsx)(D.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)(_,{item:a,onClose:c,...d},a.id)})})}function _(a){return a.editing?(0,b.jsx)(ab,{...a,onCancel:()=>a.onEditingChange(!1)}):(0,b.jsx)(aa,{...a,onEdit:()=>a.onEditingChange(!0)})}function aa({item:a,items:d,onClose:e,onAddFeature:f,onEditRaw:i,onSelect:k,tasksById:l,progressById:m,onEdit:n,actions:p,onSave:q}){let w=null===a.parent,x=d.find(b=>b.id===a.parent),y=d.filter(b=>b.parent===a.id).sort((a,b)=>a.order-b.order),z=m[a.id],E=(0,r.localToday)(),{chats:I,showAbout:J}=(0,H.useChats)(),K=w?void 0:(0,G.chatFor)(I,{kind:"epic",id:a.id}),L=!w&&0===a.tasks.length&&!K,[M,O]=(0,c.useState)(!1),P=b=>{q(a.id,b).then(a=>{a&&(0,V.toast)(a)})};return(0,N.useItemCommands)(`${a.id} \xb7 ${a.title}`,[{action:"edit",label:"Edit",run:n},{action:"status",label:"Change status…",run:()=>O(!0)},{action:"duplicate",label:"Duplicate",run:()=>p.duplicate(a.id)},...w?[]:[{action:"chat",label:"Chat about it",run:()=>p.chat(a.id)}],...y.length?[]:[{action:"remove",label:"Delete",run:()=>p.remove(a.id)}]]),(0,b.jsxs)("div",{className:"flex min-h-full flex-col",children:[(0,b.jsx)(T.ItemPanelHeader,{className:(0,s.cn)("px-6","in-progress"===a.status&&"bg-[linear-gradient(180deg,rgb(var(--rgb-accent)/0.08),transparent)]"),kicker:(0,b.jsx)(D.SheetDescription,{asChild:!0,children:(0,b.jsxs)("div",{className:"flex min-w-0 items-center gap-1",children:[x&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("button",{type:"button",onClick:()=>k(x.id),className:"truncate hover:text-txt",children:x.title}),(0,b.jsx)(A.ChevronRight,{className:"h-3 w-3 shrink-0"})]}),(0,b.jsxs)("span",{className:"shrink-0",children:[a.id," · ",w?"horizon":"epic"]}),(0,b.jsx)(v.AgentMark,{attach:{kind:"epic",id:a.id}})]})}),title:(0,b.jsx)(D.SheetTitle,{className:"text-xl font-semibold leading-tight text-txt",children:a.title}),menu:(0,b.jsx)(Q,{item:a,items:d,actions:p,open:M,onOpenChange:O}),properties:[{label:"Status",value:(0,b.jsx)(U.InlineSelect,{label:`Status of ${a.id}`,value:a.status,onChange:b=>p.setStatus(a.id,b),options:W.map(a=>({value:a,label:u.STATUS_LABEL[a],node:(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(u.StatusDot,{status:a}),u.STATUS_LABEL[a]]})})),children:(0,b.jsx)(u.StatusPill,{status:a.status})})},{label:"Owner",value:(0,b.jsx)(U.InlineSelect,{label:`Owner of ${a.id}`,value:a.owner??"",onChange:a=>P({owner:a||null}),options:[{value:"human",label:"Human",node:(0,b.jsx)(S.OwnerChip,{owner:"human",className:"text-xs"})},...[...new Set(["ai:claude",...a.owner?.startsWith("ai:")?[a.owner]:[]])].map(a=>({value:a,label:a,node:(0,b.jsx)(S.OwnerChip,{owner:a,className:"text-xs"})})),{value:"",label:"No owner",node:(0,b.jsx)("span",{className:"text-muted",children:"No owner"})}],children:a.owner?(0,b.jsx)(S.OwnerChip,{owner:a.owner,className:"text-xs"}):(0,b.jsx)("span",{className:"text-muted",children:"—"})})},{label:"Due",value:(0,b.jsx)(U.InlineDate,{label:`Due date of ${a.id}`,value:a.due,onChange:a=>P({due:a}),children:a.due?(0,b.jsx)(u.DueChip,{due:a.due,state:(0,r.dueState)(a.due,a.status,E)}):(0,b.jsx)("span",{className:"text-muted",children:"—"})})},{label:w?"Epics":"Tasks",value:(0,b.jsx)("span",{className:"font-mono",children:w?y.length:a.tasks.length})}],children:z&&(0,b.jsxs)("div",{className:"mt-2 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(z.done/z.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:[z.done," of ",z.total,w?"":" tasks"," done"]}),w?(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:`${z.done/z.total*100}%`}})}):(0,b.jsx)(u.SegmentedProgress,{statuses:a.tasks.map(a=>l[a]?.status).filter(a=>!!a&&"cancelled"!==a)})]})]})}),(0,b.jsxs)("div",{className:"flex flex-1 flex-col gap-6 px-6 py-5",children:[!w&&a.tasks.length>0&&(0,b.jsx)(ac,{item:a,tasksById:l,onOpen:i}),w&&(0,b.jsxs)("section",{className:"flex flex-col gap-2",children:[(0,b.jsxs)("p",{className:Z,children:["Epics · ",y.length]}),0===y.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:y.map(a=>{let c=m[a.id];return(0,b.jsx)("li",{children:(0,b.jsxs)("button",{type:"button",onClick:()=>k(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)(u.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,s.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:Z,children:"Brief"}),a.body.trim()?(0,b.jsx)(F.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:[L&&(0,b.jsxs)(o.Button,{size:"sm",onClick:()=>{e(),(0,t.askAgent)(`Break down epic ${a.id} into tasks.`)},className:"bg-accent text-accent-fg hover:bg-accent/90",children:[(0,b.jsx)(g.Bot,{})," Break down with agent"]}),!w&&(0,b.jsxs)(o.Button,{size:"sm",variant:L?"outline":"default",onClick:()=>{e(),J({kind:"epic",id:a.id})},className:(0,s.cn)(!L&&"bg-accent text-accent-fg hover:bg-accent/90"),children:[(0,b.jsx)(B.MessageSquare,{})," ",K?"Open chat":"Chat"]}),w&&(0,b.jsxs)(o.Button,{size:"sm",onClick:()=>f(a.id),className:"bg-accent text-accent-fg hover:bg-accent/90",children:[(0,b.jsx)(j.Plus,{})," Add epic"]}),(0,b.jsxs)(o.Button,{size:"sm",variant:"outline",onClick:n,children:[(0,b.jsx)(C.Pencil,{})," Edit"]}),(0,b.jsxs)(o.Button,{size:"sm",variant:"ghost",onClick:()=>i(a.file),className:"ml-auto text-muted hover:text-txt",children:[(0,b.jsx)(h.FileText,{})," Open file"]})]})]})}function ab({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,p]=(0,c.useState)(a.parent??""),[q,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),F=d.filter(b=>null===b.parent&&b.id!==a.id),G=null===a.parent,H=null!==a.parent&&!F.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),q.trim()!==String(i.order)){let a=Number(q);if(""===q.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 K(){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)(D.SheetDescription,{className:"font-mono text-[11px] text-muted",children:["Editing ",a.id," · ",G?"horizon":"epic"]}),(0,b.jsx)(D.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:Y,children:"Title"}),(0,b.jsx)(E.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:Y,children:"Status"}),(0,b.jsx)("select",{value:l,onChange:a=>m(a.target.value),className:X,children:W.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:Y,children:"Parent"}),(0,b.jsxs)("select",{value:n,onChange:a=>p(a.target.value),disabled:C,title:C?"Items with children must stay on the spine":void 0,className:X,children:[(0,b.jsx)("option",{value:"",children:"— (horizon)"}),H&&(0,b.jsxs)("option",{value:a.parent??"",children:[a.parent," · missing"]}),F.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:Y,children:"Order"}),(0,b.jsx)(E.Input,{type:"number",step:10,value:q,onChange:a=>r(a.target.value),title:G?"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:Y,children:"Due"}),(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)(E.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:Y,children:"Tasks"}),(0,b.jsx)(E.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:Y,children:"Body (markdown)"}),(0,b.jsx)("textarea",{value:w,onChange:a=>x(a.target.value),rows:12,className:`${X} 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)(o.Button,{size:"sm",onClick:J,disabled:A,className:"bg-accent text-accent-fg hover:bg-accent/90",children:"Save"}),(0,b.jsx)(o.Button,{size:"sm",variant:"ghost",onClick:h,disabled:A,className:"text-txt",children:"Cancel"}),(0,b.jsx)(o.Button,{size:"sm",variant:"ghost",onClick:K,disabled:A,className:"ml-auto text-danger hover:text-danger",children:"Delete"})]})]})}function ac({item:a,tasksById:c,onOpen:d}){let e=(0,r.localToday)(),f=q(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:Z,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,s.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,s.cn)("h-2 w-2 shrink-0 rounded-full",u.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,s.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)(u.DueChip,{due:f.due,state:(0,r.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)(v.AgentDot,{attach:{kind:"task",id:f.id}})]}),(0,b.jsx)(ad,{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 ad({taskId:a}){let{chats:c,showAbout:d}=(0,H.useChats)(),e=!!(0,G.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,s.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)(B.MessageSquare,{className:"size-3.5"})})}var ae=a.i(814574);function af({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)(ae.Dialog,{open:a,onOpenChange:m,children:(0,b.jsxs)(ae.DialogContent,{className:"max-w-sm bg-surface border-border text-txt",children:[(0,b.jsx)(ae.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)(E.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)(o.Button,{type:"button",variant:"ghost",size:"sm",onClick:()=>m(!1),children:"Cancel"}),(0,b.jsx)(o.Button,{type:"submit",size:"sm",disabled:k||!g.trim(),className:"bg-accent text-accent-fg hover:bg-accent/90",children:"Create"})]})]})]})})}function ag({open:a,onOpenChange:d}){let[e,f]=(0,c.useState)("");return(0,b.jsx)(ae.Dialog,{open:a,onOpenChange:d,children:(0,b.jsxs)(ae.DialogContent,{className:"max-w-lg bg-surface border-border text-txt",children:[(0,b.jsx)(ae.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,t.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)(o.Button,{type:"button",variant:"ghost",size:"sm",onClick:()=>{f(""),d(!1)},children:"Cancel"}),(0,b.jsx)(o.Button,{type:"submit",size:"sm",disabled:!e.trim(),className:"bg-accent text-accent-fg hover:bg-accent/90",children:"Break down"})]})]})]})})}function ah({open:a,onOpenChange:c,items:d}){return(0,b.jsx)(ae.Dialog,{open:a,onOpenChange:c,children:(0,b.jsxs)(ae.DialogContent,{className:"max-w-lg bg-surface border-border text-txt",children:[(0,b.jsx)(ae.DialogTitle,{className:"text-sm font-semibold text-txt",children:"Break down epics"}),(0,b.jsx)(ai,{items:d,onDone:()=>c(!1)})]})})}function ai({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,H.useChats)().runningCount,j=Math.max(0,G.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,t.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 ${G.MAX_RUNNING_CHATS} agent slots are busy. Stop a chat or wait for one to finish.`:k?`${g.size} selected, but only ${j} of ${G.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 ${G.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)(o.Button,{type:"button",variant:"ghost",size:"sm",onClick:d,children:"Cancel"}),(0,b.jsxs)(o.Button,{type:"submit",size:"sm",disabled:!g.size||k,className:"bg-accent text-accent-fg hover:bg-accent/90",children:["Break down ",g.size||""," epic",1===g.size?"":"s"]})]})]})}async function aj(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 ak(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?z.HORIZON_W:z.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 al(a){let b=new MutationObserver(a);return b.observe(document.documentElement,{attributes:!0,attributeFilter:["class"]}),()=>b.disconnect()}let am={"--xy-background-color":"var(--color-bg)"};function an(){let{rootParam:a,openDoc:e,board:f}=(0,m.useApp)(),{showAbout:p}=(0,H.useChats)(),v=(0,l.useRouter)(),w=(0,l.useSearchParams)(),y="timeline"===w.get("view")?"timeline":"map",A=(0,r.localToday)(),[B,C]=(0,c.useState)([]),[D,E]=(0,c.useState)({}),[F,G]=(0,c.useState)([]),[I,J]=(0,c.useState)(!0),[K,L]=(0,c.useState)(null),[M,N]=(0,c.useState)(null),[O,P]=(0,c.useState)(null),[Q,S]=(0,c.useState)(null),T=w.get("item"),[U,W]=(0,c.useState)(null);T!==U&&(W(T),T&&N(T));let[X,Y]=(0,c.useState)(null),[Z,_]=(0,c.useState)(!1),[aa,ab]=(0,c.useState)(null),[ac,ad]=(0,c.useState)(!1),[ae,ai]=(0,c.useState)(!1),an=(0,c.useRef)(!1),aq=(0,c.useRef)(null),ar=(0,c.useCallback)(a=>{let b=aq.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})},[]),as=(0,c.useRef)(!1),at=(0,c.useRef)(0),au=(0,c.useSyncExternalStore)(al,()=>document.documentElement.classList.contains("dark"),()=>!0),av=(0,c.useCallback)((a,b)=>{C(a),E(b),G(c=>{let d,e;return d=(0,z.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}})})},[]),aw=(0,c.useCallback)(()=>{let b=++at.current;return aj(`/api/roadmap${a}`).then(({data:a,error:c})=>{if(b===at.current){if(J(!1),c){L(c),av([],{}),N(null);return}L(null),Y(a?.generateSource??null),av(a?.items??[],a?.layout??{})}})},[a,av]);(0,c.useEffect)(()=>{aw()},[aw]),(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;an.current?as.current=!0:aw()}catch{}},()=>a.close()},[aw]);let ax=(0,c.useMemo)(()=>{let a=new Map(F.map(a=>[a.id,a])),b=[],c=B.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(ak(`spine-${d.id}`,f,g,!0))}),B)){let c=d.parent&&a.get(d.parent),e=a.get(d.id);c&&e&&"horizon"===c.type&&b.push(ak(`branch-${d.id}`,c,e,!1))}return b},[B,F]),ay=(0,c.useMemo)(()=>Object.fromEntries(Object.values(f??{}).flat().map(a=>[a.id,a])),[f]),az=(0,c.useMemo)(()=>(0,r.roadmapHealth)(B,ay,A),[B,ay,A]),aA=(0,c.useMemo)(()=>{let a=Object.values(ay),b=new Map(B.filter(a=>null===a.parent).sort((a,b)=>a.order-b.order).map((a,b)=>[a.id,b+1]));return F.map(c=>{var d;let e,{item:f}=c.data,g=B.filter(a=>a.parent===f.id),h="feature"===c.type&&"in-progress"===f.status?q(f,a):null;return{...c,data:{...c.data,progress:az.progress[c.id],drift:az.drift.filter(a=>a.id===c.id).map(a=>a.message),dueState:(0,r.dueState)(f.due,f.status,A),..."feature"===c.type&&{...(d=f.tasks,{taskDue:e=(0,r.taskDueSummary)(d,ay,A),taskDueSoon:!!e?.next&&"soon"===(0,r.dueState)(e.next,"planned",A)}),taskStatuses:f.tasks.map(a=>ay[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}}}}})},[F,B,az,A,ay]),aB=(0,c.useCallback)(a=>G(b=>(0,d.applyNodeChanges)(a,b)),[]);async function aC(){_(!0),L(null);let{data:b,error:c}=await aj(`/api/roadmap/generate${a}`,{});if(c){L(c),_(!1);return}let d=Object.fromEntries(Object.entries((0,z.resolvePositions)(b?.items??[],{})).map(([a,b])=>[a,{x:Math.round(b.x),y:Math.round(b.y)}])),{error:e}=await aj(`/api/roadmap/layout${a}`,{positions:d});await aw(),e&&L(e),_(!1)}let aD=Object.values(f??{}).flat().filter(a=>"cancelled"!==a.status).length,aE="roadmap-md"===X?"from ROADMAP.md":"tasks"===X?`from ${aD} tasks, grouped by phase`:"starter horizons: Shipped · Now · Next · Later";async function aF(b){let{error:c}=await aj(`/api/roadmap/create${a}`,{title:b,parent:aa||null});return c||(await aw(),null)}async function aG(b,c){av(B.map(a=>a.id===b?{...a,...c}:a),D);let{data:d,error:e}=await aj(`/api/roadmap/update${a}`,{id:b,patch:c});if(e)return await aw(),e;let f=d?.item;return f?av(B.map(a=>a.id===b?f:a),D):await aw(),null}async function aH(b){let{data:c,error:d}=await aj(`/api/roadmap/delete${a}`,{id:b});return d||(av(B.filter(a=>a.id!==b),D),c&&(0,V.undoToast)(`Deleted ${b}`,async()=>{let{error:b}=await aj(`/api/roadmap/restore${a}`,c);if(b)throw Error(b);await aw()}),null)}let aI=B.find(a=>a.id===M)??null,aJ=a=>{a&&L(a)},aK={edit:a=>{N(a),P(a)},setStatus:(a,b)=>{aG(a,{status:b}).then(aJ)},move:(a,b)=>{aG(a,{parent:b}).then(aJ)},addEpic:a=>{N(null),ab(a)},duplicate:async b=>{let c=B.find(a=>a.id===b);if(!c)return;let{data:d,error:e}=await aj(`/api/roadmap/create${a}`,{title:`${c.title} (copy)`,parent:c.parent,status:"planned",order:c.order+1,due:c.due,body:c.body});if(e)return L(e);await aw(),d?.item&&N(d.item.id)},openFile:a=>e(a),chat:a=>{N(null),p({kind:"epic",id:a})},remove:async a=>{let b=await aH(a);if(b)return L(b);M===a&&N(null)}},aL=(a,b)=>{b.preventDefault(),S({id:a,x:b.clientX,y:b.clientY})},aM=(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(af,{open:null!==aa,heading:aa?`New feature under ${aa}`:"New horizon",onOpenChange:a=>{a||ab(null)},onSubmit:aF}),(0,b.jsx)(ag,{open:ac,onOpenChange:ad}),(0,b.jsx)(ah,{open:ae,onOpenChange:ai,items:B})]});return I?(0,b.jsx)("div",{className:"flex-1 flex items-center justify-center text-sm text-muted",children:"Loading…"}):0===B.length?(0,b.jsxs)("div",{className:"flex-1 p-6",children:[K&&(0,b.jsx)("p",{className:"mb-4 text-sm text-danger",children:K}),(0,b.jsx)(n.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)(o.Button,{size:"sm",onClick:aC,disabled:Z,className:"bg-accent text-accent-fg hover:bg-accent/90",children:[(0,b.jsx)(k.Sparkles,{})," ",Z?"Generating…":"Generate roadmap"]}),(0,b.jsxs)(o.Button,{size:"sm",variant:"outline",onClick:()=>(0,t.askAgent)("Plan a roadmap for this project."),disabled:Z,children:[(0,b.jsx)(g.Bot,{})," Plan with agent"]}),(0,b.jsxs)(o.Button,{size:"sm",variant:"outline",onClick:()=>ad(!0),disabled:Z,children:[(0,b.jsx)(h.FileText,{})," Plan from spec"]}),(0,b.jsxs)(o.Button,{size:"sm",variant:"outline",onClick:()=>ab(""),disabled:Z,children:[(0,b.jsx)(j.Plus,{})," Create first horizon"]})]}),(0,b.jsxs)("p",{className:"text-xs text-muted",children:["Generate ",aE,". Existing files are not modified."]})]}),aM]}):(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(w.toString()),"map"===a?b.delete("view"):b.set("view",a),c=b.toString(),void v.replace(c?`/roadmap?${c}`:"/roadmap")},className:(0,s.cn)("rounded-sm px-3 py-1 capitalize",y===a?"bg-surface2 text-txt":"text-muted hover:text-txt"),children:a},a))}),(0,b.jsx)(ao,{items:B,tasksById:ay}),(0,b.jsxs)("div",{className:"ml-auto flex items-center gap-2",children:[K&&(0,b.jsx)("p",{className:"text-xs text-danger",children:K}),az.drift.length>0&&(0,b.jsx)(ap,{drift:az.drift,onSelect:N,onApply:a=>a.suggestedStatus&&aG(a.id,{status:a.suggestedStatus}).then(a=>{a&&L(a)})}),(0,b.jsxs)(o.Button,{size:"sm",variant:"outline",onClick:()=>ad(!0),children:[(0,b.jsx)(h.FileText,{})," Plan from spec"]}),B.some(a=>null!==a.parent&&"done"!==a.status)&&(0,b.jsxs)(o.Button,{size:"sm",variant:"outline",onClick:()=>ai(!0),children:[(0,b.jsx)(i.ListTree,{})," Break down epics…"]}),(0,b.jsxs)(o.Button,{size:"sm",onClick:()=>ab(""),className:"bg-accent text-accent-fg hover:bg-accent/90",children:[(0,b.jsx)(j.Plus,{})," Horizon"]})]})]}),"map"===y?(0,b.jsx)("div",{ref:aq,className:"relative flex-1 min-h-0",children:(0,b.jsxs)(d.ReactFlow,{nodes:aA,edges:ax,nodeTypes:u.nodeTypes,onNodesChange:aB,onNodeClick:(a,b)=>N(b.id),onNodeContextMenu:(a,b)=>aL(b.id,a),onNodeDragStart:()=>{an.current=!0},onNodeDragStop:(b,c,d)=>{let e;return an.current=!1,e=Object.fromEntries(d.map(a=>[a.id,{x:Math.round(a.position.x),y:Math.round(a.position.y)}])),void(av(B,{...D,...e}),aj(`/api/roadmap/layout${a}`,{positions:e}).then(({error:a})=>{a&&L(a),as.current&&(as.current=!1,aw())}))},nodesConnectable:!1,deleteKeyCode:null,colorMode:au?"dark":"light",onInit:ar,minZoom:.2,style:am,children:[(0,b.jsx)(d.Background,{variant:d.BackgroundVariant.Dots,gap:20,size:1}),(0,b.jsx)(d.Controls,{showInteractive:!1})]})}):(0,b.jsx)(x,{items:B,today:A,onSelect:N,onItemContextMenu:aL,progressById:az.progress}),(0,b.jsx)($,{item:aI,items:B,onClose:()=>N(null),editing:!!aI&&O===aI.id,onEditingChange:a=>P(a?M:null),actions:aK,onSave:aG,onDelete:aH,onAddFeature:a=>{N(null),ab(a)},onEditRaw:a=>{e(a)},tasksById:ay,progressById:az.progress,onSelect:N}),(0,b.jsx)(R,{at:Q,items:B,actions:aK,onClose:()=>S(null)}),aM]})}function ao({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","paused","done","planned"].filter(a=>"paused"!==a||e(a)>0).map(a=>(0,b.jsxs)("span",{className:"flex items-center gap-1.5",children:[(0,b.jsx)(u.StatusDot,{status:a}),(0,b.jsx)("span",{className:(0,s.cn)("tabular-nums","in-progress"===a&&e(a)>0?"text-accent":"text-txt"),children:e(a)}),u.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 ap({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)(an,{})})})}],690793)}];
4
+
5
+ //# sourceMappingURL=src_app_%28app%29_roadmap_page_tsx_0vcq3jr._.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/app/%28app%29/roadmap/page.tsx","../../../../src/components/roadmap/RoadmapTab.tsx","../../../../src/lib/work-queue.ts","../../../../src/components/roadmap/RoadmapTimeline.tsx","../../../../src/components/roadmap/RoadmapItemSheet.tsx","../../../../src/components/roadmap/ItemActionsMenu.tsx","../../../../src/components/roadmap/NewItemDialog.tsx","../../../../src/components/roadmap/PlanFromSpecDialog.tsx","../../../../src/components/roadmap/BreakdownEpicsDialog.tsx"],"sourcesContent":["\"use client\"\n\nimport { Suspense } from \"react\"\nimport { RoadmapTab } from \"@/components/roadmap/RoadmapTab\"\n\nexport default function RoadmapPage() {\n // main has no fixed height; the canvas needs one (viewport minus the h-12 AppHeader)\n return (\n <div className=\"flex flex-col h-[calc(100svh-3rem)]\">\n <Suspense>\n <RoadmapTab />\n </Suspense>\n </div>\n )\n}\n","\"use client\"\n\nimport { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from \"react\"\nimport {\n Background,\n BackgroundVariant,\n Controls,\n Position,\n ReactFlow,\n applyNodeChanges,\n type Edge,\n type NodeChange,\n type ReactFlowInstance,\n} from \"@xyflow/react\"\nimport \"@xyflow/react/dist/style.css\"\n\nconst MIN_INITIAL_ZOOM = 0.75\nconst VIEWPORT_PAD = 40\nimport { AlertTriangle, Bot, FileText, ListTree, Plus, Sparkles } from \"lucide-react\"\nimport { useRouter, useSearchParams } from \"next/navigation\"\nimport { useApp } from \"@/context/AppContext\"\nimport { EmptyState } from \"@/components/shared/EmptyState\"\nimport { Button } from \"@/components/ui/button\"\nimport type { RoadmapItem, RoadmapLayout, RoadmapSource, Task, TaskStatus, UpdateRoadmapItemPatch } from \"@/types\"\nimport { pickNextTask } from \"@/lib/work-queue\"\nimport { dueState, localToday, roadmapHealth, taskDueSummary, type RoadmapDrift, type TaskInfo } from \"@/lib/roadmap-health\"\nimport { cn } from \"@/lib/utils\"\nimport { askAgent } from \"@/lib/ask-agent\"\nimport { RoadmapTimeline } from \"./RoadmapTimeline\"\nimport { FEATURE_W, HORIZON_W, resolvePositions } from \"./layout\"\nimport { STATUS_LABEL, StatusDot, nodeTypes, type RoadmapNode } from \"./RoadmapNodes\"\nimport { RoadmapItemSheet } from \"./RoadmapItemSheet\"\nimport { NewItemDialog } from \"./NewItemDialog\"\nimport { PlanFromSpecDialog } from \"./PlanFromSpecDialog\"\nimport { BreakdownEpicsDialog } from \"./BreakdownEpicsDialog\"\nimport { ItemContextMenu, type ContextMenuState, type ItemActions } from \"./ItemActionsMenu\"\nimport { useChats } from \"@/context/ChatContext\"\nimport { undoToast } from \"@/components/ui/toast\"\n\ntype ApiResult<T> = { data?: T; error?: string }\n\nasync function api<T>(url: string, body?: unknown): Promise<ApiResult<T>> {\n try {\n const res = await fetch(\n url,\n body === undefined\n ? undefined\n : { method: \"POST\", headers: { \"Content-Type\": \"application/json\" }, body: JSON.stringify(body) },\n )\n const json = await res.json().catch(() => null)\n if (!res.ok) return { error: json?.error ?? `Request failed (${res.status})` }\n return { data: json as T }\n } catch {\n return { error: \"Could not reach the server\" }\n }\n}\n\nfunction taskDueFields(taskIds: string[], tasks: Record<string, TaskInfo>, today: string) {\n const taskDue = taskDueSummary(taskIds, tasks, today)\n return { taskDue, taskDueSoon: !!taskDue?.next && dueState(taskDue.next, \"planned\", today) === \"soon\" }\n}\n\nfunction buildNodes(items: RoadmapItem[], layout: RoadmapLayout, prev: RoadmapNode[]): RoadmapNode[] {\n const pos = resolvePositions(items, layout)\n const prevById = new Map(prev.map((n) => [n.id, n]))\n return items.map((item) => {\n const old = prevById.get(item.id)\n return {\n id: item.id,\n type: item.parent === null ? \"horizon\" : \"feature\",\n position: pos[item.id] ?? { x: 0, y: 0 },\n data: { item },\n // keep React Flow's measurements/selection across rebuilds\n measured: old?.measured,\n selected: old?.selected,\n }\n })\n}\n\n/** Pick the handle sides that face each other. Branches always leave a horizon sideways, like roadmap.sh. */\nfunction sides(a: RoadmapNode, b: RoadmapNode, horizontal: boolean): [Position, Position] {\n const center = (n: RoadmapNode) => ({\n x: n.position.x + (n.measured?.width ?? (n.type === \"horizon\" ? HORIZON_W : FEATURE_W)) / 2,\n y: n.position.y + (n.measured?.height ?? 48) / 2,\n })\n const ca = center(a)\n const cb = center(b)\n const dx = cb.x - ca.x\n const dy = cb.y - ca.y\n if (horizontal || Math.abs(dx) > Math.abs(dy)) return dx > 0 ? [Position.Right, Position.Left] : [Position.Left, Position.Right]\n return dy > 0 ? [Position.Bottom, Position.Top] : [Position.Top, Position.Bottom]\n}\n\n/** Spine: solid up to the current horizon, dashed after. Branch: follows the epic (live = animated accent). */\nfunction edgeStyle(a: RoadmapNode, b: RoadmapNode, spine: boolean): Pick<Edge, \"style\" | \"animated\"> {\n if (spine) {\n return a.data.item.status === \"done\"\n ? { style: { stroke: \"var(--color-accent)\", strokeWidth: 3 } }\n : { style: { stroke: \"var(--color-border2)\", strokeWidth: 3, strokeDasharray: \"6 6\" } }\n }\n const status = b.data.item.status\n if (status === \"in-progress\") return { animated: true, style: { stroke: \"var(--color-accent)\", strokeWidth: 2 } }\n if (status === \"done\") return { style: { stroke: \"var(--color-border2)\", strokeWidth: 1.5 } }\n return { style: { stroke: \"var(--color-border2)\", strokeWidth: 1.5, strokeDasharray: \"2 5\", strokeLinecap: \"round\" } }\n}\n\nfunction edge(id: string, a: RoadmapNode, b: RoadmapNode, spine: boolean): Edge {\n const [s, t] = sides(a, b, !spine)\n return {\n id,\n source: a.id,\n target: b.id,\n sourceHandle: s,\n targetHandle: `${t}-t`,\n type: spine ? \"straight\" : \"default\",\n selectable: false,\n ...edgeStyle(a, b, spine),\n }\n}\n\nfunction subscribeTheme(cb: () => void) {\n const mo = new MutationObserver(cb)\n mo.observe(document.documentElement, { attributes: true, attributeFilter: [\"class\"] })\n return () => mo.disconnect()\n}\n\nconst FLOW_STYLE = { \"--xy-background-color\": \"var(--color-bg)\" } as React.CSSProperties\n\nexport function RoadmapTab() {\n const { rootParam, openDoc, board } = useApp()\n const { showAbout } = useChats()\n const router = useRouter()\n const searchParams = useSearchParams()\n const view = searchParams.get(\"view\") === \"timeline\" ? \"timeline\" : \"map\"\n const setView = (v: \"map\" | \"timeline\") => {\n const params = new URLSearchParams(searchParams.toString())\n if (v === \"map\") params.delete(\"view\")\n else params.set(\"view\", v)\n const qs = params.toString()\n router.replace(qs ? `/roadmap?${qs}` : \"/roadmap\")\n }\n const today = localToday()\n const [items, setItems] = useState<RoadmapItem[]>([])\n const [layout, setLayout] = useState<RoadmapLayout>({})\n const [nodes, setNodes] = useState<RoadmapNode[]>([])\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n const [selectedId, setSelectedId] = useState<string | null>(null)\n // the sheet shows the edit form while this matches the selected item\n const [editingId, setEditingId] = useState<string | null>(null)\n const [menuAt, setMenuAt] = useState<ContextMenuState>(null)\n // ?item=R004 (links from a chat) opens that item's sheet; adjusted during render so a new link re-opens it\n const itemParam = searchParams.get(\"item\")\n const [seenItemParam, setSeenItemParam] = useState<string | null>(null)\n if (itemParam !== seenItemParam) {\n setSeenItemParam(itemParam)\n if (itemParam) setSelectedId(itemParam)\n }\n const [generateSource, setGenerateSource] = useState<RoadmapSource | null>(null)\n const [generating, setGenerating] = useState(false)\n // null = closed; \"\" = new horizon; \"R001\" = new feature under R001\n const [createParent, setCreateParent] = useState<string | null>(null)\n const [specOpen, setSpecOpen] = useState(false)\n const [breakdownOpen, setBreakdownOpen] = useState(false)\n const draggingRef = useRef(false)\n const containerRef = useRef<HTMLDivElement>(null)\n\n // Like roadmap.sh: open at readable zoom, centered horizontally, from the top of the map.\n // fitView on a large roadmap shrinks text to unreadable sizes.\n const showTop = useCallback((rf: ReactFlowInstance<RoadmapNode>) => {\n const width = containerRef.current?.clientWidth ?? 0\n const bounds = rf.getNodesBounds(rf.getNodes())\n if (!width || !bounds.width) return\n const zoom = Math.min(1, Math.max(MIN_INITIAL_ZOOM, (width - VIEWPORT_PAD * 2) / bounds.width))\n rf.setViewport({ x: width / 2 - (bounds.x + bounds.width / 2) * zoom, y: VIEWPORT_PAD - bounds.y * zoom, zoom })\n }, [])\n // a roadmap_updated that arrived mid-drag; reloaded once the drag's layout POST lands\n const pendingReloadRef = useRef(false)\n // only the latest load() may apply its response (guards project switches / overlapping SSE reloads)\n const loadSeqRef = useRef(0)\n\n const isDark = useSyncExternalStore(\n subscribeTheme,\n () => document.documentElement.classList.contains(\"dark\"),\n () => true,\n )\n\n const applyData = useCallback((nextItems: RoadmapItem[], nextLayout: RoadmapLayout) => {\n setItems(nextItems)\n setLayout(nextLayout)\n setNodes((prev) => buildNodes(nextItems, nextLayout, prev))\n }, [])\n\n const load = useCallback(() => {\n const seq = ++loadSeqRef.current\n type ListResponse = { items: RoadmapItem[]; layout: RoadmapLayout; generateSource?: RoadmapSource }\n return api<ListResponse>(`/api/roadmap${rootParam}`).then(({ data, error: err }) => {\n if (seq !== loadSeqRef.current) return\n setLoading(false)\n if (err) {\n setError(err)\n // never leave another project's (or stale) items on screen, editable against this root\n applyData([], {})\n setSelectedId(null)\n return\n }\n setError(null)\n setGenerateSource(data?.generateSource ?? null)\n applyData(data?.items ?? [], data?.layout ?? {})\n })\n }, [rootParam, applyData])\n\n useEffect(() => {\n load()\n }, [load])\n\n useEffect(() => {\n const es = new EventSource(\"/api/events\")\n es.onmessage = (e) => {\n try {\n const msg = JSON.parse(e.data)\n if (msg.type !== \"roadmap_updated\") return\n if (draggingRef.current) pendingReloadRef.current = true\n else load()\n } catch {\n // non-JSON keepalive; ignore\n }\n }\n return () => es.close()\n }, [load])\n\n const edges = useMemo(() => {\n const byId = new Map(nodes.map((n) => [n.id, n]))\n const out: Edge[] = []\n const horizons = items.filter((i) => i.parent === null).sort((a, b) => a.order - b.order)\n horizons.forEach((h, i) => {\n const a = byId.get(h.id)\n const next = horizons[i + 1] && byId.get(horizons[i + 1].id)\n if (a && next) out.push(edge(`spine-${h.id}`, a, next, true))\n })\n for (const item of items) {\n const p = item.parent && byId.get(item.parent)\n const c = byId.get(item.id)\n if (p && c && p.type === \"horizon\") out.push(edge(`branch-${item.id}`, p, c, false))\n }\n return out\n }, [items, nodes])\n\n // board is refreshed by AppContext on task_updated, so progress/drift follow task moves live\n const tasksById = useMemo<Record<string, Task>>(\n () => Object.fromEntries(Object.values(board ?? {}).flat().map((t) => [t.id, t])),\n [board],\n )\n const health = useMemo(() => roadmapHealth(items, tasksById, today), [items, tasksById, today])\n\n const shownNodes = useMemo(() => {\n const allTasks = Object.values(tasksById)\n // chapters number real horizons only; orphans on the spine get none\n const chapters = new Map(items.filter((i) => i.parent === null).sort((a, b) => a.order - b.order).map((h, i) => [h.id, i + 1]))\n return nodes.map((n) => {\n const { item } = n.data\n const kids = items.filter((i) => i.parent === item.id)\n const next = n.type === \"feature\" && item.status === \"in-progress\" ? pickNextTask(item, allTasks) : null\n return {\n ...n,\n data: {\n ...n.data,\n progress: health.progress[n.id],\n drift: health.drift.filter((d) => d.id === n.id).map((d) => d.message),\n dueState: dueState(item.due, item.status, today),\n ...(n.type === \"feature\" && {\n ...taskDueFields(item.tasks, tasksById, today),\n taskStatuses: item.tasks.map((id) => tasksById[id]?.status).filter((s): s is TaskStatus => !!s && s !== \"cancelled\"),\n nextTaskId: next?.kind === \"ready\" ? next.taskId : null,\n }),\n ...(n.type === \"horizon\" && {\n chapter: chapters.get(item.id),\n epics: { done: kids.filter((k) => k.status === \"done\").length, total: kids.length },\n }),\n },\n }\n })\n }, [nodes, items, health, today, tasksById])\n\n const onNodesChange = useCallback(\n (changes: NodeChange<RoadmapNode>[]) => setNodes((nds) => applyNodeChanges(changes, nds)),\n [],\n )\n\n function onDragStop(dragged: RoadmapNode[]) {\n draggingRef.current = false\n const positions: RoadmapLayout = Object.fromEntries(\n dragged.map((n) => [n.id, { x: Math.round(n.position.x), y: Math.round(n.position.y) }]),\n )\n // children without a saved position follow their horizon immediately\n applyData(items, { ...layout, ...positions })\n api(`/api/roadmap/layout${rootParam}`, { positions }).then(({ error: err }) => {\n if (err) setError(err)\n if (pendingReloadRef.current) {\n pendingReloadRef.current = false\n load()\n }\n })\n }\n\n async function generate() {\n setGenerating(true)\n setError(null)\n const { data, error: err } = await api<{ items: RoadmapItem[] }>(`/api/roadmap/generate${rootParam}`, {})\n if (err) {\n setError(err)\n setGenerating(false)\n return\n }\n // freeze the generated arrangement so later additions don't shift auto-placed horizons\n const positions: RoadmapLayout = Object.fromEntries(\n Object.entries(resolvePositions(data?.items ?? [], {})).map(([id, p]) => [id, { x: Math.round(p.x), y: Math.round(p.y) }]),\n )\n const { error: layoutErr } = await api(`/api/roadmap/layout${rootParam}`, { positions })\n await load()\n if (layoutErr) setError(layoutErr)\n setGenerating(false)\n }\n\n const openTaskCount = Object.values(board ?? {}).flat().filter((t) => t.status !== \"cancelled\").length\n const sourceLabel =\n generateSource === \"roadmap-md\" ? \"from ROADMAP.md\"\n : generateSource === \"tasks\" ? `from ${openTaskCount} tasks, grouped by phase`\n : \"starter horizons: Shipped · Now · Next · Later\"\n\n async function createItem(title: string): Promise<string | null> {\n const { error: err } = await api(`/api/roadmap/create${rootParam}`, {\n title,\n parent: createParent || null,\n })\n if (err) return err\n await load()\n return null\n }\n\n async function saveItem(id: string, patch: UpdateRoadmapItemPatch): Promise<string | null> {\n // Optimistic: the patch's fields are the item's fields; a failed write reloads the files\n applyData(items.map((i) => (i.id === id ? { ...i, ...patch } as RoadmapItem : i)), layout)\n const { data, error: err } = await api<{ item: RoadmapItem }>(`/api/roadmap/update${rootParam}`, { id, patch })\n if (err) { await load(); return err }\n const updated = data?.item\n if (updated) applyData(items.map((i) => (i.id === id ? updated : i)), layout)\n else await load()\n return null\n }\n\n async function deleteItem(id: string): Promise<string | null> {\n type Deleted = { file: string; raw: string; position: { x: number; y: number } | null }\n const { data, error: err } = await api<Deleted>(`/api/roadmap/delete${rootParam}`, { id })\n if (err) return err\n applyData(items.filter((i) => i.id !== id), layout)\n if (data) {\n undoToast(`Deleted ${id}`, async () => {\n const { error: undoErr } = await api(`/api/roadmap/restore${rootParam}`, data)\n if (undoErr) throw new Error(undoErr)\n await load()\n })\n }\n return null\n }\n\n const selected = items.find((i) => i.id === selectedId) ?? null\n\n const report = (err: string | null) => { if (err) setError(err) }\n const actions: ItemActions = {\n edit: (id) => { setSelectedId(id); setEditingId(id) },\n setStatus: (id, status) => { saveItem(id, { status }).then(report) },\n move: (id, horizonId) => { saveItem(id, { parent: horizonId }).then(report) },\n addEpic: (horizonId) => { setSelectedId(null); setCreateParent(horizonId) },\n duplicate: async (id) => {\n const src = items.find((i) => i.id === id)\n if (!src) return\n const { data, error: err } = await api<{ item: RoadmapItem }>(`/api/roadmap/create${rootParam}`, {\n title: `${src.title} (copy)`,\n parent: src.parent,\n status: \"planned\",\n order: src.order + 1,\n due: src.due,\n body: src.body,\n })\n if (err) return setError(err)\n await load()\n if (data?.item) setSelectedId(data.item.id)\n },\n openFile: (file) => openDoc(file),\n chat: (id) => { setSelectedId(null); showAbout({ kind: \"epic\", id }) },\n remove: async (id) => {\n const err = await deleteItem(id)\n if (err) return setError(err)\n if (selectedId === id) setSelectedId(null)\n },\n }\n const openMenu = (id: string, e: React.MouseEvent) => {\n e.preventDefault()\n setMenuAt({ id, x: e.clientX, y: e.clientY })\n }\n\n const dialog = (\n <>\n <NewItemDialog\n open={createParent !== null}\n heading={createParent ? `New feature under ${createParent}` : \"New horizon\"}\n onOpenChange={(v) => { if (!v) setCreateParent(null) }}\n onSubmit={createItem}\n />\n <PlanFromSpecDialog open={specOpen} onOpenChange={setSpecOpen} />\n <BreakdownEpicsDialog open={breakdownOpen} onOpenChange={setBreakdownOpen} items={items} />\n </>\n )\n\n if (loading) {\n return <div className=\"flex-1 flex items-center justify-center text-sm text-muted\">Loading…</div>\n }\n\n if (items.length === 0) {\n return (\n <div className=\"flex-1 p-6\">\n {error && <p className=\"mb-4 text-sm text-danger\">{error}</p>}\n <EmptyState icon=\"🗺️\" message=\"No roadmap yet\" subMessage=\"Items live in plans/roadmap/R*.md\" bordered />\n <div className=\"mt-4 flex flex-col items-center gap-2\">\n <div className=\"flex gap-2\">\n <Button size=\"sm\" onClick={generate} disabled={generating} className=\"bg-accent text-accent-fg hover:bg-accent/90\">\n <Sparkles /> {generating ? \"Generating…\" : \"Generate roadmap\"}\n </Button>\n <Button size=\"sm\" variant=\"outline\" onClick={() => askAgent(\"Plan a roadmap for this project.\")} disabled={generating}>\n <Bot /> Plan with agent\n </Button>\n <Button size=\"sm\" variant=\"outline\" onClick={() => setSpecOpen(true)} disabled={generating}>\n <FileText /> Plan from spec\n </Button>\n <Button size=\"sm\" variant=\"outline\" onClick={() => setCreateParent(\"\")} disabled={generating}>\n <Plus /> Create first horizon\n </Button>\n </div>\n <p className=\"text-xs text-muted\">Generate {sourceLabel}. Existing files are not modified.</p>\n </div>\n {dialog}\n </div>\n )\n }\n\n return (\n <div className=\"relative flex flex-1 min-h-0 flex-col\">\n <div className=\"flex shrink-0 items-center gap-4 border-b border-border px-3 py-2\">\n <div className=\"flex rounded-md border border-border p-0.5 text-xs\">\n {([\"map\", \"timeline\"] as const).map((v) => (\n <button\n key={v}\n type=\"button\"\n onClick={() => setView(v)}\n className={cn(\n \"rounded-sm px-3 py-1 capitalize\",\n view === v ? \"bg-surface2 text-txt\" : \"text-muted hover:text-txt\",\n )}\n >\n {v}\n </button>\n ))}\n </div>\n <RoadmapStats items={items} tasksById={tasksById} />\n <div className=\"ml-auto flex items-center gap-2\">\n {error && <p className=\"text-xs text-danger\">{error}</p>}\n {health.drift.length > 0 && (\n <AttentionMenu\n drift={health.drift}\n onSelect={setSelectedId}\n onApply={(d) => d.suggestedStatus && saveItem(d.id, { status: d.suggestedStatus }).then((err) => { if (err) setError(err) })}\n />\n )}\n <Button size=\"sm\" variant=\"outline\" onClick={() => setSpecOpen(true)}>\n <FileText /> Plan from spec\n </Button>\n {items.some((i) => i.parent !== null && i.status !== \"done\") && (\n <Button size=\"sm\" variant=\"outline\" onClick={() => setBreakdownOpen(true)}>\n <ListTree /> Break down epics…\n </Button>\n )}\n <Button size=\"sm\" onClick={() => setCreateParent(\"\")} className=\"bg-accent text-accent-fg hover:bg-accent/90\">\n <Plus /> Horizon\n </Button>\n </div>\n </div>\n\n {view === \"map\" ? (\n <div ref={containerRef} className=\"relative flex-1 min-h-0\">\n <ReactFlow<RoadmapNode>\n nodes={shownNodes}\n edges={edges}\n nodeTypes={nodeTypes}\n onNodesChange={onNodesChange}\n onNodeClick={(_, n) => setSelectedId(n.id)}\n onNodeContextMenu={(e, n) => openMenu(n.id, e)}\n onNodeDragStart={() => { draggingRef.current = true }}\n onNodeDragStop={(_, __, dragged) => onDragStop(dragged)}\n nodesConnectable={false}\n deleteKeyCode={null}\n colorMode={isDark ? \"dark\" : \"light\"}\n onInit={showTop}\n minZoom={0.2}\n style={FLOW_STYLE}\n >\n <Background variant={BackgroundVariant.Dots} gap={20} size={1} />\n <Controls showInteractive={false} />\n </ReactFlow>\n </div>\n ) : (\n <RoadmapTimeline items={items} today={today} onSelect={setSelectedId} onItemContextMenu={openMenu} progressById={health.progress} />\n )}\n\n <RoadmapItemSheet\n item={selected}\n items={items}\n onClose={() => setSelectedId(null)}\n editing={!!selected && editingId === selected.id}\n onEditingChange={(v) => setEditingId(v ? selectedId : null)}\n actions={actions}\n onSave={saveItem}\n onDelete={deleteItem}\n onAddFeature={(parentId) => { setSelectedId(null); setCreateParent(parentId) }}\n onEditRaw={(file) => { openDoc(file) }}\n tasksById={tasksById}\n progressById={health.progress}\n onSelect={setSelectedId}\n />\n <ItemContextMenu at={menuAt} items={items} actions={actions} onClose={() => setMenuAt(null)} />\n {dialog}\n </div>\n )\n}\n\n/** Epic counts by status double as the legend; tasks = every task linked to an epic. */\nfunction RoadmapStats({ items, tasksById }: { items: RoadmapItem[]; tasksById: Record<string, Task> }) {\n const epics = items.filter((i) => i.parent !== null)\n const count = (st: RoadmapItem[\"status\"]) => epics.filter((e) => e.status === st).length\n const linked = [...new Set(epics.flatMap((e) => e.tasks))].map((id) => tasksById[id]).filter((t) => t && t.status !== \"cancelled\")\n const done = linked.filter((t) => t.status === \"done\").length\n return (\n <div className=\"hidden items-center gap-4 font-mono text-[11px] text-muted md:flex\">\n {([\"in-progress\", \"paused\", \"done\", \"planned\"] as const).filter((st) => st !== \"paused\" || count(st) > 0).map((st) => (\n <span key={st} className=\"flex items-center gap-1.5\">\n <StatusDot status={st} />\n <span className={cn(\"tabular-nums\", st === \"in-progress\" && count(st) > 0 ? \"text-accent\" : \"text-txt\")}>{count(st)}</span>\n {STATUS_LABEL[st].toLowerCase()}\n </span>\n ))}\n {linked.length > 0 && (\n <span className=\"flex items-center gap-2 border-l border-border pl-4\">\n <span className=\"relative h-1 w-20 overflow-hidden rounded-full bg-border\">\n <span className=\"absolute inset-y-0 left-0 rounded-full bg-teal\" style={{ width: `${(done / linked.length) * 100}%` }} />\n </span>\n <span><span className=\"tabular-nums text-txt\">{done}/{linked.length}</span> tasks</span>\n </span>\n )}\n </div>\n )\n}\n\n/** Amber pill with the drift count; opens the list (closed by default so it never covers the map). */\nfunction AttentionMenu({ drift, onSelect, onApply }: {\n drift: RoadmapDrift[]\n onSelect: (id: string) => void\n onApply: (d: RoadmapDrift) => void\n}) {\n return (\n <details className=\"group relative\">\n <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\">\n <AlertTriangle className=\"h-3.5 w-3.5 text-amber\" /> {drift.length} need attention\n </summary>\n <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\">\n {drift.map((d) => (\n <li key={`${d.id}-${d.kind}`} className=\"flex items-start gap-2 border-b border-border px-3 py-2.5 last:border-0\">\n <span className=\"mt-1 h-1.5 w-1.5 shrink-0 rounded-full bg-amber\" />\n <button type=\"button\" onClick={() => onSelect(d.id)} className=\"flex-1 text-left leading-relaxed text-muted hover:text-txt\">\n {d.message}\n </button>\n {d.suggestedStatus && (\n <button\n type=\"button\"\n onClick={() => onApply(d)}\n 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\"\n title={`Set status to ${d.suggestedStatus}`}\n >\n → {d.suggestedStatus}\n </button>\n )}\n </li>\n ))}\n </ul>\n </details>\n )\n}\n","// Pure next-task picker for an epic's work queue (no fs). Self-check: node src/lib/work-queue.check.mts\nimport type { RoadmapItem, Task } from './core'\n\nexport type QueueTask = Pick<Task, 'id' | 'status' | 'dependsOn'>\nexport type QueueResult =\n | { kind: 'ready'; taskId: string }\n | { kind: 'finished' }\n // needsHuman: no remaining task can move without someone unblocking or creating a task\n | { kind: 'waiting'; waiting: { taskId: string; reason: string }[]; needsHuman: boolean }\n\n/** Every `T\\d+` in a free-text \"Depends on\" line: \"T008, T009 (x)\" → [\"T008\",\"T009\"]. */\nexport function depIds(dependsOn: string): string[] {\n return [...new Set((dependsOn.match(/\\bT\\d+\\b/gi) ?? []).map(d => d.toUpperCase()))]\n}\n\nconst settled = (s: Task['status']) => s === 'done' || s === 'cancelled'\n\nexport function pickNextTask(epic: RoadmapItem, tasks: QueueTask[]): QueueResult {\n const byId = new Map(tasks.map(t => [t.id, t]))\n const linked = epic.tasks.map(id => byId.get(id)).filter((t): t is QueueTask => !!t)\n const unmet = (t: QueueTask) => depIds(t.dependsOn).filter(d => {\n const dep = byId.get(d)\n return !dep || !settled(dep.status)\n })\n\n for (const t of linked) {\n if (t.status === 'todo' && !unmet(t).length) return { kind: 'ready', taskId: t.id }\n }\n if (linked.every(t => settled(t.status))) return { kind: 'finished' }\n\n // Can this task still move without a human? in-progress/settled yes; blocked/paused/review/missing no\n // (review waits for someone to approve or send it back, R043);\n // todo only if it's in this epic (the queue never hands out outside tasks) and every unmet dep can.\n // Cycles count as stuck.\n const inEpic = new Set(epic.tasks)\n const memo = new Map<string, boolean>()\n const canMove = (id: string): boolean => {\n if (memo.has(id)) return memo.get(id) ?? false\n memo.set(id, false)\n const t = byId.get(id)\n const ok = !!t && t.status !== 'blocked' && t.status !== 'paused' && t.status !== 'review' && (t.status !== 'todo' || (inEpic.has(id) && unmet(t).every(canMove)))\n memo.set(id, ok)\n return ok\n }\n\n const waiting: { taskId: string; reason: string }[] = []\n for (const id of epic.tasks) {\n const t = byId.get(id)\n if (!t) waiting.push({ taskId: id, reason: `${id} has no task file` })\n else if (t.status === 'in-progress') waiting.push({ taskId: id, reason: `${id} is in progress (claimed)` })\n else if (t.status === 'blocked') waiting.push({ taskId: id, reason: `${id} is blocked` })\n else if (t.status === 'paused') waiting.push({ taskId: id, reason: `${id} is paused — needs a human to resume it` })\n else if (t.status === 'review') waiting.push({ taskId: id, reason: `${id} in review — needs a human` })\n else if (t.status === 'todo') {\n const deps = unmet(t).map(d => `${d} (${byId.get(d)?.status ?? 'missing'})`)\n waiting.push({ taskId: id, reason: `${id} waits on ${deps.join(', ')}` })\n }\n }\n return { kind: 'waiting', waiting, needsHuman: waiting.every(w => !canMove(w.taskId)) }\n}\n","\"use client\"\n\nimport { useEffect, useMemo, useRef } from \"react\"\nimport { cn } from \"@/lib/utils\"\nimport type { RoadmapItem } from \"@/types\"\nimport type { RoadmapProgress } from \"@/lib/roadmap-health\"\nimport { StatusDot } from \"./RoadmapNodes\"\nimport { AgentDot } from \"@/components/chat/AgentMark\"\nimport { LANE_ROW_H, buildTimeline, formatDay } from \"./timeline\"\n\nconst LANE_LABEL_W = 200\nconst HEADER_H = 36\n\ninterface RoadmapTimelineProps {\n items: RoadmapItem[]\n today: string\n onSelect: (id: string) => void\n onItemContextMenu?: (id: string, e: React.MouseEvent) => void\n progressById: Record<string, RoadmapProgress>\n}\n\nexport function RoadmapTimeline({ items, today, onSelect, onItemContextMenu, progressById }: RoadmapTimelineProps) {\n // same chapter numbers as the map: real horizons by order\n const chapters = new Map(items.filter((i) => i.parent === null).sort((a, b) => a.order - b.order).map((h, i) => [h.id, i + 1]))\n const tl = useMemo(() => buildTimeline(items, today), [items, today])\n const scrollRef = useRef<HTMLDivElement>(null)\n\n // open with today about a third from the left\n useEffect(() => {\n const el = scrollRef.current\n if (el) el.scrollLeft = Math.max(0, tl.todayX - (el.clientWidth - LANE_LABEL_W) / 3)\n }, [tl.todayX])\n\n const hasDates = tl.lanes.some((l) => l.markers.length > 0)\n\n return (\n <div className=\"flex flex-1 min-h-0 flex-col\">\n <div ref={scrollRef} className=\"relative flex-1 min-h-0 overflow-auto\">\n <div className=\"relative\" style={{ width: LANE_LABEL_W + tl.width, minHeight: \"100%\" }}>\n {/* month grid + today line, behind the lanes */}\n <div className=\"pointer-events-none absolute inset-y-0\" style={{ left: LANE_LABEL_W, width: tl.width }}>\n {tl.months.map((m) => (\n <div key={m.x} className=\"absolute inset-y-0 border-l border-border\" style={{ left: m.x }} />\n ))}\n <div className=\"absolute inset-y-0 left-0 bg-surface/50\" style={{ width: tl.todayX }} />\n <div className=\"absolute inset-y-0 w-px bg-accent shadow-[0_0_12px_rgb(var(--rgb-accent)/0.8)]\" style={{ left: tl.todayX }}>\n <span\n className=\"absolute -translate-x-1/2 rounded-full bg-accent px-2 py-0.5 font-mono text-[10px] uppercase tracking-wider text-accent-fg\"\n style={{ top: HEADER_H + 6 }}\n >\n Today\n </span>\n </div>\n </div>\n\n {/* month header */}\n <div className=\"sticky top-0 z-20 flex border-b border-border bg-bg\" style={{ height: HEADER_H }}>\n <div className=\"sticky left-0 z-10 shrink-0 bg-bg\" style={{ width: LANE_LABEL_W }} />\n <div className=\"relative\">\n {tl.months.map((m) => (\n <span key={m.x} className=\"absolute top-3 whitespace-nowrap pl-2 font-mono text-[10px] uppercase tracking-widest text-muted\" style={{ left: m.x }}>\n {m.label}\n </span>\n ))}\n </div>\n </div>\n\n {tl.lanes.map((lane) => (\n <div key={lane.item.id} className=\"relative flex border-b border-border\">\n <LaneLabel item={lane.item} chapter={chapters.get(lane.item.id)} progress={progressById[lane.item.id]} onSelect={onSelect} onContextMenu={onItemContextMenu} />\n <div className=\"relative\" style={{ width: tl.width, height: lane.rows * LANE_ROW_H + 12 }}>\n {lane.markers.map((mk) => (\n <button\n key={mk.item.id}\n type=\"button\"\n onClick={() => onSelect(mk.item.id)}\n onContextMenu={(e) => onItemContextMenu?.(mk.item.id, e)}\n title={`${mk.item.id} · ${mk.item.title} · due ${mk.item.due}${mk.state === \"overdue\" ? \" (overdue)\" : \"\"}`}\n className=\"group absolute flex items-center gap-1.5\"\n style={{ left: mk.x - 10, top: 6 + mk.row * LANE_ROW_H }}\n >\n {mk.horizon ? (\n <span\n className={cn(\n \"h-4 w-4 rotate-45 border-2 border-accent\",\n mk.item.status === \"done\" ? \"bg-accent\" : \"bg-bg\",\n mk.state === \"overdue\" && \"border-danger\",\n )}\n />\n ) : (\n <span className={cn(\"rounded-full\", mk.state === \"overdue\" && \"ring-2 ring-danger ring-offset-1 ring-offset-bg\")}>\n <StatusDot status={mk.item.status} />\n </span>\n )}\n <span\n className={cn(\n \"flex max-w-[150px] flex-col rounded-md border px-2 py-0.5 text-left transition-colors\",\n mk.item.status === \"in-progress\" ? \"border-accent/50 bg-surface shadow-[0_6px_18px_-10px_rgb(var(--rgb-accent)/0.7)]\"\n : mk.item.status === \"done\" ? \"border-border bg-surface/60\" : \"border-dashed border-border2 bg-bg\",\n \"group-hover:border-accent\",\n )}\n >\n <span className=\"flex items-center gap-1\">\n <span className={cn(\"truncate text-xs\", mk.item.status === \"done\" ? \"text-muted\" : \"text-txt\", mk.horizon && \"font-semibold\")}>\n {mk.item.title}\n </span>\n <AgentDot attach={{ kind: \"epic\", id: mk.item.id }} />\n </span>\n <span\n className={cn(\n \"font-mono text-[10px]\",\n mk.state === \"overdue\" ? \"text-danger\" : mk.state === \"soon\" ? \"text-amber\" : \"text-muted\",\n )}\n >\n {formatDay(mk.item.due as string)}\n </span>\n </span>\n </button>\n ))}\n </div>\n </div>\n ))}\n\n {!hasDates && (\n <p className=\"px-6 py-8 text-sm text-muted\" style={{ marginLeft: LANE_LABEL_W }}>\n No due dates yet — open an item and set a Due date.\n </p>\n )}\n </div>\n </div>\n\n {tl.undated.length > 0 && (\n <div className=\"max-h-28 shrink-0 overflow-y-auto border-t border-border bg-surface px-4 py-2\">\n <p className=\"mb-2 font-mono text-[10px] uppercase tracking-widest text-muted\">No due date · {tl.undated.length}</p>\n <div className=\"flex flex-wrap gap-1.5\">\n {tl.undated.map((i) => (\n <button\n key={i.id}\n type=\"button\"\n onClick={() => onSelect(i.id)}\n onContextMenu={(e) => onItemContextMenu?.(i.id, e)}\n 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\"\n >\n <StatusDot status={i.status} />\n {i.title}\n <AgentDot attach={{ kind: \"epic\", id: i.id }} />\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n )\n}\n\nfunction LaneLabel({ item, chapter, progress, onSelect, onContextMenu }: {\n item: RoadmapItem\n chapter?: number\n progress?: RoadmapProgress\n onSelect: (id: string) => void\n onContextMenu?: (id: string, e: React.MouseEvent) => void\n}) {\n return (\n <button\n type=\"button\"\n onClick={() => onSelect(item.id)}\n onContextMenu={(e) => onContextMenu?.(item.id, e)}\n 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\"\n style={{ width: LANE_LABEL_W }}\n >\n <span\n className={cn(\n \"font-mono text-lg font-semibold tabular-nums\",\n item.status === \"in-progress\" ? \"text-accent\" : item.status === \"done\" ? \"text-teal\" : \"text-muted\",\n )}\n >\n {chapter ? String(chapter).padStart(2, \"0\") : \"··\"}\n </span>\n <span className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <span className=\"line-clamp-2 text-[11px] font-semibold uppercase leading-snug tracking-wider text-txt\">{item.title}</span>\n {progress && (\n <span className=\"h-1 overflow-hidden rounded-full bg-border\">\n <span className=\"block h-full rounded-full bg-teal\" style={{ width: `${(progress.done / progress.total) * 100}%` }} />\n </span>\n )}\n </span>\n </button>\n )\n}\n","\"use client\"\n\nimport { useState } from \"react\"\nimport { Bot, ChevronRight, FileText, MessageSquare, Pencil, Plus } from \"lucide-react\"\nimport { Sheet, SheetContent, SheetDescription, SheetTitle } from \"@/components/ui/sheet\"\nimport { Input } from \"@/components/ui/input\"\nimport { Button } from \"@/components/ui/button\"\nimport { MarkdownRenderer } from \"@/components/docs/MarkdownRenderer\"\nimport { cn } from \"@/lib/utils\"\nimport { askAgent } from \"@/lib/ask-agent\"\nimport { chatFor } from \"@/lib/chats\"\nimport { AgentDot, AgentMark } from \"@/components/chat/AgentMark\"\nimport { useChats } from \"@/context/ChatContext\"\nimport { dueState, localToday, type RoadmapProgress } from \"@/lib/roadmap-health\"\nimport { pickNextTask } from \"@/lib/work-queue\"\nimport { ItemActionsMenu, type ItemActions } from \"./ItemActionsMenu\"\nimport { useItemCommands } from \"@/components/shared/item-commands\"\nimport { OwnerChip } from \"@/components/shared/OwnerChip\"\nimport { ItemPanelHeader } from \"@/components/shared/ItemPanelHeader\"\nimport { InlineDate, InlineSelect } from \"@/components/shared/InlineProperty\"\nimport { toast } from \"@/components/ui/toast\"\nimport { DueChip, STATUS_LABEL, SegmentedProgress, StatusDot, StatusPill, TASK_STATUS_BG } from \"./RoadmapNodes\"\nimport type { RoadmapItem, RoadmapStatus, Task, TaskStatus, UpdateRoadmapItemPatch } from \"@/types\"\n\nconst STATUSES: RoadmapStatus[] = [\"planned\", \"in-progress\", \"paused\", \"done\"]\n\nconst FIELD = \"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\"\nconst LABEL = \"text-xs font-medium text-muted\"\nconst SECTION = \"font-mono text-[10px] uppercase tracking-widest text-muted\"\n\ninterface RoadmapItemSheetProps {\n item: RoadmapItem | null\n items: RoadmapItem[]\n onClose: () => void\n /** Each returns an error message, or null on success. */\n onSave: (id: string, patch: UpdateRoadmapItemPatch) => Promise<string | null>\n onDelete: (id: string) => Promise<string | null>\n onAddFeature: (parentId: string) => void\n onEditRaw: (file: string) => void\n onSelect: (id: string) => void\n /** Every task on the board, by id — the epic's linked tasks are looked up here. */\n tasksById: Record<string, Task>\n progressById: Record<string, RoadmapProgress>\n editing: boolean\n onEditingChange: (editing: boolean) => void\n actions: ItemActions\n}\n\nexport function RoadmapItemSheet({ item, onClose, ...rest }: RoadmapItemSheetProps) {\n return (\n <Sheet open={!!item} onOpenChange={(v) => { if (!v) onClose() }}>\n <SheetContent className=\"w-[480px] sm:max-w-[480px] gap-0 bg-surface border-border text-txt flex flex-col overflow-y-auto p-0\">\n {/* keyed so view/edit and form state re-initialise when a different item opens */}\n {item && <ItemPanel key={item.id} item={item} onClose={onClose} {...rest} />}\n </SheetContent>\n </Sheet>\n )\n}\n\nfunction ItemPanel(props: RoadmapItemSheetProps & { item: RoadmapItem }) {\n return props.editing\n ? <ItemForm {...props} onCancel={() => props.onEditingChange(false)} />\n : <ItemView {...props} onEdit={() => props.onEditingChange(true)} />\n}\n\n/** Read-first view: where it sits, how far along, what's next, and the brief. */\nfunction ItemView({ item, items, onClose, onAddFeature, onEditRaw, onSelect, tasksById, progressById, onEdit, actions, onSave }: RoadmapItemSheetProps & { item: RoadmapItem; onEdit: () => void }) {\n const isHorizon = item.parent === null\n const parent = items.find((i) => i.id === item.parent)\n const epics = items.filter((i) => i.parent === item.id).sort((a, b) => a.order - b.order)\n const progress = progressById[item.id]\n const today = localToday()\n const { chats, showAbout } = useChats()\n const chat = isHorizon ? undefined : chatFor(chats, { kind: \"epic\", id: item.id })\n const offerBreakdown = !isHorizon && item.tasks.length === 0 && !chat\n const [menuOpen, setMenuOpen] = useState(false)\n const save = (patch: UpdateRoadmapItemPatch) => { onSave(item.id, patch).then((err) => { if (err) toast(err) }) }\n useItemCommands(`${item.id} · ${item.title}`, [\n { action: \"edit\", label: \"Edit\", run: onEdit },\n { action: \"status\", label: \"Change status…\", run: () => setMenuOpen(true) },\n { action: \"duplicate\", label: \"Duplicate\", run: () => actions.duplicate(item.id) },\n ...(isHorizon ? [] : [{ action: \"chat\" as const, label: \"Chat about it\", run: () => actions.chat(item.id) }]),\n ...(epics.length ? [] : [{ action: \"remove\" as const, label: \"Delete\", run: () => actions.remove(item.id) }]),\n ])\n\n return (\n <div className=\"flex min-h-full flex-col\">\n <ItemPanelHeader\n className={cn(\"px-6\", item.status === \"in-progress\" && \"bg-[linear-gradient(180deg,rgb(var(--rgb-accent)/0.08),transparent)]\")}\n kicker={\n <SheetDescription asChild>\n <div className=\"flex min-w-0 items-center gap-1\">\n {parent && (\n <>\n <button type=\"button\" onClick={() => onSelect(parent.id)} className=\"truncate hover:text-txt\">{parent.title}</button>\n <ChevronRight className=\"h-3 w-3 shrink-0\" />\n </>\n )}\n <span className=\"shrink-0\">{item.id} · {isHorizon ? \"horizon\" : \"epic\"}</span>\n <AgentMark attach={{ kind: \"epic\", id: item.id }} />\n </div>\n </SheetDescription>\n }\n title={<SheetTitle className=\"text-xl font-semibold leading-tight text-txt\">{item.title}</SheetTitle>}\n menu={<ItemActionsMenu item={item} items={items} actions={actions} open={menuOpen} onOpenChange={setMenuOpen} />}\n properties={[\n {\n label: \"Status\",\n value: (\n <InlineSelect label={`Status of ${item.id}`} value={item.status} onChange={(v) => actions.setStatus(item.id, v as RoadmapStatus)}\n options={STATUSES.map((s) => ({ value: s, label: STATUS_LABEL[s], node: <><StatusDot status={s} />{STATUS_LABEL[s]}</> }))}>\n <StatusPill status={item.status} />\n </InlineSelect>\n ),\n },\n {\n label: \"Owner\",\n value: (\n <InlineSelect label={`Owner of ${item.id}`} value={item.owner ?? \"\"} onChange={(v) => save({ owner: v || null })}\n options={[\n { value: \"human\", label: \"Human\", node: <OwnerChip owner=\"human\" className=\"text-xs\" /> },\n ...[...new Set([\"ai:claude\", ...(item.owner?.startsWith(\"ai:\") ? [item.owner] : [])])].map((a) => ({ value: a, label: a, node: <OwnerChip owner={a} className=\"text-xs\" /> })),\n { value: \"\", label: \"No owner\", node: <span className=\"text-muted\">No owner</span> },\n ]}>\n {item.owner ? <OwnerChip owner={item.owner} className=\"text-xs\" /> : <span className=\"text-muted\">—</span>}\n </InlineSelect>\n ),\n },\n {\n label: \"Due\",\n value: (\n <InlineDate label={`Due date of ${item.id}`} value={item.due} onChange={(v) => save({ due: v })}>\n {item.due ? <DueChip due={item.due} state={dueState(item.due, item.status, today)} /> : <span className=\"text-muted\">—</span>}\n </InlineDate>\n ),\n },\n { label: isHorizon ? \"Epics\" : \"Tasks\", value: <span className=\"font-mono\">{isHorizon ? epics.length : item.tasks.length}</span> },\n ]}\n >\n {progress && (\n <div className=\"mt-2 flex items-end gap-4\">\n <p className=\"font-mono text-3xl font-semibold leading-none tabular-nums text-txt\">\n {Math.round((progress.done / progress.total) * 100)}<span className=\"text-base text-muted\">%</span>\n </p>\n <div className=\"flex-1 pb-1\">\n <p className=\"mb-1.5 font-mono text-[10px] text-muted\">{progress.done} of {progress.total}{isHorizon ? \"\" : \" tasks\"} done</p>\n {isHorizon ? (\n <div className=\"h-1.5 overflow-hidden rounded-full bg-border\">\n <div className=\"h-full rounded-full bg-teal\" style={{ width: `${(progress.done / progress.total) * 100}%` }} />\n </div>\n ) : (\n <SegmentedProgress statuses={item.tasks.map((id) => tasksById[id]?.status).filter((s): s is TaskStatus => !!s && s !== \"cancelled\")} />\n )}\n </div>\n </div>\n )}\n </ItemPanelHeader>\n\n <div className=\"flex flex-1 flex-col gap-6 px-6 py-5\">\n {!isHorizon && item.tasks.length > 0 && <LinkedTasks item={item} tasksById={tasksById} onOpen={onEditRaw} />}\n\n {isHorizon && (\n <section className=\"flex flex-col gap-2\">\n <p className={SECTION}>Epics · {epics.length}</p>\n {epics.length === 0 && <p className=\"text-sm text-muted\">No epics yet.</p>}\n <ul className=\"-mx-2 flex flex-col\">\n {epics.map((e) => {\n const p = progressById[e.id]\n return (\n <li key={e.id}>\n <button type=\"button\" onClick={() => onSelect(e.id)} className=\"flex w-full items-center gap-3 rounded-md px-2 py-2 text-left hover:bg-surface2\">\n <StatusDot status={e.status} />\n <span className=\"shrink-0 font-mono text-[11px] text-muted\">{e.id}</span>\n <span className={cn(\"min-w-0 flex-1 truncate text-sm\", e.status === \"done\" ? \"text-muted\" : \"text-txt\")}>{e.title}</span>\n {p && <span className=\"shrink-0 font-mono text-[10px] text-muted\">{p.done}/{p.total}</span>}\n </button>\n </li>\n )\n })}\n </ul>\n </section>\n )}\n\n <section className=\"flex flex-col gap-2\">\n <p className={SECTION}>Brief</p>\n {item.body.trim()\n ? <MarkdownRenderer content={item.body} className=\"text-sm\" />\n : <p className=\"text-sm text-muted\">No description. Edit to add the outcome, scope and &ldquo;done when&rdquo;.</p>}\n </section>\n </div>\n\n <footer className=\"sticky bottom-0 flex flex-wrap items-center gap-2 border-t border-border bg-surface px-6 py-3\">\n {offerBreakdown && (\n <Button size=\"sm\" onClick={() => { onClose(); askAgent(`Break down epic ${item.id} into tasks.`) }} className=\"bg-accent text-accent-fg hover:bg-accent/90\">\n <Bot /> Break down with agent\n </Button>\n )}\n {!isHorizon && (\n <Button\n size=\"sm\"\n variant={offerBreakdown ? \"outline\" : \"default\"}\n onClick={() => { onClose(); showAbout({ kind: \"epic\", id: item.id }) }}\n className={cn(!offerBreakdown && \"bg-accent text-accent-fg hover:bg-accent/90\")}\n >\n <MessageSquare /> {chat ? \"Open chat\" : \"Chat\"}\n </Button>\n )}\n {isHorizon && (\n <Button size=\"sm\" onClick={() => onAddFeature(item.id)} className=\"bg-accent text-accent-fg hover:bg-accent/90\">\n <Plus /> Add epic\n </Button>\n )}\n <Button size=\"sm\" variant=\"outline\" onClick={onEdit}>\n <Pencil /> Edit\n </Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => onEditRaw(item.file)} className=\"ml-auto text-muted hover:text-txt\">\n <FileText /> Open file\n </Button>\n </footer>\n </div>\n )\n}\n\nfunction ItemForm({ item, items, onClose, onSave, onDelete, onCancel }: RoadmapItemSheetProps & { item: RoadmapItem; onCancel: () => void }) {\n // snapshot at open: the dirty check diffs against this, not the live (SSE-refreshed) item\n const [base] = useState(item)\n const [title, setTitle] = useState(item.title)\n const [status, setStatus] = useState<RoadmapStatus>(item.status)\n const [parent, setParent] = useState(item.parent ?? \"\")\n const [order, setOrder] = useState(String(item.order))\n const [tasks, setTasks] = useState(item.tasks.join(\", \"))\n const [due, setDue] = useState(item.due ?? \"\")\n const [body, setBody] = useState(item.body)\n const [error, setError] = useState<string | null>(null)\n const [busy, setBusy] = useState(false)\n\n const hasChildren = items.some((i) => i.parent === item.id)\n const horizons = items.filter((i) => i.parent === null && i.id !== item.id)\n const isHorizon = item.parent === null\n const orphanParent = item.parent !== null && !horizons.some((h) => h.id === item.parent)\n\n async function run(fn: () => Promise<string | null>) {\n setBusy(true)\n setError(null)\n const err = await fn()\n setBusy(false)\n if (err) setError(err)\n return !err\n }\n\n async function save() {\n // Send only fields the user changed, so concurrent edits (AI / other tab) to other fields survive.\n const patch: UpdateRoadmapItemPatch = {}\n const nextTitle = title.trim() || base.title\n if (nextTitle !== base.title) patch.title = nextTitle\n if (status !== base.status) patch.status = status\n if ((parent || null) !== base.parent) patch.parent = parent || null\n if (order.trim() !== String(base.order)) {\n const n = Number(order)\n if (order.trim() === \"\" || !Number.isFinite(n)) {\n setError(\"Order must be a number\")\n return\n }\n patch.order = n\n }\n const nextTasks = tasks.split(\",\").map((t) => t.trim()).filter(Boolean)\n if (nextTasks.join(\",\") !== base.tasks.join(\",\")) patch.tasks = nextTasks\n if ((due || null) !== base.due) patch.due = due || null\n if (body !== base.body) patch.body = body\n if (Object.keys(patch).length === 0) {\n onCancel()\n return\n }\n if (await run(() => onSave(item.id, patch))) onClose()\n }\n\n async function remove() {\n if (await run(() => onDelete(item.id))) onClose()\n }\n\n return (\n <div className=\"flex min-h-full flex-col\">\n <div className=\"border-b border-border px-6 pb-4 pt-6 pr-12\">\n <SheetDescription className=\"font-mono text-[11px] text-muted\">Editing {item.id} · {isHorizon ? \"horizon\" : \"epic\"}</SheetDescription>\n <SheetTitle className=\"mt-1 text-base text-txt\">{item.title}</SheetTitle>\n </div>\n\n <div className=\"flex flex-1 flex-col gap-4 px-6 py-5\">\n <label className=\"flex flex-col gap-1\">\n <span className={LABEL}>Title</span>\n <Input value={title} onChange={(e) => setTitle(e.target.value)} className=\"bg-bg border-border text-txt\" />\n </label>\n\n <div className=\"grid grid-cols-3 gap-3\">\n <label className=\"flex flex-col gap-1\">\n <span className={LABEL}>Status</span>\n <select value={status} onChange={(e) => setStatus(e.target.value as RoadmapStatus)} className={FIELD}>\n {STATUSES.map((s) => <option key={s} value={s}>{s}</option>)}\n </select>\n </label>\n <label className=\"flex flex-col gap-1\">\n <span className={LABEL}>Parent</span>\n <select\n value={parent}\n onChange={(e) => setParent(e.target.value)}\n disabled={hasChildren}\n title={hasChildren ? \"Items with children must stay on the spine\" : undefined}\n className={FIELD}\n >\n <option value=\"\">— (horizon)</option>\n {orphanParent && <option value={item.parent ?? \"\"}>{item.parent} · missing</option>}\n {horizons.map((h) => <option key={h.id} value={h.id}>{h.id} · {h.title}</option>)}\n </select>\n </label>\n <label className=\"flex flex-col gap-1\">\n <span className={LABEL}>Order</span>\n <Input\n type=\"number\"\n step={10}\n value={order}\n onChange={(e) => setOrder(e.target.value)}\n title={isHorizon ? \"Position on the spine\" : \"Position within the branch\"}\n className=\"bg-bg border-border text-txt\"\n />\n </label>\n </div>\n\n <label className=\"flex flex-col gap-1\">\n <span className={LABEL}>Due</span>\n <div className=\"flex items-center gap-2\">\n <Input\n type=\"date\"\n value={due}\n onChange={(e) => setDue(e.target.value)}\n className=\"bg-bg border-border text-txt scheme-light dark:scheme-dark\"\n />\n {due && (\n <button type=\"button\" onClick={() => setDue(\"\")} className=\"text-xs text-muted hover:text-txt\">\n Clear\n </button>\n )}\n </div>\n </label>\n\n <label className=\"flex flex-col gap-1\">\n <span className={LABEL}>Tasks</span>\n <Input\n value={tasks}\n onChange={(e) => setTasks(e.target.value)}\n placeholder=\"T001, T012\"\n className=\"bg-bg border-border text-txt font-mono\"\n />\n </label>\n\n <label className=\"flex flex-col gap-1\">\n <span className={LABEL}>Body (markdown)</span>\n <textarea value={body} onChange={(e) => setBody(e.target.value)} rows={12} className={`${FIELD} font-mono resize-y`} />\n </label>\n\n {error && <p className=\"text-xs text-danger\">{error}</p>}\n </div>\n\n <footer className=\"sticky bottom-0 flex items-center gap-2 border-t border-border bg-surface px-6 py-3\">\n <Button size=\"sm\" onClick={save} disabled={busy} className=\"bg-accent text-accent-fg hover:bg-accent/90\">\n Save\n </Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={onCancel} disabled={busy} className=\"text-txt\">\n Cancel\n </Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={remove} disabled={busy} className=\"ml-auto text-danger hover:text-danger\">\n Delete\n </Button>\n </footer>\n </div>\n )\n}\n\nfunction LinkedTasks({ item, tasksById, onOpen }: {\n item: RoadmapItem\n tasksById: Record<string, Task>\n onOpen: (file: string) => void\n}) {\n const today = localToday()\n const next = pickNextTask(item, Object.values(tasksById))\n const nextId = next.kind === \"ready\" ? next.taskId : null\n // Todo tasks' \"waits on …\" first: in-progress/blocked rows already say so in their badge.\n const reasons = next.kind === \"waiting\"\n ? [...next.waiting].sort((a, b) => Number(tasksById[b.taskId]?.status === \"todo\") - Number(tasksById[a.taskId]?.status === \"todo\")).map((w) => w.reason)\n : []\n return (\n <section className=\"flex flex-col gap-2\">\n <p className={SECTION}>Tasks · {item.tasks.length}</p>\n <ul className=\"-mx-2 flex flex-col\">\n {item.tasks.map((id) => {\n const t = tasksById[id]\n if (!t) {\n return (\n <li key={id} className=\"px-2 py-2 font-mono text-xs text-danger\">{id} · missing task file</li>\n )\n }\n const isNext = t.id === nextId\n return (\n <li key={id} className={cn(\"group flex items-center rounded-md hover:bg-surface2\", isNext && \"bg-accent/10 hover:bg-accent/15\")}>\n <button\n type=\"button\"\n onClick={() => onOpen(t.file)}\n className=\"flex min-w-0 flex-1 items-center gap-3 px-2 py-2 text-left\"\n >\n <span title={t.status} className={cn(\"h-2 w-2 shrink-0 rounded-full\", TASK_STATUS_BG[t.status])} />\n <span className=\"shrink-0 font-mono text-[11px] text-muted\">{t.id}</span>\n <span className={cn(\"min-w-0 flex-1 truncate text-sm\", t.status === \"cancelled\" ? \"text-muted line-through\" : t.status === \"done\" ? \"text-muted\" : \"text-txt\")}>\n {t.title}\n </span>\n <DueChip due={t.due} state={dueState(t.due, t.status === \"done\" ? \"done\" : \"planned\", today)} />\n {isNext\n ? <span className=\"shrink-0 font-mono text-[10px] uppercase tracking-wider text-accent\">Next up</span>\n : t.size && t.size !== \"—\" && <span className=\"shrink-0 font-mono text-[10px] text-muted\">{t.size.split(\" \")[0]}</span>}\n <AgentDot attach={{ kind: \"task\", id: t.id }} />\n </button>\n <TaskChatButton taskId={t.id} />\n </li>\n )\n })}\n </ul>\n {reasons.length > 0 && (\n <p className=\"truncate text-xs text-muted\" title={reasons.join(\"\\n\")}>\n {reasons[0]}{reasons.length > 1 && ` (+${reasons.length - 1} more)`}\n </p>\n )}\n </section>\n )\n}\n\n/** Per-task chat entry in the epic sheet: always visible when a chat exists, on hover otherwise. */\nfunction TaskChatButton({ taskId }: { taskId: string }) {\n const { chats, showAbout } = useChats()\n const has = !!chatFor(chats, { kind: \"task\", id: taskId })\n return (\n <button\n type=\"button\"\n onClick={() => showAbout({ kind: \"task\", id: taskId })}\n aria-label={`${has ? \"Open chat\" : \"Chat\"} about ${taskId}`}\n title={has ? `Open the chat about ${taskId}` : `Chat about ${taskId}`}\n className={cn(\n \"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\",\n has ? \"text-accent opacity-100\" : \"opacity-0 group-hover:opacity-100\",\n )}\n >\n <MessageSquare className=\"size-3.5\" />\n </button>\n )\n}\n","\"use client\"\n\nimport { Copy, FileText, FolderInput, MessageSquare, MoreHorizontal, Pencil, Plus, Trash2 } from \"lucide-react\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\"\nimport { cn } from \"@/lib/utils\"\nimport { itemKeyLabel } from \"@/components/shared/item-commands\"\nimport { STATUS_LABEL, StatusDot } from \"./RoadmapNodes\"\nimport type { RoadmapItem, RoadmapStatus } from \"@/types\"\n\nconst STATUSES: RoadmapStatus[] = [\"planned\", \"in-progress\", \"paused\", \"done\"]\n\n/** What the roadmap page does for each menu entry. The menu itself holds no state. */\nexport interface ItemActions {\n edit: (id: string) => void\n setStatus: (id: string, status: RoadmapStatus) => void\n move: (id: string, horizonId: string) => void\n addEpic: (horizonId: string) => void\n duplicate: (id: string) => void\n openFile: (file: string) => void\n chat: (id: string) => void\n remove: (id: string) => void\n}\n\nfunction ItemMenuItems({ item, items, actions }: { item: RoadmapItem; items: RoadmapItem[]; actions: ItemActions }) {\n const isHorizon = item.parent === null\n const horizons = items.filter((i) => i.parent === null && i.id !== item.parent).sort((a, b) => a.order - b.order)\n const children = items.filter((i) => i.parent === item.id).length\n\n return (\n <>\n <DropdownMenuItem onSelect={() => actions.edit(item.id)}><Pencil /> Edit<DropdownMenuShortcut>{itemKeyLabel(\"edit\")}</DropdownMenuShortcut></DropdownMenuItem>\n <DropdownMenuSub>\n <DropdownMenuSubTrigger><StatusDot status={item.status} /> Status<DropdownMenuShortcut>{itemKeyLabel(\"status\")}</DropdownMenuShortcut></DropdownMenuSubTrigger>\n <DropdownMenuSubContent>\n {STATUSES.map((s) => (\n <DropdownMenuItem key={s} disabled={s === item.status} onSelect={() => actions.setStatus(item.id, s)}>\n <StatusDot status={s} /> {STATUS_LABEL[s]}\n </DropdownMenuItem>\n ))}\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n {!isHorizon && horizons.length > 0 && (\n <DropdownMenuSub>\n <DropdownMenuSubTrigger><FolderInput /> Move to horizon</DropdownMenuSubTrigger>\n <DropdownMenuSubContent className=\"max-h-72 overflow-y-auto\">\n {horizons.map((h) => (\n <DropdownMenuItem key={h.id} onSelect={() => actions.move(item.id, h.id)}>\n <span className=\"font-mono text-[11px] text-muted\">{h.id}</span> {h.title}\n </DropdownMenuItem>\n ))}\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n )}\n {isHorizon && <DropdownMenuItem onSelect={() => actions.addEpic(item.id)}><Plus /> Add epic</DropdownMenuItem>}\n <DropdownMenuItem onSelect={() => actions.duplicate(item.id)}><Copy /> Duplicate<DropdownMenuShortcut>{itemKeyLabel(\"duplicate\")}</DropdownMenuShortcut></DropdownMenuItem>\n <DropdownMenuSeparator />\n {!isHorizon && <DropdownMenuItem onSelect={() => actions.chat(item.id)}><MessageSquare /> Chat about it<DropdownMenuShortcut>{itemKeyLabel(\"chat\")}</DropdownMenuShortcut></DropdownMenuItem>}\n <DropdownMenuItem onSelect={() => actions.openFile(item.file)}><FileText /> Open file</DropdownMenuItem>\n <DropdownMenuSeparator />\n {children > 0 ? (\n <DropdownMenuItem disabled className=\"flex-col items-start gap-0\">\n <span className=\"flex items-center gap-2\"><Trash2 /> Delete</span>\n <span className=\"pl-6 text-[11px]\">Move or delete its {children} epic{children === 1 ? \"\" : \"s\"} first</span>\n </DropdownMenuItem>\n ) : (\n <DropdownMenuItem onSelect={() => actions.remove(item.id)} className=\"text-danger focus:text-danger\">\n <Trash2 /> Delete<DropdownMenuShortcut>{itemKeyLabel(\"remove\")}</DropdownMenuShortcut>\n </DropdownMenuItem>\n )}\n </>\n )\n}\n\n/** ⋯ button that opens the item's actions. */\nexport function ItemActionsMenu({ item, items, actions, className, open, onOpenChange }: {\n item: RoadmapItem\n items: RoadmapItem[]\n actions: ItemActions\n className?: string\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}) {\n return (\n <DropdownMenu open={open} onOpenChange={onOpenChange}>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n aria-label={`Actions for ${item.id}`}\n className={cn(\"grid size-7 place-items-center rounded-md text-muted hover:bg-surface2 hover:text-txt\", className)}\n >\n <MoreHorizontal className=\"size-4\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-52\">\n <ItemMenuItems item={item} items={items} actions={actions} />\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nexport type ContextMenuState = { id: string; x: number; y: number } | null\n\n/** The same actions, opened at the pointer (right-click on a map node or timeline bar). */\nexport function ItemContextMenu({ at, items, actions, onClose }: {\n at: ContextMenuState\n items: RoadmapItem[]\n actions: ItemActions\n onClose: () => void\n}) {\n const item = at && items.find((i) => i.id === at.id)\n if (!at || !item) return null\n return (\n // keyed by position so a second right-click re-anchors the menu\n <DropdownMenu key={`${at.id}:${at.x}:${at.y}`} open onOpenChange={(open) => { if (!open) onClose() }}>\n <DropdownMenuTrigger asChild>\n <span aria-hidden className=\"pointer-events-none fixed size-0\" style={{ left: at.x, top: at.y }} />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"w-52\">\n <ItemMenuItems item={item} items={items} actions={actions} />\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n","\"use client\"\n\nimport { useState } from \"react\"\nimport { Dialog, DialogContent, DialogTitle } from \"@/components/ui/dialog\"\nimport { Input } from \"@/components/ui/input\"\nimport { Button } from \"@/components/ui/button\"\n\ninterface NewItemDialogProps {\n open: boolean\n heading: string\n onOpenChange: (open: boolean) => void\n /** Returns an error message to show, or null on success. */\n onSubmit: (title: string) => Promise<string | null>\n}\n\nexport function NewItemDialog({ open, heading, onOpenChange, onSubmit }: NewItemDialogProps) {\n const [title, setTitle] = useState(\"\")\n const [error, setError] = useState<string | null>(null)\n const [busy, setBusy] = useState(false)\n\n function close(v: boolean) {\n if (!v) {\n setTitle(\"\")\n setError(null)\n }\n onOpenChange(v)\n }\n\n async function submit(e: React.FormEvent) {\n e.preventDefault()\n if (!title.trim()) return\n setBusy(true)\n const err = await onSubmit(title.trim())\n setBusy(false)\n if (err) setError(err)\n else close(false)\n }\n\n return (\n <Dialog open={open} onOpenChange={close}>\n <DialogContent className=\"max-w-sm bg-surface border-border text-txt\">\n <DialogTitle className=\"text-sm font-semibold text-txt\">{heading}</DialogTitle>\n <form onSubmit={submit} className=\"flex flex-col gap-3\">\n <Input\n autoFocus\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n placeholder=\"Title\"\n className=\"bg-bg border-border text-txt\"\n />\n {error && <p className=\"text-xs text-danger\">{error}</p>}\n <div className=\"flex justify-end gap-2\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => close(false)}>\n Cancel\n </Button>\n <Button type=\"submit\" size=\"sm\" disabled={busy || !title.trim()} className=\"bg-accent text-accent-fg hover:bg-accent/90\">\n Create\n </Button>\n </div>\n </form>\n </DialogContent>\n </Dialog>\n )\n}\n","\"use client\"\n\nimport { useState } from \"react\"\nimport { Dialog, DialogContent, DialogTitle } from \"@/components/ui/dialog\"\nimport { Button } from \"@/components/ui/button\"\nimport { askAgent } from \"@/lib/ask-agent\"\n\ninterface PlanFromSpecDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n}\n\n/** Paste a feature spec → the chat agent breaks it into tasks (new epic, existing epic, or loose). */\nexport function PlanFromSpecDialog({ open, onOpenChange }: PlanFromSpecDialogProps) {\n // Kept after submit (cleared only on Cancel): if the running-agent cap refuses the ask, reopening restores the spec.\n const [spec, setSpec] = useState(\"\")\n\n function submit(e: React.FormEvent) {\n e.preventDefault()\n if (!spec.trim()) return\n onOpenChange(false)\n askAgent(`Break down this spec into tasks:\\n\\n${spec.trim()}`)\n }\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"max-w-lg bg-surface border-border text-txt\">\n <DialogTitle className=\"text-sm font-semibold text-txt\">Plan from spec</DialogTitle>\n <form onSubmit={submit} className=\"flex flex-col gap-3\">\n <textarea\n autoFocus\n value={spec}\n onChange={(e) => setSpec(e.target.value)}\n placeholder=\"Paste a feature spec…\"\n rows={12}\n 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\"\n />\n <p className=\"text-xs text-muted\">The agent asks where the tasks go (a new epic, an existing epic, or no epic) and shows a plan before writing anything.</p>\n <div className=\"flex justify-end gap-2\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => { setSpec(\"\"); onOpenChange(false) }}>\n Cancel\n </Button>\n <Button type=\"submit\" size=\"sm\" disabled={!spec.trim()} className=\"bg-accent text-accent-fg hover:bg-accent/90\">\n Break down\n </Button>\n </div>\n </form>\n </DialogContent>\n </Dialog>\n )\n}\n","\"use client\"\n\nimport { useState } from \"react\"\nimport { Dialog, DialogContent, DialogTitle } from \"@/components/ui/dialog\"\nimport { Button } from \"@/components/ui/button\"\nimport { askAgent } from \"@/lib/ask-agent\"\nimport { MAX_RUNNING_CHATS } from \"@/lib/chats\"\nimport { useChats } from \"@/context/ChatContext\"\nimport type { RoadmapItem } from \"@/types\"\n\ninterface BreakdownEpicsDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n items: RoadmapItem[]\n}\n\n/** Not-done epics grouped by horizon (spine order); within a horizon, epics with no tasks first. */\nfunction epicGroups(items: RoadmapItem[]) {\n const byOrder = (a: RoadmapItem, b: RoadmapItem) => a.order - b.order\n return items\n .filter((i) => i.parent === null)\n .sort(byOrder)\n .map((h) => ({\n horizon: h,\n epics: items\n .filter((i) => i.parent === h.id && i.status !== \"done\")\n .sort((a, b) => Number(a.tasks.length > 0) - Number(b.tasks.length > 0) || byOrder(a, b)),\n }))\n .filter((g) => g.epics.length > 0)\n}\n\n/** Tick several epics → one breakdown chat per epic, all running at once (capped by free agent slots). */\nexport function BreakdownEpicsDialog({ open, onOpenChange, items }: BreakdownEpicsDialogProps) {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"max-w-lg bg-surface border-border text-txt\">\n <DialogTitle className=\"text-sm font-semibold text-txt\">Break down epics</DialogTitle>\n {/* Mounted only while open, so the default selection is recomputed on every open */}\n <BreakdownForm items={items} onDone={() => onOpenChange(false)} />\n </DialogContent>\n </Dialog>\n )\n}\n\nfunction BreakdownForm({ items, onDone }: { items: RoadmapItem[]; onDone: () => void }) {\n const groups = epicGroups(items)\n const [checked, setChecked] = useState(\n () => new Set(groups.flatMap((g) => g.epics.filter((e) => e.tasks.length === 0).map((e) => e.id))),\n )\n const running = useChats().runningCount\n const free = Math.max(0, MAX_RUNNING_CHATS - running)\n const over = checked.size > free\n\n function toggle(id: string) {\n setChecked((s) => {\n const next = new Set(s)\n if (!next.delete(id)) next.add(id)\n return next\n })\n }\n\n function submit(e: React.FormEvent) {\n e.preventDefault()\n if (!checked.size || over) return\n onDone()\n // Spine order, same message as the single-epic \"Break down with agent\"\n for (const g of groups) for (const epic of g.epics) {\n if (checked.has(epic.id)) askAgent(`Break down epic ${epic.id} into tasks.`, { newChat: true })\n }\n }\n\n return (\n <form onSubmit={submit} className=\"flex flex-col gap-3\">\n <div className=\"max-h-[50vh] overflow-y-auto rounded-md border border-border\">\n {groups.map((g) => (\n <div key={g.horizon.id}>\n <div className=\"sticky top-0 bg-surface2 px-3 py-1 text-[10px] font-mono uppercase tracking-widest text-muted\">\n {g.horizon.id} · {g.horizon.title}\n </div>\n <ul>\n {g.epics.map((epic) => {\n const on = checked.has(epic.id)\n return (\n <li key={epic.id} className=\"border-b border-border last:border-b-0\">\n <label className=\"flex items-start gap-2 px-3 py-1.5 text-xs cursor-pointer has-[:disabled]:cursor-not-allowed\">\n <input\n type=\"checkbox\"\n checked={on}\n disabled={!on && checked.size >= free}\n onChange={() => toggle(epic.id)}\n className=\"mt-0.5 accent-accent\"\n />\n <span className=\"flex-1 min-w-0 text-txt\">\n <span className=\"font-mono text-muted mr-1\">{epic.id}</span>{epic.title}\n </span>\n {epic.tasks.length > 0 && (\n <span className=\"shrink-0 text-[10px] font-mono text-muted\">has {epic.tasks.length} task{epic.tasks.length === 1 ? \"\" : \"s\"}</span>\n )}\n </label>\n </li>\n )\n })}\n </ul>\n </div>\n ))}\n </div>\n <p className={over || free === 0 ? \"text-xs text-amber\" : \"text-xs text-muted\"}>\n {free === 0\n ? `All ${MAX_RUNNING_CHATS} agent slots are busy. Stop a chat or wait for one to finish.`\n : over\n ? `${checked.size} selected, but only ${free} of ${MAX_RUNNING_CHATS} agent slots ${free === 1 ? \"is\" : \"are\"} free (${running} running). Uncheck some or stop a chat.`\n : `One chat per epic, running at once (${free} of ${MAX_RUNNING_CHATS} agent slots free). Each shows a plan before writing anything.`}\n </p>\n <div className=\"flex justify-end gap-2\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={onDone}>\n Cancel\n </Button>\n <Button type=\"submit\" size=\"sm\" disabled={!checked.size || over} className=\"bg-accent text-accent-fg hover:bg-accent/90\">\n Break down {checked.size || \"\"} epic{checked.size === 1 ? \"\" : \"s\"}\n </Button>\n </div>\n </form>\n )\n}\n"],"names":["depIds","dependsOn","Set","match","map","d","toUpperCase","settled","s","pickNextTask","epic","tasks","byId","Map","t","id","linked","get","filter","unmet","dep","status","length","kind","taskId","every","inEpic","memo","canMove","has","set","ok","waiting","push","reason","deps","join","needsHuman","w"],"mappings":"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"}