vibedoc 1.9.0 → 1.10.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 (570) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +3 -3
  3. package/.next/prerender-manifest.json +13 -13
  4. package/.next/server/app/(app)/activity/page.js.nft.json +1 -1
  5. package/.next/server/app/(app)/activity/page_client-reference-manifest.js +1 -1
  6. package/.next/server/app/(app)/board/page.js.nft.json +1 -1
  7. package/.next/server/app/(app)/board/page_client-reference-manifest.js +1 -1
  8. package/.next/server/app/(app)/chat/page.js.nft.json +1 -1
  9. package/.next/server/app/(app)/chat/page_client-reference-manifest.js +1 -1
  10. package/.next/server/app/(app)/docs/page.js.nft.json +1 -1
  11. package/.next/server/app/(app)/docs/page_client-reference-manifest.js +1 -1
  12. package/.next/server/app/(app)/explorer/page.js.nft.json +1 -1
  13. package/.next/server/app/(app)/explorer/page_client-reference-manifest.js +1 -1
  14. package/.next/server/app/(app)/manual-tests/page.js.nft.json +1 -1
  15. package/.next/server/app/(app)/manual-tests/page_client-reference-manifest.js +1 -1
  16. package/.next/server/app/(app)/memory/page.js.nft.json +1 -1
  17. package/.next/server/app/(app)/memory/page_client-reference-manifest.js +1 -1
  18. package/.next/server/app/(app)/roadmap/page.js.nft.json +1 -1
  19. package/.next/server/app/(app)/roadmap/page_client-reference-manifest.js +1 -1
  20. package/.next/server/app/(app)/settings/page.js.nft.json +1 -1
  21. package/.next/server/app/(app)/settings/page_client-reference-manifest.js +1 -1
  22. package/.next/server/app/(app)/setup/page.js.nft.json +1 -1
  23. package/.next/server/app/(app)/setup/page_client-reference-manifest.js +1 -1
  24. package/.next/server/app/_global-error.html +1 -1
  25. package/.next/server/app/_global-error.rsc +1 -1
  26. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  27. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  28. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  29. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  30. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  31. package/.next/server/app/_not-found.html +1 -1
  32. package/.next/server/app/_not-found.rsc +2 -2
  33. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  34. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  35. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  36. package/.next/server/app/activity.html +1 -1
  37. package/.next/server/app/activity.rsc +23 -22
  38. package/.next/server/app/activity.segments/!KGFwcCk/activity/__PAGE__.segment.rsc +9 -11
  39. package/.next/server/app/activity.segments/_full.segment.rsc +23 -22
  40. package/.next/server/app/activity.segments/_tree.segment.rsc +2 -2
  41. package/.next/server/app/api/activity/route.js +1 -1
  42. package/.next/server/app/api/activity/route.js.nft.json +1 -1
  43. package/.next/server/app/api/backlinks/route.js +1 -1
  44. package/.next/server/app/api/backlinks/route.js.nft.json +1 -1
  45. package/.next/server/app/api/chat/route.js +1 -1
  46. package/.next/server/app/api/chat/route.js.nft.json +1 -1
  47. package/.next/server/app/api/context/route.js +1 -1
  48. package/.next/server/app/api/context/route.js.nft.json +1 -1
  49. package/.next/server/app/api/conversations/route.js +1 -1
  50. package/.next/server/app/api/conversations/route.js.nft.json +1 -1
  51. package/.next/server/app/api/decisions/route.js +1 -1
  52. package/.next/server/app/api/decisions/route.js.nft.json +1 -1
  53. package/.next/server/app/api/docs/route.js +1 -1
  54. package/.next/server/app/api/docs/route.js.nft.json +1 -1
  55. package/.next/server/app/api/explorer/route.js +1 -1
  56. package/.next/server/app/api/explorer/route.js.nft.json +1 -1
  57. package/.next/server/app/api/mcp/route.js +1 -1
  58. package/.next/server/app/api/mcp/route.js.nft.json +1 -1
  59. package/.next/server/app/api/memory/entries/delete/route.js +1 -1
  60. package/.next/server/app/api/memory/entries/delete/route.js.nft.json +1 -1
  61. package/.next/server/app/api/memory/entries/restore/route.js +1 -1
  62. package/.next/server/app/api/memory/entries/restore/route.js.nft.json +1 -1
  63. package/.next/server/app/api/memory/entries/route.js +1 -1
  64. package/.next/server/app/api/memory/entries/route.js.nft.json +1 -1
  65. package/.next/server/app/api/memory/entries/save/route.js +1 -1
  66. package/.next/server/app/api/memory/entries/save/route.js.nft.json +1 -1
  67. package/.next/server/app/api/memory/graph/route.js +1 -1
  68. package/.next/server/app/api/memory/graph/route.js.nft.json +1 -1
  69. package/.next/server/app/api/memory/history/route.js +1 -1
  70. package/.next/server/app/api/memory/history/route.js.nft.json +1 -1
  71. package/.next/server/app/api/memory/route.js +1 -1
  72. package/.next/server/app/api/memory/route.js.nft.json +1 -1
  73. package/.next/server/app/api/plan/apply/route.js +1 -1
  74. package/.next/server/app/api/plan/apply/route.js.nft.json +1 -1
  75. package/.next/server/app/api/projects/route.js +1 -1
  76. package/.next/server/app/api/projects/route.js.nft.json +1 -1
  77. package/.next/server/app/api/registry/route.js +1 -1
  78. package/.next/server/app/api/registry/route.js.nft.json +1 -1
  79. package/.next/server/app/api/roadmap/create/route.js +1 -1
  80. package/.next/server/app/api/roadmap/create/route.js.nft.json +1 -1
  81. package/.next/server/app/api/roadmap/delete/route.js +1 -1
  82. package/.next/server/app/api/roadmap/delete/route.js.nft.json +1 -1
  83. package/.next/server/app/api/roadmap/generate/route.js +1 -1
  84. package/.next/server/app/api/roadmap/generate/route.js.nft.json +1 -1
  85. package/.next/server/app/api/roadmap/layout/route.js +1 -1
  86. package/.next/server/app/api/roadmap/layout/route.js.nft.json +1 -1
  87. package/.next/server/app/api/roadmap/restore/route.js +1 -1
  88. package/.next/server/app/api/roadmap/restore/route.js.nft.json +1 -1
  89. package/.next/server/app/api/roadmap/route.js +1 -1
  90. package/.next/server/app/api/roadmap/route.js.nft.json +1 -1
  91. package/.next/server/app/api/roadmap/update/route.js +1 -1
  92. package/.next/server/app/api/roadmap/update/route.js.nft.json +1 -1
  93. package/.next/server/app/api/sessions/route.js +1 -1
  94. package/.next/server/app/api/sessions/route.js.nft.json +1 -1
  95. package/.next/server/app/api/settings/route.js +1 -1
  96. package/.next/server/app/api/settings/route.js.nft.json +1 -1
  97. package/.next/server/app/api/setup/generate/route.js +1 -1
  98. package/.next/server/app/api/setup/generate/route.js.nft.json +1 -1
  99. package/.next/server/app/api/setup/write/route.js +1 -1
  100. package/.next/server/app/api/setup/write/route.js.nft.json +1 -1
  101. package/.next/server/app/api/summary/route.js +1 -1
  102. package/.next/server/app/api/summary/route.js.nft.json +1 -1
  103. package/.next/server/app/api/tasks/bulk/route.js +1 -1
  104. package/.next/server/app/api/tasks/bulk/route.js.nft.json +1 -1
  105. package/.next/server/app/api/tasks/create/route.js +1 -1
  106. package/.next/server/app/api/tasks/create/route.js.nft.json +1 -1
  107. package/.next/server/app/api/tasks/delete/route.js +1 -1
  108. package/.next/server/app/api/tasks/delete/route.js.nft.json +1 -1
  109. package/.next/server/app/api/tasks/manual-tests/route.js +1 -1
  110. package/.next/server/app/api/tasks/manual-tests/route.js.nft.json +1 -1
  111. package/.next/server/app/api/tasks/restore/route.js +1 -1
  112. package/.next/server/app/api/tasks/restore/route.js.nft.json +1 -1
  113. package/.next/server/app/api/tasks/review/route.js +1 -1
  114. package/.next/server/app/api/tasks/review/route.js.nft.json +1 -1
  115. package/.next/server/app/api/tasks/route.js +1 -1
  116. package/.next/server/app/api/tasks/route.js.nft.json +1 -1
  117. package/.next/server/app/api/tasks/update/route.js +1 -1
  118. package/.next/server/app/api/tasks/update/route.js.nft.json +1 -1
  119. package/.next/server/app/api/views/route.js +1 -1
  120. package/.next/server/app/api/views/route.js.nft.json +1 -1
  121. package/.next/server/app/board.html +1 -1
  122. package/.next/server/app/board.rsc +23 -22
  123. package/.next/server/app/board.segments/!KGFwcCk/board/__PAGE__.segment.rsc +6 -6
  124. package/.next/server/app/board.segments/_full.segment.rsc +23 -22
  125. package/.next/server/app/board.segments/_tree.segment.rsc +2 -2
  126. package/.next/server/app/chat.html +1 -1
  127. package/.next/server/app/chat.rsc +23 -22
  128. package/.next/server/app/chat.segments/!KGFwcCk/chat/__PAGE__.segment.rsc +11 -9
  129. package/.next/server/app/chat.segments/_full.segment.rsc +23 -22
  130. package/.next/server/app/chat.segments/_tree.segment.rsc +2 -2
  131. package/.next/server/app/docs.html +1 -1
  132. package/.next/server/app/docs.rsc +23 -22
  133. package/.next/server/app/docs.segments/!KGFwcCk/docs/__PAGE__.segment.rsc +6 -6
  134. package/.next/server/app/docs.segments/_full.segment.rsc +23 -22
  135. package/.next/server/app/docs.segments/_tree.segment.rsc +2 -2
  136. package/.next/server/app/explorer.html +1 -1
  137. package/.next/server/app/explorer.rsc +23 -22
  138. package/.next/server/app/explorer.segments/!KGFwcCk/explorer/__PAGE__.segment.rsc +5 -5
  139. package/.next/server/app/explorer.segments/_full.segment.rsc +23 -22
  140. package/.next/server/app/explorer.segments/_tree.segment.rsc +2 -2
  141. package/.next/server/app/index.html +1 -1
  142. package/.next/server/app/index.rsc +2 -2
  143. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  144. package/.next/server/app/index.segments/_full.segment.rsc +2 -2
  145. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  146. package/.next/server/app/manual-tests.html +1 -1
  147. package/.next/server/app/manual-tests.rsc +23 -22
  148. package/.next/server/app/manual-tests.segments/!KGFwcCk/manual-tests/__PAGE__.segment.rsc +5 -5
  149. package/.next/server/app/manual-tests.segments/_full.segment.rsc +23 -22
  150. package/.next/server/app/manual-tests.segments/_tree.segment.rsc +2 -2
  151. package/.next/server/app/memory.html +1 -1
  152. package/.next/server/app/memory.rsc +23 -22
  153. package/.next/server/app/memory.segments/!KGFwcCk/memory/__PAGE__.segment.rsc +9 -11
  154. package/.next/server/app/memory.segments/_full.segment.rsc +23 -22
  155. package/.next/server/app/memory.segments/_tree.segment.rsc +2 -2
  156. package/.next/server/app/page.js.nft.json +1 -1
  157. package/.next/server/app/page_client-reference-manifest.js +1 -1
  158. package/.next/server/app/roadmap.html +1 -1
  159. package/.next/server/app/roadmap.rsc +23 -22
  160. package/.next/server/app/roadmap.segments/!KGFwcCk/roadmap/__PAGE__.segment.rsc +6 -6
  161. package/.next/server/app/roadmap.segments/_full.segment.rsc +23 -22
  162. package/.next/server/app/roadmap.segments/_tree.segment.rsc +2 -2
  163. package/.next/server/app/settings.html +1 -1
  164. package/.next/server/app/settings.rsc +23 -22
  165. package/.next/server/app/settings.segments/!KGFwcCk/settings/__PAGE__.segment.rsc +9 -10
  166. package/.next/server/app/settings.segments/_full.segment.rsc +23 -22
  167. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  168. package/.next/server/app/setup.html +1 -1
  169. package/.next/server/app/setup.rsc +23 -22
  170. package/.next/server/app/setup.segments/!KGFwcCk/setup/__PAGE__.segment.rsc +5 -5
  171. package/.next/server/app/setup.segments/_full.segment.rsc +23 -22
  172. package/.next/server/app/setup.segments/_tree.segment.rsc +2 -2
  173. package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0-_cqh8._.js → 11mp_@anthropic-ai_sdk_053zt3c._.js} +1 -1
  174. package/.next/server/chunks/{11mp_@anthropic-ai_sdk_03cp17a._.js → 11mp_@anthropic-ai_sdk_0_zx69c._.js} +1 -1
  175. package/.next/server/chunks/{11mp_@anthropic-ai_sdk_00o5o78._.js → 11mp_@anthropic-ai_sdk_0gvxfg3._.js} +1 -1
  176. package/.next/server/chunks/{11mp_@anthropic-ai_sdk_07dk2er._.js → 11mp_@anthropic-ai_sdk_0gx5t2l._.js} +1 -1
  177. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0krkw4y._.js +3 -0
  178. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0l0xzie._.js +3 -0
  179. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0pgjvhr._.js +3 -0
  180. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0r-keh6._.js +3 -0
  181. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0tvfbjt._.js +3 -0
  182. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0u4b8_f._.js +3 -0
  183. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0ud37xh._.js +3 -0
  184. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0v3ar-t._.js +3 -0
  185. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0wk0b65._.js +3 -0
  186. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0wqkd2r._.js +3 -0
  187. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0wypotx._.js +3 -0
  188. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0yuq-9s._.js +3 -0
  189. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0z-e57x._.js +3 -0
  190. package/.next/server/chunks/11mp_@anthropic-ai_sdk_108ltz4._.js +3 -0
  191. package/.next/server/chunks/11mp_@anthropic-ai_sdk_10c_i6_._.js +3 -0
  192. package/.next/server/chunks/11mp_@anthropic-ai_sdk_14jogs8._.js +3 -0
  193. package/.next/server/chunks/11mp_@anthropic-ai_sdk_15u-n39._.js +3 -0
  194. package/.next/server/chunks/11mp_@anthropic-ai_sdk_194ahxu._.js +3 -0
  195. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1ahph2t._.js +3 -0
  196. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1ajy77y._.js +3 -0
  197. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1b57s9p._.js +3 -0
  198. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1brf2xn._.js +3 -0
  199. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1btfw2x._.js +3 -0
  200. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1cyy_q6._.js +3 -0
  201. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1fz9fev._.js +3 -0
  202. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1i_rz7h._.js +3 -0
  203. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1it8zsv._.js +3 -0
  204. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1jzusvd._.js +3 -0
  205. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1lfknr2._.js +3 -0
  206. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1mewd-3._.js +3 -0
  207. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1mkm4u_._.js +3 -0
  208. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1rggqq3._.js +3 -0
  209. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1rhjf1m._.js +3 -0
  210. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1s6ks8c._.js +3 -0
  211. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1u8z4hp._.js +3 -0
  212. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1vyy3_4._.js +3 -0
  213. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_036bvwf._.js +3 -0
  214. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_046taqd._.js +3 -0
  215. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0bxad5f._.js +3 -0
  216. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0g65abt._.js +3 -0
  217. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0pb9bu1._.js +3 -0
  218. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_120-cio._.js +3 -0
  219. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_13uyu_v._.js +3 -0
  220. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_13x2ww0._.js +3 -0
  221. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_17og64d._.js +3 -0
  222. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1e_sh4o._.js +3 -0
  223. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1ecuo9i._.js +3 -0
  224. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1go8d0m._.js +3 -0
  225. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1i13ryx._.js +3 -0
  226. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1jv_hid._.js +3 -0
  227. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1mh5mqk._.js +3 -0
  228. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1oq7e8u._.js +3 -0
  229. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1p-cq-p._.js +3 -0
  230. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1the3g0._.js +3 -0
  231. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1xubh-w._.js +3 -0
  232. package/.next/server/chunks/{[root-of-the-server]__0hfyuhq._.js → [root-of-the-server]__00o3mbd._.js} +2 -2
  233. package/.next/server/chunks/{[root-of-the-server]__0y5usoz._.js → [root-of-the-server]__01n_hoh._.js} +2 -2
  234. package/.next/server/chunks/{[root-of-the-server]__08yaps5._.js → [root-of-the-server]__05tx02j._.js} +2 -2
  235. package/.next/server/chunks/{[root-of-the-server]__0b2488c._.js → [root-of-the-server]__06dfvb0._.js} +2 -2
  236. package/.next/server/chunks/{[root-of-the-server]__1tu85zx._.js → [root-of-the-server]__06z8i6e._.js} +2 -2
  237. package/.next/server/chunks/{[root-of-the-server]__0qij7wy._.js → [root-of-the-server]__076d4xm._.js} +2 -2
  238. package/.next/server/chunks/{[root-of-the-server]__1z3tswg._.js → [root-of-the-server]__09j_-hj._.js} +2 -2
  239. package/.next/server/chunks/[root-of-the-server]__0jr_5eq._.js +11 -11
  240. package/.next/server/chunks/[root-of-the-server]__0jr_5eq._.js.map +1 -1
  241. package/.next/server/chunks/{[root-of-the-server]__1gvv2xp._.js → [root-of-the-server]__0kuhhna._.js} +2 -2
  242. package/.next/server/chunks/{[root-of-the-server]__008focd._.js → [root-of-the-server]__0p4w_o-._.js} +2 -2
  243. package/.next/server/chunks/{[root-of-the-server]__1ssunti._.js → [root-of-the-server]__0uu9pgg._.js} +2 -2
  244. package/.next/server/chunks/{[root-of-the-server]__1b448u7._.js → [root-of-the-server]__1-1hfrj._.js} +2 -2
  245. package/.next/server/chunks/{[root-of-the-server]__0ikbk15._.js → [root-of-the-server]__15jhpgl._.js} +2 -2
  246. package/.next/server/chunks/[root-of-the-server]__19rxcu4._.js +11 -11
  247. package/.next/server/chunks/[root-of-the-server]__19rxcu4._.js.map +1 -1
  248. package/.next/server/chunks/{[root-of-the-server]__0m8hmg0._.js → [root-of-the-server]__19w-7h9._.js} +2 -2
  249. package/.next/server/chunks/{[root-of-the-server]__01xmabe._.js → [root-of-the-server]__1af-wfk._.js} +2 -2
  250. package/.next/server/chunks/{[root-of-the-server]__0cbh1s-._.js → [root-of-the-server]__1e_o8h4._.js} +2 -2
  251. package/.next/server/chunks/{[root-of-the-server]__16u25oa._.js → [root-of-the-server]__1gr4e22._.js} +2 -2
  252. package/.next/server/chunks/{[root-of-the-server]__1jz98vb._.js → [root-of-the-server]__1h5hb6u._.js} +2 -2
  253. package/.next/server/chunks/{[root-of-the-server]__1xpp36t._.js → [root-of-the-server]__1kw2vct._.js} +2 -2
  254. package/.next/server/chunks/{[root-of-the-server]__0axugex._.js → [root-of-the-server]__1lt5cds._.js} +2 -2
  255. package/.next/server/chunks/[root-of-the-server]__1qd-ecl._.js +11 -11
  256. package/.next/server/chunks/[root-of-the-server]__1qd-ecl._.js.map +1 -1
  257. package/.next/server/chunks/{[root-of-the-server]__03ogp2r._.js → [root-of-the-server]__1rjgpbm._.js} +2 -2
  258. package/.next/server/chunks/{[root-of-the-server]__0x8wtot._.js → [root-of-the-server]__1spley9._.js} +2 -2
  259. package/.next/server/chunks/_04byth9._.js +25 -25
  260. package/.next/server/chunks/_04byth9._.js.map +1 -1
  261. package/.next/server/chunks/_1au4syj._.js +1 -1
  262. package/.next/server/chunks/_1au4syj._.js.map +1 -1
  263. package/.next/server/chunks/ssr/{0_nd_mermaid_dist_mermaid_core_mjs_027n2yl._.js → 0_nd_mermaid_dist_mermaid_core_mjs_0itmgkm._.js} +2 -2
  264. package/.next/server/chunks/ssr/{1u84_katex_dist_katex_mjs_1kb5xea._.js → 1u84_katex_dist_katex_mjs_08jn-sj._.js} +1 -1
  265. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_1tcci-3._.js +3 -0
  266. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_1tcci-3._.js.map +1 -0
  267. package/.next/server/chunks/ssr/{1x05_lucide-react_dist_esm_icons_14hl50o._.js → 1x05_lucide-react_dist_esm_icons_1uybmua._.js} +2 -2
  268. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_1uybmua._.js.map +1 -0
  269. package/.next/server/chunks/ssr/_04xff_2._.js +1 -1
  270. package/.next/server/chunks/ssr/_04xff_2._.js.map +1 -1
  271. package/.next/server/chunks/ssr/_0h91h9n._.js +3 -0
  272. package/.next/server/chunks/ssr/_0h91h9n._.js.map +1 -0
  273. package/.next/server/chunks/ssr/_0idb-vo._.js.map +1 -1
  274. package/.next/server/chunks/ssr/_0ip7sg0._.js +3 -0
  275. package/.next/server/chunks/ssr/_0ip7sg0._.js.map +1 -0
  276. package/.next/server/chunks/ssr/_0ks_bep._.js +3 -0
  277. package/.next/server/chunks/ssr/_0ks_bep._.js.map +1 -0
  278. package/.next/server/chunks/ssr/{_1ocnpth._.js → _0lqrpim._.js} +2 -2
  279. package/.next/server/chunks/ssr/_0lqrpim._.js.map +1 -0
  280. package/.next/server/chunks/ssr/_0qp3gu7._.js +1 -1
  281. package/.next/server/chunks/ssr/_0qp3gu7._.js.map +1 -1
  282. package/.next/server/chunks/ssr/_0rmo9r-._.js +4 -0
  283. package/.next/server/chunks/ssr/_0rmo9r-._.js.map +1 -0
  284. package/.next/server/chunks/ssr/_0ust7tw._.js +4 -0
  285. package/.next/server/chunks/ssr/_0ust7tw._.js.map +1 -0
  286. package/.next/server/chunks/ssr/_197jl3g._.js +3 -0
  287. package/.next/server/chunks/ssr/_197jl3g._.js.map +1 -0
  288. package/.next/server/chunks/ssr/{src_components_docs_MarkdownRenderer_tsx_1kshaz1._.js → _19k2iz0._.js} +21 -21
  289. package/.next/server/chunks/ssr/_19k2iz0._.js.map +1 -0
  290. package/.next/server/chunks/ssr/_1el478k._.js +3 -0
  291. package/.next/server/chunks/ssr/_1el478k._.js.map +1 -0
  292. package/.next/server/chunks/ssr/_1s2ya35._.js +3 -0
  293. package/.next/server/chunks/ssr/_1t76zdx._.js +1 -1
  294. package/.next/server/chunks/ssr/_1t76zdx._.js.map +1 -1
  295. package/.next/server/chunks/ssr/{node_modules__pnpm_1qp_jvj._.js → node_modules__pnpm_00lsytc._.js} +2 -2
  296. package/.next/server/chunks/ssr/{node_modules__pnpm_1ygal0c._.js → node_modules__pnpm_02p2rqs._.js} +1 -1
  297. package/.next/server/chunks/ssr/{node_modules__pnpm_1-76qxg._.js → node_modules__pnpm_05-p8zy._.js} +1 -1
  298. package/.next/server/chunks/ssr/{node_modules__pnpm_1qmkxyo._.js → node_modules__pnpm_060kz-j._.js} +1 -1
  299. package/.next/server/chunks/ssr/{node_modules__pnpm_0ctisl0._.js → node_modules__pnpm_0_83tv8._.js} +1 -1
  300. package/.next/server/chunks/ssr/{node_modules__pnpm_0ycbjbd._.js → node_modules__pnpm_0_ajzll._.js} +2 -2
  301. package/.next/server/chunks/ssr/{node_modules__pnpm_0kpu0-2._.js → node_modules__pnpm_0abf_e9._.js} +1 -1
  302. package/.next/server/chunks/ssr/{node_modules__pnpm_0fwp8jm._.js → node_modules__pnpm_0e55e7-._.js} +1 -1
  303. package/.next/server/chunks/ssr/{node_modules__pnpm_1q_hhr3._.js → node_modules__pnpm_0eub17j._.js} +2 -2
  304. package/.next/server/chunks/ssr/{node_modules__pnpm_1-r94f7._.js → node_modules__pnpm_0gp90ei._.js} +1 -1
  305. package/.next/server/chunks/ssr/{node_modules__pnpm_16u1vfb._.js → node_modules__pnpm_0iqb0_x._.js} +2 -2
  306. package/.next/server/chunks/ssr/{node_modules__pnpm_1uwkcin._.js → node_modules__pnpm_0j7asqf._.js} +1 -1
  307. package/.next/server/chunks/ssr/{node_modules__pnpm_1f440kx._.js → node_modules__pnpm_0jlzk5z._.js} +1 -1
  308. package/.next/server/chunks/ssr/{node_modules__pnpm_14piqi4._.js → node_modules__pnpm_0rsfj9v._.js} +1 -1
  309. package/.next/server/chunks/ssr/{node_modules__pnpm_01bjcv9._.js → node_modules__pnpm_0s63lee._.js} +1 -1
  310. package/.next/server/chunks/ssr/{node_modules__pnpm_189m48n._.js → node_modules__pnpm_0s7j-tv._.js} +1 -1
  311. package/.next/server/chunks/ssr/{node_modules__pnpm_1ssjj4u._.js → node_modules__pnpm_0up4z7m._.js} +1 -1
  312. package/.next/server/chunks/ssr/{node_modules__pnpm_06d-fdo._.js → node_modules__pnpm_0v_mhl7._.js} +2 -2
  313. package/.next/server/chunks/ssr/{node_modules__pnpm_1a48_nl._.js → node_modules__pnpm_0vuao3_._.js} +1 -1
  314. package/.next/server/chunks/ssr/{node_modules__pnpm_0vry74x._.js → node_modules__pnpm_14j18h7._.js} +2 -2
  315. package/.next/server/chunks/ssr/{node_modules__pnpm_17i6z2d._.js → node_modules__pnpm_16bj927._.js} +1 -1
  316. package/.next/server/chunks/ssr/{node_modules__pnpm_192f222._.js → node_modules__pnpm_1ch46nl._.js} +1 -1
  317. package/.next/server/chunks/ssr/{node_modules__pnpm_1txccoj._.js → node_modules__pnpm_1dc-yxd._.js} +1 -1
  318. package/.next/server/chunks/ssr/{node_modules__pnpm_1min2jl._.js → node_modules__pnpm_1fry8_2._.js} +1 -1
  319. package/.next/server/chunks/ssr/{node_modules__pnpm_1fn3ejy._.js → node_modules__pnpm_1gpkxns._.js} +1 -1
  320. package/.next/server/chunks/ssr/{node_modules__pnpm_1aa37e1._.js → node_modules__pnpm_1hqh95z._.js} +1 -1
  321. package/.next/server/chunks/ssr/{node_modules__pnpm_03qrzdb._.js → node_modules__pnpm_1oaf50x._.js} +1 -1
  322. package/.next/server/chunks/ssr/src_app_(app)_board_page_tsx_0gpfc77._.js +1 -1
  323. package/.next/server/chunks/ssr/src_app_(app)_board_page_tsx_0gpfc77._.js.map +1 -1
  324. package/.next/server/chunks/ssr/src_app_(app)_layout_tsx_1yu5hom._.js +1 -1
  325. package/.next/server/chunks/ssr/src_app_(app)_layout_tsx_1yu5hom._.js.map +1 -1
  326. package/.next/server/chunks/ssr/src_app_(app)_memory_page_tsx_19jhb1c._.js +2 -2
  327. package/.next/server/chunks/ssr/src_app_(app)_memory_page_tsx_19jhb1c._.js.map +1 -1
  328. package/.next/server/chunks/ssr/src_app_(app)_roadmap_page_tsx_0vcq3jr._.js +2 -2
  329. package/.next/server/chunks/ssr/src_app_(app)_roadmap_page_tsx_0vcq3jr._.js.map +1 -1
  330. package/.next/server/chunks/ssr/src_app_(app)_settings_page_tsx_0zevtee._.js +2 -2
  331. package/.next/server/chunks/ssr/src_app_(app)_settings_page_tsx_0zevtee._.js.map +1 -1
  332. package/.next/server/chunks/ssr/src_app_(app)_setup_page_tsx_1yids_n._.js +1 -1
  333. package/.next/server/chunks/ssr/src_app_(app)_setup_page_tsx_1yids_n._.js.map +1 -1
  334. package/.next/server/chunks/ssr/src_components_0eyr_zi._.js +1 -1
  335. package/.next/server/chunks/ssr/src_components_0eyr_zi._.js.map +1 -1
  336. package/.next/server/chunks/ssr/src_components_1s861m8._.js +1 -1
  337. package/.next/server/chunks/ssr/src_components_1s861m8._.js.map +1 -1
  338. package/.next/server/chunks/ssr/src_components_docs_editor-theme_ts_0ji4rd5._.js +3 -0
  339. package/.next/server/chunks/ssr/src_components_docs_editor-theme_ts_0ji4rd5._.js.map +1 -0
  340. package/.next/server/middleware-build-manifest.js +3 -3
  341. package/.next/server/pages/404.html +1 -1
  342. package/.next/server/pages/500.html +1 -1
  343. package/.next/server/server-reference-manifest.js +1 -1
  344. package/.next/server/server-reference-manifest.json +1 -1
  345. package/.next/static/chunks/05qw7-fs1exlt.js +1 -0
  346. package/.next/static/chunks/{16k196zyl-n9q.js → 08sqjdq-43nbt.js} +1 -1
  347. package/.next/static/chunks/09r4_4wr0aga3.js +1 -0
  348. package/.next/static/chunks/0xw_sa58zqv5s.js +1 -0
  349. package/.next/static/chunks/{3ruw8lu2_re-h.js → 1-a3-6c_nce84.js} +1 -1
  350. package/.next/static/chunks/13cz-8lvre7gj.js +1 -0
  351. package/.next/static/chunks/149fj-mseo8q3.css +1 -0
  352. package/.next/static/chunks/1c11k-snzp541.js +1 -0
  353. package/.next/static/chunks/1c459q7xpgq6r.js +3 -0
  354. package/.next/static/chunks/1hh2cxd9ndxf-.js +68 -0
  355. package/.next/static/chunks/1huu1nljqois-.js +1 -0
  356. package/.next/static/chunks/{1l_dys0-y5-r7.js → 1n4_u3om7ye4z.js} +1 -1
  357. package/.next/static/chunks/1qhndyi2gdbkf.js +1 -0
  358. package/.next/static/chunks/1s64z5c36fv-4.js +21 -0
  359. package/.next/static/chunks/1x40-5s54wd5m.js +11 -0
  360. package/.next/static/chunks/2-0lpccy0f8bk.js +2 -0
  361. package/.next/static/chunks/2x6eh3w-u8lk4.js +1 -0
  362. package/.next/static/chunks/30s090l71e1gs.js +1 -0
  363. package/.next/static/chunks/37u2gjz5dzhep.js +1 -0
  364. package/.next/static/chunks/3t8px4aygy1s9.js +1 -0
  365. package/.next/static/chunks/{0b547y6rqct9z.js → 44gr_v5092gwh.js} +1 -1
  366. package/package.json +3 -2
  367. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0_e9zpr._.js +0 -3
  368. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0_xx_qf._.js +0 -3
  369. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0aer9lc._.js +0 -3
  370. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0ax30pe._.js +0 -3
  371. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0gn7vgs._.js +0 -3
  372. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0hye94a._.js +0 -3
  373. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0ir5cgk._.js +0 -3
  374. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0je0_pa._.js +0 -3
  375. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0jfgh0o._.js +0 -3
  376. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0mha4x1._.js +0 -3
  377. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0n__boa._.js +0 -3
  378. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0sqv26_._.js +0 -3
  379. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0wnc6g-._.js +0 -3
  380. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0xh0g59._.js +0 -3
  381. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1-5wyhj._.js +0 -3
  382. package/.next/server/chunks/11mp_@anthropic-ai_sdk_13ahm3n._.js +0 -3
  383. package/.next/server/chunks/11mp_@anthropic-ai_sdk_13e6aq4._.js +0 -3
  384. package/.next/server/chunks/11mp_@anthropic-ai_sdk_14eg0ld._.js +0 -3
  385. package/.next/server/chunks/11mp_@anthropic-ai_sdk_15md1n2._.js +0 -3
  386. package/.next/server/chunks/11mp_@anthropic-ai_sdk_16av8b9._.js +0 -3
  387. package/.next/server/chunks/11mp_@anthropic-ai_sdk_16hjhv1._.js +0 -3
  388. package/.next/server/chunks/11mp_@anthropic-ai_sdk_16txvf7._.js +0 -3
  389. package/.next/server/chunks/11mp_@anthropic-ai_sdk_198yu7d._.js +0 -3
  390. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1_9tfq3._.js +0 -3
  391. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1_izr2o._.js +0 -3
  392. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1fljcyg._.js +0 -3
  393. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1lrt6ul._.js +0 -3
  394. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1nev_ee._.js +0 -3
  395. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1pgoe2i._.js +0 -3
  396. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1rgl7mu._.js +0 -3
  397. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1slq49k._.js +0 -3
  398. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1t9bdf0._.js +0 -3
  399. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1u6qqm2._.js +0 -3
  400. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1v7ygvz._.js +0 -3
  401. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1wls8zc._.js +0 -3
  402. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1ywboja._.js +0 -3
  403. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_00kwqu5._.js +0 -3
  404. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_01j2nrd._.js +0 -3
  405. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_05ybj3t._.js +0 -3
  406. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0adt7jj._.js +0 -3
  407. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0bnl14w._.js +0 -3
  408. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0f557t9._.js +0 -3
  409. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0ra6giw._.js +0 -3
  410. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_107cqfx._.js +0 -3
  411. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1377sl6._.js +0 -3
  412. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1_2hcok._.js +0 -3
  413. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1g--m6y._.js +0 -3
  414. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1geopi5._.js +0 -3
  415. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1i11dte._.js +0 -3
  416. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1mj3_qk._.js +0 -3
  417. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1qgy210._.js +0 -3
  418. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1rkng9q._.js +0 -3
  419. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1vr8q8y._.js +0 -3
  420. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1x8b64g._.js +0 -3
  421. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1zhahf7._.js +0 -3
  422. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_0wurouw._.js +0 -3
  423. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_0wurouw._.js.map +0 -1
  424. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_14hl50o._.js.map +0 -1
  425. package/.next/server/chunks/ssr/_071j6mr._.js +0 -4
  426. package/.next/server/chunks/ssr/_071j6mr._.js.map +0 -1
  427. package/.next/server/chunks/ssr/_0i75x-o._.js +0 -3
  428. package/.next/server/chunks/ssr/_0i75x-o._.js.map +0 -1
  429. package/.next/server/chunks/ssr/_15qpb4z._.js +0 -3
  430. package/.next/server/chunks/ssr/_15qpb4z._.js.map +0 -1
  431. package/.next/server/chunks/ssr/_1fg0usp._.js +0 -3
  432. package/.next/server/chunks/ssr/_1fg0usp._.js.map +0 -1
  433. package/.next/server/chunks/ssr/_1h0wfpz._.js +0 -3
  434. package/.next/server/chunks/ssr/_1h0wfpz._.js.map +0 -1
  435. package/.next/server/chunks/ssr/_1ncdakv._.js +0 -4
  436. package/.next/server/chunks/ssr/_1ncdakv._.js.map +0 -1
  437. package/.next/server/chunks/ssr/_1ocnpth._.js.map +0 -1
  438. package/.next/server/chunks/ssr/_1uno162._.js +0 -3
  439. package/.next/server/chunks/ssr/_1uno162._.js.map +0 -1
  440. package/.next/server/chunks/ssr/node_modules__pnpm_1xeothw._.js +0 -3
  441. package/.next/server/chunks/ssr/src_components_docs_MarkdownRenderer_tsx_1kshaz1._.js.map +0 -1
  442. package/.next/static/chunks/02cj5_i9np4sg.js +0 -3
  443. package/.next/static/chunks/0e3ha56i_0j05.css +0 -1
  444. package/.next/static/chunks/0f32hudp0yir7.js +0 -2
  445. package/.next/static/chunks/0rsmz1jgro1kj.js +0 -1
  446. package/.next/static/chunks/0wnq_kh8-6wc1.js +0 -2
  447. package/.next/static/chunks/13l4l-boqg8fx.js +0 -1
  448. package/.next/static/chunks/14hxe1qiaram9.js +0 -1
  449. package/.next/static/chunks/18b5l8p0vd9f8.js +0 -1
  450. package/.next/static/chunks/1acpfyut6j4e2.js +0 -1
  451. package/.next/static/chunks/1rko_88i85yqb.js +0 -21
  452. package/.next/static/chunks/1tu8lforstp1o.js +0 -1
  453. package/.next/static/chunks/20mdcup14_0yi.js +0 -11
  454. package/.next/static/chunks/23-xknrz6o748.js +0 -1
  455. package/.next/static/chunks/2p-pkveutoh75.js +0 -1
  456. package/.next/static/chunks/329sozud9-tvr.js +0 -1
  457. package/.next/static/chunks/3qqvn9vv6i0gy.js +0 -68
  458. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0-_cqh8._.js.map → 11mp_@anthropic-ai_sdk_053zt3c._.js.map} +0 -0
  459. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_00o5o78._.js.map → 11mp_@anthropic-ai_sdk_0_zx69c._.js.map} +0 -0
  460. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_03cp17a._.js.map → 11mp_@anthropic-ai_sdk_0gvxfg3._.js.map} +0 -0
  461. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_07dk2er._.js.map → 11mp_@anthropic-ai_sdk_0gx5t2l._.js.map} +0 -0
  462. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0_e9zpr._.js.map → 11mp_@anthropic-ai_sdk_0krkw4y._.js.map} +0 -0
  463. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0_xx_qf._.js.map → 11mp_@anthropic-ai_sdk_0l0xzie._.js.map} +0 -0
  464. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0aer9lc._.js.map → 11mp_@anthropic-ai_sdk_0pgjvhr._.js.map} +0 -0
  465. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0ax30pe._.js.map → 11mp_@anthropic-ai_sdk_0r-keh6._.js.map} +0 -0
  466. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0gn7vgs._.js.map → 11mp_@anthropic-ai_sdk_0tvfbjt._.js.map} +0 -0
  467. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0hye94a._.js.map → 11mp_@anthropic-ai_sdk_0u4b8_f._.js.map} +0 -0
  468. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0ir5cgk._.js.map → 11mp_@anthropic-ai_sdk_0ud37xh._.js.map} +0 -0
  469. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0je0_pa._.js.map → 11mp_@anthropic-ai_sdk_0v3ar-t._.js.map} +0 -0
  470. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0jfgh0o._.js.map → 11mp_@anthropic-ai_sdk_0wk0b65._.js.map} +0 -0
  471. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0mha4x1._.js.map → 11mp_@anthropic-ai_sdk_0wqkd2r._.js.map} +0 -0
  472. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0n__boa._.js.map → 11mp_@anthropic-ai_sdk_0wypotx._.js.map} +0 -0
  473. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0sqv26_._.js.map → 11mp_@anthropic-ai_sdk_0yuq-9s._.js.map} +0 -0
  474. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0wnc6g-._.js.map → 11mp_@anthropic-ai_sdk_0z-e57x._.js.map} +0 -0
  475. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0xh0g59._.js.map → 11mp_@anthropic-ai_sdk_108ltz4._.js.map} +0 -0
  476. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1-5wyhj._.js.map → 11mp_@anthropic-ai_sdk_10c_i6_._.js.map} +0 -0
  477. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_13ahm3n._.js.map → 11mp_@anthropic-ai_sdk_14jogs8._.js.map} +0 -0
  478. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_13e6aq4._.js.map → 11mp_@anthropic-ai_sdk_15u-n39._.js.map} +0 -0
  479. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_14eg0ld._.js.map → 11mp_@anthropic-ai_sdk_194ahxu._.js.map} +0 -0
  480. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_15md1n2._.js.map → 11mp_@anthropic-ai_sdk_1ahph2t._.js.map} +0 -0
  481. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_16av8b9._.js.map → 11mp_@anthropic-ai_sdk_1ajy77y._.js.map} +0 -0
  482. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_16hjhv1._.js.map → 11mp_@anthropic-ai_sdk_1b57s9p._.js.map} +0 -0
  483. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_16txvf7._.js.map → 11mp_@anthropic-ai_sdk_1brf2xn._.js.map} +0 -0
  484. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_198yu7d._.js.map → 11mp_@anthropic-ai_sdk_1btfw2x._.js.map} +0 -0
  485. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1_9tfq3._.js.map → 11mp_@anthropic-ai_sdk_1cyy_q6._.js.map} +0 -0
  486. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1_izr2o._.js.map → 11mp_@anthropic-ai_sdk_1fz9fev._.js.map} +0 -0
  487. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1fljcyg._.js.map → 11mp_@anthropic-ai_sdk_1i_rz7h._.js.map} +0 -0
  488. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1lrt6ul._.js.map → 11mp_@anthropic-ai_sdk_1it8zsv._.js.map} +0 -0
  489. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1nev_ee._.js.map → 11mp_@anthropic-ai_sdk_1jzusvd._.js.map} +0 -0
  490. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1pgoe2i._.js.map → 11mp_@anthropic-ai_sdk_1lfknr2._.js.map} +0 -0
  491. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1rgl7mu._.js.map → 11mp_@anthropic-ai_sdk_1mewd-3._.js.map} +0 -0
  492. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1slq49k._.js.map → 11mp_@anthropic-ai_sdk_1mkm4u_._.js.map} +0 -0
  493. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1t9bdf0._.js.map → 11mp_@anthropic-ai_sdk_1rggqq3._.js.map} +0 -0
  494. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1u6qqm2._.js.map → 11mp_@anthropic-ai_sdk_1rhjf1m._.js.map} +0 -0
  495. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1v7ygvz._.js.map → 11mp_@anthropic-ai_sdk_1s6ks8c._.js.map} +0 -0
  496. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1wls8zc._.js.map → 11mp_@anthropic-ai_sdk_1u8z4hp._.js.map} +0 -0
  497. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1ywboja._.js.map → 11mp_@anthropic-ai_sdk_1vyy3_4._.js.map} +0 -0
  498. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_00kwqu5._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_036bvwf._.js.map} +0 -0
  499. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_01j2nrd._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_046taqd._.js.map} +0 -0
  500. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_05ybj3t._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0bxad5f._.js.map} +0 -0
  501. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_0adt7jj._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0g65abt._.js.map} +0 -0
  502. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_0bnl14w._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0pb9bu1._.js.map} +0 -0
  503. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_0f557t9._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_120-cio._.js.map} +0 -0
  504. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_0ra6giw._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_13uyu_v._.js.map} +0 -0
  505. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_107cqfx._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_13x2ww0._.js.map} +0 -0
  506. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1377sl6._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_17og64d._.js.map} +0 -0
  507. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1_2hcok._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1e_sh4o._.js.map} +0 -0
  508. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1g--m6y._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1ecuo9i._.js.map} +0 -0
  509. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1geopi5._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1go8d0m._.js.map} +0 -0
  510. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1i11dte._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1i13ryx._.js.map} +0 -0
  511. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1mj3_qk._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1jv_hid._.js.map} +0 -0
  512. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1qgy210._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1mh5mqk._.js.map} +0 -0
  513. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1rkng9q._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1oq7e8u._.js.map} +0 -0
  514. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1vr8q8y._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1p-cq-p._.js.map} +0 -0
  515. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1x8b64g._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1the3g0._.js.map} +0 -0
  516. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1zhahf7._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1xubh-w._.js.map} +0 -0
  517. /package/.next/server/chunks/{[root-of-the-server]__0hfyuhq._.js.map → [root-of-the-server]__00o3mbd._.js.map} +0 -0
  518. /package/.next/server/chunks/{[root-of-the-server]__0y5usoz._.js.map → [root-of-the-server]__01n_hoh._.js.map} +0 -0
  519. /package/.next/server/chunks/{[root-of-the-server]__08yaps5._.js.map → [root-of-the-server]__05tx02j._.js.map} +0 -0
  520. /package/.next/server/chunks/{[root-of-the-server]__0b2488c._.js.map → [root-of-the-server]__06dfvb0._.js.map} +0 -0
  521. /package/.next/server/chunks/{[root-of-the-server]__1tu85zx._.js.map → [root-of-the-server]__06z8i6e._.js.map} +0 -0
  522. /package/.next/server/chunks/{[root-of-the-server]__0qij7wy._.js.map → [root-of-the-server]__076d4xm._.js.map} +0 -0
  523. /package/.next/server/chunks/{[root-of-the-server]__1ssunti._.js.map → [root-of-the-server]__09j_-hj._.js.map} +0 -0
  524. /package/.next/server/chunks/{[root-of-the-server]__1gvv2xp._.js.map → [root-of-the-server]__0kuhhna._.js.map} +0 -0
  525. /package/.next/server/chunks/{[root-of-the-server]__008focd._.js.map → [root-of-the-server]__0p4w_o-._.js.map} +0 -0
  526. /package/.next/server/chunks/{[root-of-the-server]__1z3tswg._.js.map → [root-of-the-server]__0uu9pgg._.js.map} +0 -0
  527. /package/.next/server/chunks/{[root-of-the-server]__1b448u7._.js.map → [root-of-the-server]__1-1hfrj._.js.map} +0 -0
  528. /package/.next/server/chunks/{[root-of-the-server]__0ikbk15._.js.map → [root-of-the-server]__15jhpgl._.js.map} +0 -0
  529. /package/.next/server/chunks/{[root-of-the-server]__0m8hmg0._.js.map → [root-of-the-server]__19w-7h9._.js.map} +0 -0
  530. /package/.next/server/chunks/{[root-of-the-server]__01xmabe._.js.map → [root-of-the-server]__1af-wfk._.js.map} +0 -0
  531. /package/.next/server/chunks/{[root-of-the-server]__0cbh1s-._.js.map → [root-of-the-server]__1e_o8h4._.js.map} +0 -0
  532. /package/.next/server/chunks/{[root-of-the-server]__16u25oa._.js.map → [root-of-the-server]__1gr4e22._.js.map} +0 -0
  533. /package/.next/server/chunks/{[root-of-the-server]__1jz98vb._.js.map → [root-of-the-server]__1h5hb6u._.js.map} +0 -0
  534. /package/.next/server/chunks/{[root-of-the-server]__1xpp36t._.js.map → [root-of-the-server]__1kw2vct._.js.map} +0 -0
  535. /package/.next/server/chunks/{[root-of-the-server]__0axugex._.js.map → [root-of-the-server]__1lt5cds._.js.map} +0 -0
  536. /package/.next/server/chunks/{[root-of-the-server]__03ogp2r._.js.map → [root-of-the-server]__1rjgpbm._.js.map} +0 -0
  537. /package/.next/server/chunks/{[root-of-the-server]__0x8wtot._.js.map → [root-of-the-server]__1spley9._.js.map} +0 -0
  538. /package/.next/server/chunks/ssr/{0_nd_mermaid_dist_mermaid_core_mjs_027n2yl._.js.map → 0_nd_mermaid_dist_mermaid_core_mjs_0itmgkm._.js.map} +0 -0
  539. /package/.next/server/chunks/ssr/{1u84_katex_dist_katex_mjs_1kb5xea._.js.map → 1u84_katex_dist_katex_mjs_08jn-sj._.js.map} +0 -0
  540. /package/.next/server/chunks/ssr/{node_modules__pnpm_14piqi4._.js.map → _1s2ya35._.js.map} +0 -0
  541. /package/.next/server/chunks/ssr/{node_modules__pnpm_1qp_jvj._.js.map → node_modules__pnpm_00lsytc._.js.map} +0 -0
  542. /package/.next/server/chunks/ssr/{node_modules__pnpm_1ygal0c._.js.map → node_modules__pnpm_02p2rqs._.js.map} +0 -0
  543. /package/.next/server/chunks/ssr/{node_modules__pnpm_1-76qxg._.js.map → node_modules__pnpm_05-p8zy._.js.map} +0 -0
  544. /package/.next/server/chunks/ssr/{node_modules__pnpm_1qmkxyo._.js.map → node_modules__pnpm_060kz-j._.js.map} +0 -0
  545. /package/.next/server/chunks/ssr/{node_modules__pnpm_0ctisl0._.js.map → node_modules__pnpm_0_83tv8._.js.map} +0 -0
  546. /package/.next/server/chunks/ssr/{node_modules__pnpm_0ycbjbd._.js.map → node_modules__pnpm_0_ajzll._.js.map} +0 -0
  547. /package/.next/server/chunks/ssr/{node_modules__pnpm_0kpu0-2._.js.map → node_modules__pnpm_0abf_e9._.js.map} +0 -0
  548. /package/.next/server/chunks/ssr/{node_modules__pnpm_0fwp8jm._.js.map → node_modules__pnpm_0e55e7-._.js.map} +0 -0
  549. /package/.next/server/chunks/ssr/{node_modules__pnpm_1q_hhr3._.js.map → node_modules__pnpm_0eub17j._.js.map} +0 -0
  550. /package/.next/server/chunks/ssr/{node_modules__pnpm_1-r94f7._.js.map → node_modules__pnpm_0gp90ei._.js.map} +0 -0
  551. /package/.next/server/chunks/ssr/{node_modules__pnpm_16u1vfb._.js.map → node_modules__pnpm_0iqb0_x._.js.map} +0 -0
  552. /package/.next/server/chunks/ssr/{node_modules__pnpm_1uwkcin._.js.map → node_modules__pnpm_0j7asqf._.js.map} +0 -0
  553. /package/.next/server/chunks/ssr/{node_modules__pnpm_1f440kx._.js.map → node_modules__pnpm_0jlzk5z._.js.map} +0 -0
  554. /package/.next/server/chunks/ssr/{node_modules__pnpm_189m48n._.js.map → node_modules__pnpm_0rsfj9v._.js.map} +0 -0
  555. /package/.next/server/chunks/ssr/{node_modules__pnpm_01bjcv9._.js.map → node_modules__pnpm_0s63lee._.js.map} +0 -0
  556. /package/.next/server/chunks/ssr/{node_modules__pnpm_1xeothw._.js.map → node_modules__pnpm_0s7j-tv._.js.map} +0 -0
  557. /package/.next/server/chunks/ssr/{node_modules__pnpm_1ssjj4u._.js.map → node_modules__pnpm_0up4z7m._.js.map} +0 -0
  558. /package/.next/server/chunks/ssr/{node_modules__pnpm_06d-fdo._.js.map → node_modules__pnpm_0v_mhl7._.js.map} +0 -0
  559. /package/.next/server/chunks/ssr/{node_modules__pnpm_1a48_nl._.js.map → node_modules__pnpm_0vuao3_._.js.map} +0 -0
  560. /package/.next/server/chunks/ssr/{node_modules__pnpm_0vry74x._.js.map → node_modules__pnpm_14j18h7._.js.map} +0 -0
  561. /package/.next/server/chunks/ssr/{node_modules__pnpm_17i6z2d._.js.map → node_modules__pnpm_16bj927._.js.map} +0 -0
  562. /package/.next/server/chunks/ssr/{node_modules__pnpm_192f222._.js.map → node_modules__pnpm_1ch46nl._.js.map} +0 -0
  563. /package/.next/server/chunks/ssr/{node_modules__pnpm_1txccoj._.js.map → node_modules__pnpm_1dc-yxd._.js.map} +0 -0
  564. /package/.next/server/chunks/ssr/{node_modules__pnpm_1min2jl._.js.map → node_modules__pnpm_1fry8_2._.js.map} +0 -0
  565. /package/.next/server/chunks/ssr/{node_modules__pnpm_1fn3ejy._.js.map → node_modules__pnpm_1gpkxns._.js.map} +0 -0
  566. /package/.next/server/chunks/ssr/{node_modules__pnpm_1aa37e1._.js.map → node_modules__pnpm_1hqh95z._.js.map} +0 -0
  567. /package/.next/server/chunks/ssr/{node_modules__pnpm_03qrzdb._.js.map → node_modules__pnpm_1oaf50x._.js.map} +0 -0
  568. /package/.next/static/{Q29Tn_NjyVms0d3pKn4Yx → qCiKQ9_g49vaoQ-Fewybk}/_buildManifest.js +0 -0
  569. /package/.next/static/{Q29Tn_NjyVms0d3pKn4Yx → qCiKQ9_g49vaoQ-Fewybk}/_clientMiddlewareManifest.js +0 -0
  570. /package/.next/static/{Q29Tn_NjyVms0d3pKn4Yx → qCiKQ9_g49vaoQ-Fewybk}/_ssgManifest.js +0 -0
@@ -1,3 +1,3 @@
1
- module.exports=[815122,a=>{"use strict";var b=a.i(662145),c=a.i(795667),d=a.i(108280),e=a.i(368114),f=a.i(685698),g=a.i(598984);let h={running:"Agent working","needs-answer":"Agent needs you",review:"Plan to review"};a.s(["AgentDot",0,function({attach:a}){let c=(0,f.useItemAgent)(a);return c?(0,b.jsx)(g.StatusMarker,{status:c.status,label:h[c.status]}):null},"AgentMark",0,function({attach:a,className:g}){let i=(0,f.useItemAgent)(a),{show:j}=(0,f.useChats)();if(!i)return null;let k=h[i.status];return(0,b.jsxs)("button",{type:"button",onClick:a=>{a.stopPropagation(),j(i.chatId)},title:`${k} \xb7 open chat`,"aria-label":`${k}, open chat`,className:(0,e.cn)("nodrag inline-flex shrink-0 items-center gap-1 rounded-full border px-1.5 py-px font-mono text-[10px] leading-4 animate-fade-in transition-colors duration-(--duration-fast)","running"===i.status&&"border-accent/50 text-accent hover:bg-accent/10","needs-answer"===i.status&&"border-amber/50 text-amber hover:bg-amber/10","review"===i.status&&"border-accent/50 bg-accent/10 text-accent hover:bg-accent/20",g),children:["running"===i.status?(0,b.jsx)(d.Loader2,{className:"size-3 animate-spin","aria-hidden":!0}):(0,b.jsx)(c.Bot,{className:"size-3","aria-hidden":!0}),k]})}])},618940,a=>{"use strict";var b=a.i(662145),c=a.i(365465),d=a.i(152716),e=a.i(340933),f=a.i(425404),g=a.i(368114),h=a.i(581040),i=a.i(453161),j=a.i(815122),k=a.i(685698);let l=[d.Position.Top,d.Position.Right,d.Position.Bottom,d.Position.Left];function m(){return(0,b.jsxs)(b.Fragment,{children:[l.map(a=>(0,b.jsx)(c.Handle,{id:a,type:"source",position:a,isConnectable:!1,className:"opacity-0"},a)),l.map(a=>(0,b.jsx)(c.Handle,{id:`${a}-t`,type:"target",position:a,isConnectable:!1,className:"opacity-0"},`${a}-t`))]})}let n={"in-progress":"Active",paused:"Paused",done:"Done",planned:"Planned"};function o({status:a,className:c}){return(0,b.jsxs)("span",{title:n[a],"aria-label":n[a],className:(0,g.cn)("relative inline-flex h-2 w-2 shrink-0",c),children:["in-progress"===a&&(0,b.jsx)("span",{className:"absolute inset-0 animate-ping rounded-full bg-accent/60"}),(0,b.jsx)("span",{className:(0,g.cn)("relative h-full w-full rounded-full","done"===a&&"bg-teal","in-progress"===a&&"bg-accent","planned"===a&&"border border-muted","paused"===a&&"border-2 border-y-0 border-muted")})]})}let p={done:"bg-teal","in-progress":"bg-amber",review:"bg-accent",blocked:"bg-danger",paused:"bg-muted/60",todo:"bg-border2",cancelled:"bg-border"};function q({statuses:a,className:c}){if(!a?.length)return null;let d=a.filter(a=>"done"===a).length;return(0,b.jsx)("div",{className:(0,g.cn)("flex h-1.5 min-w-0 flex-1 gap-0.5",c),title:`${d}/${a.length} tasks done`,children:a.map((a,c)=>(0,b.jsx)("span",{className:(0,g.cn)("h-full flex-1 rounded-[1px]",p[a])},c))})}function r({value:a,total:c,className:d}){let e=2*Math.PI*14,f=c>0?a/c:0;return(0,b.jsxs)("span",{className:(0,g.cn)("relative inline-flex h-9 w-9 shrink-0 items-center justify-center",d),title:`${a}/${c} tasks done`,children:[(0,b.jsxs)("svg",{viewBox:"0 0 36 36",className:"absolute inset-0 -rotate-90",children:[(0,b.jsx)("circle",{cx:"18",cy:"18",r:14,fill:"none",strokeWidth:"3",className:"stroke-border"}),(0,b.jsx)("circle",{cx:"18",cy:"18",r:14,fill:"none",strokeWidth:"3",stroke:"currentColor",strokeLinecap:"round",strokeDasharray:e,strokeDashoffset:e*(1-f)})]}),(0,b.jsx)("span",{className:"font-mono text-[9px] text-txt",children:Math.round(100*f)})]})}function s({due:a,state:c}){return a?(0,b.jsxs)("span",{className:(0,g.cn)("font-mono text-[10px]","overdue"===c?"text-danger":"soon"===c?"text-amber":"text-muted"),children:["Due ",(0,h.formatDay)(a)]}):null}function t({data:a}){let c=a.taskDue;return c&&c.overdue>0?(0,b.jsxs)("span",{className:"font-mono text-[10px] text-danger",children:[c.overdue," ",1===c.overdue?"task":"tasks"," overdue"]}):a.item.due?(0,b.jsx)(s,{due:a.item.due,state:a.dueState}):c?.next?(0,b.jsxs)("span",{className:(0,g.cn)("font-mono text-[10px]",a.taskDueSoon?"text-amber":"text-muted"),children:["Next due ",(0,h.formatDay)(c.next)]}):null}function u({drift:a}){return a?.length?(0,b.jsx)("span",{title:a.join("\n"),className:"absolute -left-2 -top-2 rounded-full bg-bg p-0.5 text-amber",children:(0,b.jsx)(e.AlertTriangle,{className:"h-3.5 w-3.5"})}):null}a.s(["DueChip",0,s,"STATUS_LABEL",0,n,"SegmentedProgress",0,q,"StatusDot",0,o,"StatusPill",0,function({status:a}){return(0,b.jsxs)("span",{className:(0,g.cn)("inline-flex items-center gap-1.5 rounded-full border px-2 py-0.5 font-mono text-[10px] uppercase tracking-wider","done"===a&&"border-teal/40 text-teal","in-progress"===a&&"border-accent/50 text-accent","planned"===a&&"border-dashed border-border2 text-muted","paused"===a&&"border-border2 text-muted"),children:[(0,b.jsx)(o,{status:a,className:"h-1.5 w-1.5"}),n[a]]})},"TASK_STATUS_BG",0,p,"nodeTypes",0,{horizon:function({data:a,selected:c}){let{item:d,progress:e,epics:f,chapter:h}=a,j=d.status;return(0,b.jsxs)("div",{style:{width:i.HORIZON_W},className:(0,g.cn)("relative flex items-center gap-3 rounded-xl border bg-surface px-3.5 py-3 transition-shadow duration-(--duration-base)","in-progress"===j&&"border-accent/60 shadow-[0_0_0_1px_rgb(var(--rgb-accent)/0.25),0_10px_30px_-12px_rgb(var(--rgb-accent)/0.6)]","done"===j&&"border-teal/40","planned"===j&&"border-dashed border-border2","paused"===j&&"border-border2 opacity-75",c&&"ring-2 ring-accent/60 ring-offset-2 ring-offset-bg"),children:[(0,b.jsx)(m,{}),(0,b.jsx)("span",{className:(0,g.cn)("font-mono text-2xl font-semibold leading-none tabular-nums","in-progress"===j?"text-accent":"done"===j?"text-teal":"text-muted"),children:h?String(h).padStart(2,"0"):"··"}),(0,b.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,b.jsx)("p",{className:"text-xs font-semibold uppercase leading-snug tracking-wider text-txt",children:d.title}),(0,b.jsxs)("p",{className:"mt-1 flex flex-wrap items-center gap-x-2 font-mono text-[10px] text-muted",children:[f&&f.total>0&&(0,b.jsxs)("span",{children:[f.done,"/",f.total," epics"]}),(0,b.jsx)(s,{due:d.due,state:a.dueState})]})]}),e&&(0,b.jsx)(r,{value:e.done,total:e.total,className:"done"===j?"text-teal":"text-accent"}),(0,b.jsx)(u,{drift:a.drift})]})},feature:function({data:a,selected:c}){let{item:d,taskStatuses:e,nextTaskId:h}=a,l=(0,k.useItemAgent)({kind:"epic",id:d.id}),n=!!a.drift?.length,p=c&&"ring-2 ring-accent/60 ring-offset-2 ring-offset-bg";if("done"===d.status)return(0,b.jsxs)("div",{style:{width:i.FEATURE_W},className:(0,g.cn)("group relative flex items-center gap-2 rounded-lg border border-border bg-surface/60 px-3 py-2 hover:border-teal/40",p),children:[(0,b.jsx)(m,{}),(0,b.jsx)(f.Check,{className:"h-3.5 w-3.5 shrink-0 text-teal",strokeWidth:3}),(0,b.jsx)("p",{className:"min-w-0 flex-1 truncate text-[13px] text-muted group-hover:text-txt",title:d.title,children:d.title}),l?(0,b.jsx)(j.AgentMark,{attach:{kind:"epic",id:d.id}}):a.progress&&(0,b.jsxs)("span",{className:"font-mono text-[10px] text-muted",children:[a.progress.done,"/",a.progress.total]}),(0,b.jsx)(u,{drift:a.drift})]});let r="in-progress"===d.status;return(0,b.jsxs)("div",{style:{width:i.FEATURE_W},className:(0,g.cn)("relative flex flex-col gap-1.5 rounded-lg border px-3 py-2.5 transition-shadow duration-(--duration-base)",r?"border-accent/50 bg-surface shadow-[0_8px_24px_-10px_rgb(var(--rgb-accent)/0.55)]":"border-dashed border-border2 bg-bg hover:border-muted","paused"===d.status&&"opacity-70",p),children:[(0,b.jsx)(m,{}),r&&(0,b.jsx)("span",{className:(0,g.cn)("absolute -inset-y-px -left-px w-[3px] rounded-l-lg",n?"bg-amber":"bg-accent")}),(0,b.jsxs)("div",{className:"flex items-center justify-between font-mono text-[10px]",children:[(0,b.jsx)("span",{className:"text-muted",children:d.id}),l?(0,b.jsx)(j.AgentMark,{attach:{kind:"epic",id:d.id}}):r?(0,b.jsxs)("span",{className:"flex items-center gap-1.5 uppercase tracking-wider text-accent",children:[(0,b.jsx)(o,{status:"in-progress",className:"h-1.5 w-1.5"}),"Live"]}):(0,b.jsx)("span",{className:"uppercase tracking-wider text-muted",children:d.tasks.length?`${d.tasks.length} tasks`:"No tasks yet"})]}),(0,b.jsx)("p",{className:(0,g.cn)("line-clamp-2 text-[13px] leading-snug",r?"font-medium text-txt":"text-txt/80"),title:d.title,children:d.title}),e&&e.length>0&&(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)(q,{statuses:e}),(0,b.jsx)("span",{className:"shrink-0 font-mono text-[10px] text-muted",children:r&&h?(0,b.jsxs)(b.Fragment,{children:["next ",(0,b.jsx)("span",{className:"text-txt",children:h})]}):`${e.filter(a=>"done"===a).length}/${e.length}`})]}),(0,b.jsx)(t,{data:a}),(0,b.jsx)(u,{drift:a.drift})]})}}])},581040,452696,453161,a=>{"use strict";function b(a,b,c){let d;return a?"done"===b?"done":a<c?"overdue":7>=Math.round(((d=a=>Date.UTC(+a.slice(0,4),a.slice(5,7)-1,+a.slice(8,10)))(a)-d(c))/864e5)?"soon":"ok":null}function c(a){return a.every(a=>"done"===a)?"done":a.some(a=>"other"!==a)?"in-progress":"planned"}a.s(["dueState",0,b,"localToday",0,function(a=new Date){let b=a=>String(a).padStart(2,"0");return`${a.getFullYear()}-${b(a.getMonth()+1)}-${b(a.getDate())}`},"roadmapHealth",0,function(a,d,e){let f={},g=[];for(let c of a)c.due&&"overdue"===b(c.due,c.status,e)&&g.push({id:c.id,kind:"overdue",message:`${c.id} "${c.title}" is overdue since ${c.due}`});let h=new Set(a.filter(a=>null===a.parent).map(a=>a.id));for(let h of a){if(null===h.parent)continue;let a=h.tasks.filter(a=>!(a in d));a.length&&g.push({id:h.id,kind:"missing-task",message:`${h.id} links unknown task ${a.join(", ")}`});let i=h.tasks.filter(a=>a in d&&"cancelled"!==d[a].status),j="done"===h.status||"paused"===h.status?[]:function(a,c,d,e){let f=[];for(let a of c){let b=d[a];"done"!==b.status&&b.due&&b.due<e&&f.push(`${a} overdue since ${b.due}`),"blocked"===b.status&&f.push(`${a} blocked`)}let g=c.some(a=>["done","in-progress","review"].includes(d[a].status));return a.due&&"soon"===b(a.due,a.status,e)&&!g&&f.push(`due ${a.due}, nothing started`),f}(h,i,d,e);if(j.length&&g.push({id:h.id,kind:"at-risk",message:`${h.id} "${h.title}" at risk: ${j.join("; ")}`}),!i.length)continue;let k=i.map(a=>"done"===d[a].status?"done":"in-progress"===d[a].status||"review"===d[a].status?"in-progress":"other");f[h.id]={done:k.filter(a=>"done"===a).length,total:i.length};let l=c(k);if(l!==h.status&&("paused"!==h.status||"done"===l)){let a=i.filter(a=>"done"!==d[a].status);g.push({id:h.id,kind:"status-mismatch",message:"done"===l?`${h.id} "${h.title}": all tasks done but status is ${h.status}`:`${h.id} "${h.title}" is ${h.status} but tasks ${a.join(", ")} are not done`,suggestedStatus:l})}}for(let b of a){if(!h.has(b.id))continue;let d=a.filter(a=>a.parent===b.id);if(!d.length)continue;let e=d.map(a=>"done"===a.status?"done":"in-progress"===a.status?"in-progress":"other");f[b.id]=d.reduce((a,b)=>{let c=f[b.id]??{done:+("done"===b.status),total:1};return{done:a.done+c.done,total:a.total+c.total}},{done:0,total:0});let i=c(e);i!==b.status&&("paused"!==b.status||"done"===i)&&g.push({id:b.id,kind:"status-mismatch",message:`${b.id} "${b.title}" is ${b.status} but its features say ${i}`,suggestedStatus:i})}return{progress:f,drift:g}},"taskDueSummary",0,function(a,b,c){let d=a.map(a=>b[a]).filter(a=>a&&a.due&&"done"!==a.status&&"cancelled"!==a.status).map(a=>a.due);if(!d.length)return null;let e=d.filter(a=>a>=c).sort();return{overdue:d.length-e.length,next:e[0]??null}}],452696);function d(a){let b=new Set(a.filter(a=>null===a.parent).map(a=>a.id));return a.filter(a=>null===a.parent||!b.has(a.parent)).sort((a,b)=>a.order-b.order)}function e(a,b){return a.filter(a=>a.parent===b).sort((a,b)=>a.order-b.order)}a.s(["FEATURE_W",0,220,"HORIZON_W",0,260,"childrenOf",0,e,"resolvePositions",0,function(a,b){let c={},f=0;for(let g of d(a)){let d=b[g.id]??{x:0,y:f};c[g.id]=d;let h=null===g.parent?e(a,g.id):[],i=Math.ceil(h.length/2)>6?2:1;h.forEach((a,e)=>{let f=e%2==0?1:-1,g=Math.floor(e/2),h=g%i,j=Math.floor(g/i);c[a.id]=b[a.id]??{x:d.x+20+f*(340+260*h),y:d.y+110*j+55*h}}),f+=110*Math.max(1,Math.ceil(Math.ceil(h.length/2)/i))+90}return c},"spineItems",0,d],453161);let f=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],g=a=>({y:+a.slice(0,4),m:+a.slice(5,7),day:+a.slice(8,10)});a.s(["LANE_ROW_H",0,44,"buildTimeline",0,function(a,c){let h=a.map(a=>a.due).filter(a=>!!a),i=g([c,...h].sort()[0]),j=g([c,...h].sort().at(-1)??c),k={y:i.y,m:i.m-1},l=Math.max(6,(j.y-i.y)*12+(j.m-i.m)+3),m=Array.from({length:l},(a,b)=>{let c=12*k.y+(k.m-1)+b,d=Math.floor(c/12),e=c%12+1;return{y:d,m:e,label:1===e||0===b?`${f[e-1]} ${d}`:f[e-1],x:160*b}}),n=a=>{let{y:b,m:c,day:d}=g(a);return((b-m[0].y)*12+(c-m[0].m))*160+(d-.5)/new Date(b,c,0).getDate()*160},o=d(a).map(d=>{let f=[d,...null===d.parent?e(a,d.id):[]].filter(a=>a.due),g=[],h=f.map(a=>({item:a,x:n(a.due),horizon:a.id===d.id})).sort((a,b)=>a.x-b.x).map(a=>{let d=g.findIndex(b=>a.x>=b);return -1===d&&(d=g.push(0)-1),g[d]=a.x+180,{...a,row:d,state:b(a.item.due,a.item.status,c)}});return{item:d,rows:Math.max(1,g.length),markers:h}});return{months:m.map(({label:a,x:b})=>({label:a,x:b})),width:160*l,todayX:n(c),lanes:o,undated:a.filter(a=>!a.due&&"done"!==a.status)}},"formatDay",0,function(a){let{m:b,day:c}=g(a);return`${c} ${f[b-1]}`}],581040)}];
1
+ module.exports=[815122,a=>{"use strict";var b=a.i(662145),c=a.i(795667),d=a.i(108280),e=a.i(368114),f=a.i(685698),g=a.i(598984);let h={running:"Agent working","needs-answer":"Agent needs you",review:"Plan to review"};a.s(["AgentDot",0,function({attach:a}){let c=(0,f.useItemAgent)(a);return c?(0,b.jsx)(g.StatusMarker,{status:c.status,label:h[c.status]}):null},"AgentMark",0,function({attach:a,className:g}){let i=(0,f.useItemAgent)(a),{show:j}=(0,f.useChats)();if(!i)return null;let k=h[i.status];return(0,b.jsxs)("button",{type:"button",onClick:a=>{a.stopPropagation(),j(i.chatId)},title:`${k} \xb7 open chat`,"aria-label":`${k}, open chat`,className:(0,e.cn)("nodrag inline-flex shrink-0 items-center gap-1 rounded-full border px-1.5 py-px font-mono text-[10px] leading-4 animate-fade-in transition-colors duration-(--duration-fast)","running"===i.status&&"border-accent/50 text-accent hover:bg-accent/10","needs-answer"===i.status&&"border-amber/50 text-amber hover:bg-amber/10","review"===i.status&&"border-accent/50 bg-accent/10 text-accent hover:bg-accent/20",g),children:["running"===i.status?(0,b.jsx)(d.Loader2,{className:"size-3 animate-spin","aria-hidden":!0}):(0,b.jsx)(c.Bot,{className:"size-3","aria-hidden":!0}),k]})}])},618940,a=>{"use strict";var b=a.i(662145),c=a.i(365465),d=a.i(152716),e=a.i(340933),f=a.i(425404),g=a.i(368114),h=a.i(581040),i=a.i(453161),j=a.i(815122),k=a.i(685698);let l=[d.Position.Top,d.Position.Right,d.Position.Bottom,d.Position.Left];function m(){return(0,b.jsxs)(b.Fragment,{children:[l.map(a=>(0,b.jsx)(c.Handle,{id:a,type:"source",position:a,isConnectable:!1,className:"opacity-0"},a)),l.map(a=>(0,b.jsx)(c.Handle,{id:`${a}-t`,type:"target",position:a,isConnectable:!1,className:"opacity-0"},`${a}-t`))]})}let n={"in-progress":"Active",paused:"Paused",done:"Done",planned:"Planned"};function o({status:a,className:c}){return(0,b.jsxs)("span",{title:n[a],"aria-label":n[a],className:(0,g.cn)("relative inline-flex h-2 w-2 shrink-0",c),children:["in-progress"===a&&(0,b.jsx)("span",{className:"absolute inset-0 animate-ping rounded-full bg-accent/60"}),(0,b.jsx)("span",{className:(0,g.cn)("relative h-full w-full rounded-full","done"===a&&"bg-teal","in-progress"===a&&"bg-accent","planned"===a&&"border border-muted","paused"===a&&"bg-muted")})]})}let p={done:"bg-teal","in-progress":"bg-amber",review:"bg-accent",blocked:"bg-danger",paused:"bg-muted/60",todo:"bg-border2",cancelled:"bg-border"};function q({statuses:a,className:c}){if(!a?.length)return null;let d=a.filter(a=>"done"===a).length;return(0,b.jsx)("div",{className:(0,g.cn)("flex h-1.5 min-w-0 flex-1 gap-0.5",c),title:`${d}/${a.length} tasks done`,children:a.map((a,c)=>(0,b.jsx)("span",{className:(0,g.cn)("h-full flex-1 rounded-[1px]",p[a])},c))})}function r({value:a,total:c,className:d}){let e=2*Math.PI*14,f=c>0?a/c:0;return(0,b.jsxs)("span",{className:(0,g.cn)("relative inline-flex h-9 w-9 shrink-0 items-center justify-center",d),title:`${a}/${c} tasks done`,children:[(0,b.jsxs)("svg",{viewBox:"0 0 36 36",className:"absolute inset-0 -rotate-90",children:[(0,b.jsx)("circle",{cx:"18",cy:"18",r:14,fill:"none",strokeWidth:"3",className:"stroke-border"}),(0,b.jsx)("circle",{cx:"18",cy:"18",r:14,fill:"none",strokeWidth:"3",stroke:"currentColor",strokeLinecap:"round",strokeDasharray:e,strokeDashoffset:e*(1-f)})]}),(0,b.jsx)("span",{className:"font-mono text-[9px] text-txt",children:Math.round(100*f)})]})}function s({due:a,state:c}){return a?(0,b.jsxs)("span",{className:(0,g.cn)("font-mono text-[10px]","overdue"===c?"text-danger":"soon"===c?"text-amber":"text-muted"),children:["Due ",(0,h.formatDay)(a)]}):null}function t({data:a}){let c=a.taskDue;return c&&c.overdue>0?(0,b.jsxs)("span",{className:"font-mono text-[10px] text-danger",children:[c.overdue," ",1===c.overdue?"task":"tasks"," overdue"]}):a.item.due?(0,b.jsx)(s,{due:a.item.due,state:a.dueState}):c?.next?(0,b.jsxs)("span",{className:(0,g.cn)("font-mono text-[10px]",a.taskDueSoon?"text-amber":"text-muted"),children:["Next due ",(0,h.formatDay)(c.next)]}):null}function u({drift:a}){return a?.length?(0,b.jsx)("span",{title:a.join("\n"),className:"absolute -left-2 -top-2 rounded-full bg-bg p-0.5 text-amber",children:(0,b.jsx)(e.AlertTriangle,{className:"h-3.5 w-3.5"})}):null}a.s(["DueChip",0,s,"STATUS_LABEL",0,n,"SegmentedProgress",0,q,"StatusDot",0,o,"StatusPill",0,function({status:a}){return(0,b.jsxs)("span",{className:(0,g.cn)("inline-flex items-center gap-1.5 rounded-full border px-2 py-0.5 font-mono text-[10px] uppercase tracking-wider","done"===a&&"border-teal/40 text-teal","in-progress"===a&&"border-accent/50 text-accent","planned"===a&&"border-dashed border-border2 text-muted","paused"===a&&"border-border2 text-muted"),children:[(0,b.jsx)(o,{status:a,className:"h-1.5 w-1.5"}),n[a]]})},"TASK_STATUS_BG",0,p,"nodeTypes",0,{horizon:function({data:a,selected:c}){let{item:d,progress:e,epics:f,chapter:h}=a,j=d.status;return(0,b.jsxs)("div",{style:{width:i.HORIZON_W},className:(0,g.cn)("relative flex items-center gap-3 rounded-xl border bg-surface px-3.5 py-3 transition-shadow duration-(--duration-base)","in-progress"===j&&"border-accent/60 shadow-[0_0_0_1px_rgb(var(--rgb-accent)/0.25),0_10px_30px_-12px_rgb(var(--rgb-accent)/0.6)]","done"===j&&"border-teal/40","planned"===j&&"border-dashed border-border2","paused"===j&&"border-border2 opacity-75",c&&"ring-2 ring-accent/60 ring-offset-2 ring-offset-bg"),children:[(0,b.jsx)(m,{}),(0,b.jsx)("span",{className:(0,g.cn)("font-mono text-2xl font-semibold leading-none tabular-nums","in-progress"===j?"text-accent":"done"===j?"text-teal":"text-muted"),children:h?String(h).padStart(2,"0"):"··"}),(0,b.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,b.jsx)("p",{className:"text-xs font-semibold uppercase leading-snug tracking-wider text-txt",children:d.title}),(0,b.jsxs)("p",{className:"mt-1 flex flex-wrap items-center gap-x-2 font-mono text-[10px] text-muted",children:[f&&f.total>0&&(0,b.jsxs)("span",{children:[f.done,"/",f.total," epics"]}),(0,b.jsx)(s,{due:d.due,state:a.dueState})]})]}),e&&(0,b.jsx)(r,{value:e.done,total:e.total,className:"done"===j?"text-teal":"text-accent"}),(0,b.jsx)(u,{drift:a.drift})]})},feature:function({data:a,selected:c}){let{item:d,taskStatuses:e,nextTaskId:h}=a,l=(0,k.useItemAgent)({kind:"epic",id:d.id}),n=!!a.drift?.length,p=c&&"ring-2 ring-accent/60 ring-offset-2 ring-offset-bg";if("done"===d.status)return(0,b.jsxs)("div",{style:{width:i.FEATURE_W},className:(0,g.cn)("group relative flex items-center gap-2 rounded-lg border border-border bg-surface/60 px-3 py-2 hover:border-teal/40",p),children:[(0,b.jsx)(m,{}),(0,b.jsx)(f.Check,{className:"h-3.5 w-3.5 shrink-0 text-teal",strokeWidth:3}),(0,b.jsx)("p",{className:"min-w-0 flex-1 truncate text-[13px] text-muted group-hover:text-txt",title:d.title,children:d.title}),l?(0,b.jsx)(j.AgentMark,{attach:{kind:"epic",id:d.id}}):a.progress&&(0,b.jsxs)("span",{className:"font-mono text-[10px] text-muted",children:[a.progress.done,"/",a.progress.total]}),(0,b.jsx)(u,{drift:a.drift})]});let r="in-progress"===d.status;return(0,b.jsxs)("div",{style:{width:i.FEATURE_W},className:(0,g.cn)("relative flex flex-col gap-1.5 rounded-lg border px-3 py-2.5 transition-shadow duration-(--duration-base)",r?"border-accent/50 bg-surface shadow-[0_8px_24px_-10px_rgb(var(--rgb-accent)/0.55)]":"border-dashed border-border2 bg-bg hover:border-muted","paused"===d.status&&"opacity-70",p),children:[(0,b.jsx)(m,{}),r&&(0,b.jsx)("span",{className:(0,g.cn)("absolute -inset-y-px -left-px w-[3px] rounded-l-lg",n?"bg-amber":"bg-accent")}),(0,b.jsxs)("div",{className:"flex items-center justify-between font-mono text-[10px]",children:[(0,b.jsx)("span",{className:"text-muted",children:d.id}),l?(0,b.jsx)(j.AgentMark,{attach:{kind:"epic",id:d.id}}):r?(0,b.jsxs)("span",{className:"flex items-center gap-1.5 uppercase tracking-wider text-accent",children:[(0,b.jsx)(o,{status:"in-progress",className:"h-1.5 w-1.5"}),"Live"]}):(0,b.jsx)("span",{className:"uppercase tracking-wider text-muted",children:d.tasks.length?`${d.tasks.length} tasks`:"No tasks yet"})]}),(0,b.jsx)("p",{className:(0,g.cn)("line-clamp-2 text-[13px] leading-snug",r?"font-medium text-txt":"text-txt/80"),title:d.title,children:d.title}),e&&e.length>0&&(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)(q,{statuses:e}),(0,b.jsx)("span",{className:"shrink-0 font-mono text-[10px] text-muted",children:r&&h?(0,b.jsxs)(b.Fragment,{children:["next ",(0,b.jsx)("span",{className:"text-txt",children:h})]}):`${e.filter(a=>"done"===a).length}/${e.length}`})]}),(0,b.jsx)(t,{data:a}),(0,b.jsx)(u,{drift:a.drift})]})}}])},581040,452696,453161,a=>{"use strict";function b(a,b,c){let d;return a?"done"===b?"done":a<c?"overdue":7>=Math.round(((d=a=>Date.UTC(+a.slice(0,4),a.slice(5,7)-1,+a.slice(8,10)))(a)-d(c))/864e5)?"soon":"ok":null}function c(a){return a.every(a=>"done"===a)?"done":a.some(a=>"other"!==a)?"in-progress":"planned"}a.s(["dueState",0,b,"localToday",0,function(a=new Date){let b=a=>String(a).padStart(2,"0");return`${a.getFullYear()}-${b(a.getMonth()+1)}-${b(a.getDate())}`},"roadmapHealth",0,function(a,d,e){let f={},g=[];for(let c of a)c.due&&"overdue"===b(c.due,c.status,e)&&g.push({id:c.id,kind:"overdue",message:`${c.id} "${c.title}" is overdue since ${c.due}`});let h=new Set(a.filter(a=>null===a.parent).map(a=>a.id));for(let h of a){if(null===h.parent)continue;let a=h.tasks.filter(a=>!(a in d));a.length&&g.push({id:h.id,kind:"missing-task",message:`${h.id} links unknown task ${a.join(", ")}`});let i=h.tasks.filter(a=>a in d&&"cancelled"!==d[a].status),j="done"===h.status||"paused"===h.status?[]:function(a,c,d,e){let f=[];for(let a of c){let b=d[a];"done"!==b.status&&b.due&&b.due<e&&f.push(`${a} overdue since ${b.due}`),"blocked"===b.status&&f.push(`${a} blocked`)}let g=c.some(a=>["done","in-progress","review"].includes(d[a].status));return a.due&&"soon"===b(a.due,a.status,e)&&!g&&f.push(`due ${a.due}, nothing started`),f}(h,i,d,e);if(j.length&&g.push({id:h.id,kind:"at-risk",message:`${h.id} "${h.title}" at risk: ${j.join("; ")}`}),!i.length)continue;let k=i.map(a=>"done"===d[a].status?"done":"in-progress"===d[a].status||"review"===d[a].status?"in-progress":"other");f[h.id]={done:k.filter(a=>"done"===a).length,total:i.length};let l=c(k);if(l!==h.status&&("paused"!==h.status||"done"===l)){let a=i.filter(a=>"done"!==d[a].status);g.push({id:h.id,kind:"status-mismatch",message:"done"===l?`${h.id} "${h.title}": all tasks done but status is ${h.status}`:`${h.id} "${h.title}" is ${h.status} but tasks ${a.join(", ")} are not done`,suggestedStatus:l})}}for(let b of a){if(!h.has(b.id))continue;let d=a.filter(a=>a.parent===b.id);if(!d.length)continue;let e=d.map(a=>"done"===a.status?"done":"in-progress"===a.status?"in-progress":"other");f[b.id]=d.reduce((a,b)=>{let c=f[b.id]??{done:+("done"===b.status),total:1};return{done:a.done+c.done,total:a.total+c.total}},{done:0,total:0});let i=c(e);i!==b.status&&("paused"!==b.status||"done"===i)&&g.push({id:b.id,kind:"status-mismatch",message:`${b.id} "${b.title}" is ${b.status} but its features say ${i}`,suggestedStatus:i})}return{progress:f,drift:g}},"taskDueSummary",0,function(a,b,c){let d=a.map(a=>b[a]).filter(a=>a&&a.due&&"done"!==a.status&&"cancelled"!==a.status).map(a=>a.due);if(!d.length)return null;let e=d.filter(a=>a>=c).sort();return{overdue:d.length-e.length,next:e[0]??null}}],452696);function d(a){let b=new Set(a.filter(a=>null===a.parent).map(a=>a.id));return a.filter(a=>null===a.parent||!b.has(a.parent)).sort((a,b)=>a.order-b.order)}function e(a,b){return a.filter(a=>a.parent===b).sort((a,b)=>a.order-b.order)}a.s(["FEATURE_W",0,220,"HORIZON_W",0,260,"arrangePositions",0,function(a,b){let c={},f=0;for(let g of d(a)){let d=b(g.id),h=null===g.parent?e(a,g.id):[],i=[[],[]],j=[0,0];for(let a of h){let c=j[0]<=j[1]?0:1;i[c].push({id:a.id,y:j[c]}),j[c]+=b(a.id)+14}let k=j.map(a=>Math.max(0,a-14)),l=d/2,m=k.map(a=>l-a/2),n=f-Math.min(0,...m);c[g.id]={x:0,y:n},i.forEach((a,b)=>{let d=20+(0===b?1:-1)*340;for(let{id:e,y:f}of a)c[e]={x:d,y:n+m[b]+f}}),f=n+Math.max(d,...m.map((a,b)=>a+k[b]))+120}return c},"childrenOf",0,e,"resolvePositions",0,function(a,b){let c={},f=0;for(let g of d(a)){let d=b[g.id]??{x:0,y:f};c[g.id]=d;let h=null===g.parent?e(a,g.id):[],i=Math.ceil(h.length/2)>6?2:1;h.forEach((a,e)=>{let f=e%2==0?1:-1,g=Math.floor(e/2),h=g%i,j=Math.floor(g/i);c[a.id]=b[a.id]??{x:d.x+20+f*(340+260*h),y:d.y+110*j+55*h}}),f+=110*Math.max(1,Math.ceil(Math.ceil(h.length/2)/i))+90}return c},"spineItems",0,d],453161);let f=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],g=a=>({y:+a.slice(0,4),m:+a.slice(5,7),day:+a.slice(8,10)});a.s(["LANE_ROW_H",0,44,"buildTimeline",0,function(a,c){let h=a.map(a=>a.due).filter(a=>!!a),i=g([c,...h].sort()[0]),j=g([c,...h].sort().at(-1)??c),k={y:i.y,m:i.m-1},l=Math.max(6,(j.y-i.y)*12+(j.m-i.m)+3),m=Array.from({length:l},(a,b)=>{let c=12*k.y+(k.m-1)+b,d=Math.floor(c/12),e=c%12+1;return{y:d,m:e,label:1===e||0===b?`${f[e-1]} ${d}`:f[e-1],x:160*b}}),n=a=>{let{y:b,m:c,day:d}=g(a);return((b-m[0].y)*12+(c-m[0].m))*160+(d-.5)/new Date(b,c,0).getDate()*160},o=d(a).map(d=>{let f=[d,...null===d.parent?e(a,d.id):[]].filter(a=>a.due),g=[],h=f.map(a=>({item:a,x:n(a.due),horizon:a.id===d.id})).sort((a,b)=>a.x-b.x).map(a=>{let d=g.findIndex(b=>a.x>=b);return -1===d&&(d=g.push(0)-1),g[d]=a.x+180,{...a,row:d,state:b(a.item.due,a.item.status,c)}});return{item:d,rows:Math.max(1,g.length),markers:h}});return{months:m.map(({label:a,x:b})=>({label:a,x:b})),width:160*l,todayX:n(c),lanes:o,undated:a.filter(a=>!a.due&&"done"!==a.status)}},"formatDay",0,function(a){let{m:b,day:c}=g(a);return`${c} ${f[b-1]}`}],581040)}];
2
2
 
3
3
  //# sourceMappingURL=src_components_0eyr_zi._.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/chat/AgentMark.tsx","../../../../src/components/roadmap/RoadmapNodes.tsx","../../../../src/lib/roadmap-health.ts","../../../../src/components/roadmap/layout.ts","../../../../src/components/roadmap/timeline.ts"],"sourcesContent":["\"use client\"\n\nimport { Bot, Loader2 } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\nimport { useChats, useItemAgent } from \"@/context/ChatContext\"\nimport type { Attach, ItemAgent } from \"@/lib/chats\"\nimport { StatusMarker } from \"./StatusMarker\"\n\nexport const AGENT_LABEL: Record<ItemAgent[\"status\"], string> = {\n running: \"Agent working\",\n \"needs-answer\": \"Agent needs you\",\n review: \"Plan to review\",\n}\n\n/**\n * Pill on an epic/task while a chat works on it; click opens that chat.\n * `nodrag` + stopPropagation keep a React Flow node from dragging/selecting on click.\n */\nexport function AgentMark({ attach, className }: { attach: Attach; className?: string }) {\n const agent = useItemAgent(attach)\n const { show } = useChats()\n if (!agent) return null\n const label = AGENT_LABEL[agent.status]\n return (\n <button\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); show(agent.chatId) }}\n title={`${label} · open chat`}\n aria-label={`${label}, open chat`}\n className={cn(\n \"nodrag inline-flex shrink-0 items-center gap-1 rounded-full border px-1.5 py-px font-mono text-[10px] leading-4 animate-fade-in transition-colors duration-(--duration-fast)\",\n agent.status === \"running\" && \"border-accent/50 text-accent hover:bg-accent/10\",\n agent.status === \"needs-answer\" && \"border-amber/50 text-amber hover:bg-amber/10\",\n agent.status === \"review\" && \"border-accent/50 bg-accent/10 text-accent hover:bg-accent/20\",\n className,\n )}\n >\n {agent.status === \"running\" ? <Loader2 className=\"size-3 animate-spin\" aria-hidden /> : <Bot className=\"size-3\" aria-hidden />}\n {label}\n </button>\n )\n}\n\n/** Non-interactive variant for places that are already a button (timeline markers, board cards, task rows). */\nexport function AgentDot({ attach }: { attach: Attach }) {\n const agent = useItemAgent(attach)\n if (!agent) return null\n return <StatusMarker status={agent.status} label={AGENT_LABEL[agent.status]} />\n}\n","\"use client\"\n\nimport { Handle, Position, type Node, type NodeProps } from \"@xyflow/react\"\nimport { AlertTriangle, Check } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\nimport type { RoadmapItem, RoadmapStatus, TaskStatus } from \"@/types\"\nimport type { DueState, TaskDueSummary } from \"@/lib/roadmap-health\"\nimport { formatDay } from \"./timeline\"\nimport { FEATURE_W, HORIZON_W } from \"./layout\"\nimport { AgentMark } from \"@/components/chat/AgentMark\"\nimport { useItemAgent } from \"@/context/ChatContext\"\n\nexport type RoadmapNodeData = {\n item: RoadmapItem\n progress?: { done: number; total: number } // derived, never persisted\n drift?: string[]\n dueState?: DueState | null\n taskDue?: TaskDueSummary | null\n taskDueSoon?: boolean\n taskStatuses?: TaskStatus[] // feature: linked tasks in order, cancelled/missing left out\n nextTaskId?: string | null // feature: what vibedoc_next_task would hand out\n chapter?: number // horizon: 1-based position on the spine\n epics?: { done: number; total: number } // horizon: child epics\n}\nexport type RoadmapNode = Node<RoadmapNodeData, \"horizon\" | \"feature\">\n\nconst SIDES = [Position.Top, Position.Right, Position.Bottom, Position.Left]\n\n/** One invisible source + target handle per side; edges pick `side` / `side-t`. */\nfunction Handles() {\n return (\n <>\n {SIDES.map((p) => (\n <Handle key={p} id={p} type=\"source\" position={p} isConnectable={false} className=\"opacity-0\" />\n ))}\n {SIDES.map((p) => (\n <Handle key={`${p}-t`} id={`${p}-t`} type=\"target\" position={p} isConnectable={false} className=\"opacity-0\" />\n ))}\n </>\n )\n}\n\nexport const STATUS_LABEL: Record<RoadmapStatus, string> = { \"in-progress\": \"Active\", paused: \"Paused\", done: \"Done\", planned: \"Planned\" }\n\n/** Roadmap status as a dot: live = accent with a pulse, done = teal, planned = hollow. */\nexport function StatusDot({ status, className }: { status: RoadmapStatus; className?: string }) {\n return (\n <span title={STATUS_LABEL[status]} aria-label={STATUS_LABEL[status]} className={cn(\"relative inline-flex h-2 w-2 shrink-0\", className)}>\n {status === \"in-progress\" && <span className=\"absolute inset-0 animate-ping rounded-full bg-accent/60\" />}\n <span\n className={cn(\n \"relative h-full w-full rounded-full\",\n status === \"done\" && \"bg-teal\",\n status === \"in-progress\" && \"bg-accent\",\n status === \"planned\" && \"border border-muted\",\n status === \"paused\" && \"border-2 border-y-0 border-muted\",\n )}\n />\n </span>\n )\n}\n\nexport function StatusPill({ status }: { status: RoadmapStatus }) {\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-full border px-2 py-0.5 font-mono text-[10px] uppercase tracking-wider\",\n status === \"done\" && \"border-teal/40 text-teal\",\n status === \"in-progress\" && \"border-accent/50 text-accent\",\n status === \"planned\" && \"border-dashed border-border2 text-muted\",\n status === \"paused\" && \"border-border2 text-muted\",\n )}\n >\n <StatusDot status={status} className=\"h-1.5 w-1.5\" />\n {STATUS_LABEL[status]}\n </span>\n )\n}\n\nexport const TASK_STATUS_BG: Record<TaskStatus, string> = {\n done: \"bg-teal\",\n \"in-progress\": \"bg-amber\",\n review: \"bg-accent\",\n blocked: \"bg-danger\",\n paused: \"bg-muted/60\",\n todo: \"bg-border2\",\n cancelled: \"bg-border\",\n}\n\n/** One segment per task, colored by its board status (same colors as the board). */\nexport function SegmentedProgress({ statuses, className }: { statuses?: TaskStatus[]; className?: string }) {\n if (!statuses?.length) return null\n const done = statuses.filter((s) => s === \"done\").length\n return (\n <div className={cn(\"flex h-1.5 min-w-0 flex-1 gap-0.5\", className)} title={`${done}/${statuses.length} tasks done`}>\n {statuses.map((s, i) => (\n <span key={i} className={cn(\"h-full flex-1 rounded-[1px]\", TASK_STATUS_BG[s])} />\n ))}\n </div>\n )\n}\n\n/** Small progress ring; color follows `className` (currentColor). */\nexport function ProgressRing({ value, total, className }: { value: number; total: number; className?: string }) {\n const r = 14\n const c = 2 * Math.PI * r\n const pct = total > 0 ? value / total : 0\n return (\n <span className={cn(\"relative inline-flex h-9 w-9 shrink-0 items-center justify-center\", className)} title={`${value}/${total} tasks done`}>\n <svg viewBox=\"0 0 36 36\" className=\"absolute inset-0 -rotate-90\">\n <circle cx=\"18\" cy=\"18\" r={r} fill=\"none\" strokeWidth=\"3\" className=\"stroke-border\" />\n <circle cx=\"18\" cy=\"18\" r={r} fill=\"none\" strokeWidth=\"3\" stroke=\"currentColor\" strokeLinecap=\"round\"\n strokeDasharray={c} strokeDashoffset={c * (1 - pct)} />\n </svg>\n <span className=\"font-mono text-[9px] text-txt\">{Math.round(pct * 100)}</span>\n </span>\n )\n}\n\nexport function Progress({ progress }: { progress?: RoadmapNodeData[\"progress\"] }) {\n if (!progress) return null\n const pct = Math.round((progress.done / progress.total) * 100)\n return (\n <div className=\"flex items-center gap-1.5\" title={`${progress.done}/${progress.total} done`}>\n <div className=\"h-1 flex-1 overflow-hidden rounded-full bg-border\">\n <div className=\"h-full rounded-full bg-teal\" style={{ width: `${pct}%` }} />\n </div>\n <span className=\"font-mono text-[10px] text-muted\">{progress.done}/{progress.total}</span>\n </div>\n )\n}\n\nexport function DueChip({ due, state }: { due: string | null; state?: DueState | null }) {\n if (!due) return null\n return (\n <span\n className={cn(\n \"font-mono text-[10px]\",\n state === \"overdue\" ? \"text-danger\" : state === \"soon\" ? \"text-amber\" : \"text-muted\",\n )}\n >\n Due {formatDay(due)}\n </span>\n )\n}\n\n/** The single most urgent date line for a card: overdue tasks, then the epic's own due, then the next task due. */\nfunction DueNote({ data }: { data: RoadmapNodeData }) {\n const s = data.taskDue\n if (s && s.overdue > 0) {\n return <span className=\"font-mono text-[10px] text-danger\">{s.overdue} {s.overdue === 1 ? \"task\" : \"tasks\"} overdue</span>\n }\n if (data.item.due) return <DueChip due={data.item.due} state={data.dueState} />\n if (s?.next) return <span className={cn(\"font-mono text-[10px]\", data.taskDueSoon ? \"text-amber\" : \"text-muted\")}>Next due {formatDay(s.next)}</span>\n return null\n}\n\nfunction DriftMark({ drift }: { drift?: string[] }) {\n if (!drift?.length) return null\n return (\n <span title={drift.join(\"\\n\")} className=\"absolute -left-2 -top-2 rounded-full bg-bg p-0.5 text-amber\">\n <AlertTriangle className=\"h-3.5 w-3.5\" />\n </span>\n )\n}\n\n/** A horizon is a chapter: big number, title, epic count, and a ring for task progress. */\nexport function HorizonNode({ data, selected }: NodeProps<RoadmapNode>) {\n const { item, progress, epics, chapter } = data\n const status = item.status\n return (\n <div\n style={{ width: HORIZON_W }}\n className={cn(\n \"relative flex items-center gap-3 rounded-xl border bg-surface px-3.5 py-3 transition-shadow duration-(--duration-base)\",\n status === \"in-progress\" && \"border-accent/60 shadow-[0_0_0_1px_rgb(var(--rgb-accent)/0.25),0_10px_30px_-12px_rgb(var(--rgb-accent)/0.6)]\",\n status === \"done\" && \"border-teal/40\",\n status === \"planned\" && \"border-dashed border-border2\",\n status === \"paused\" && \"border-border2 opacity-75\",\n selected && \"ring-2 ring-accent/60 ring-offset-2 ring-offset-bg\",\n )}\n >\n <Handles />\n <span\n className={cn(\n \"font-mono text-2xl font-semibold leading-none tabular-nums\",\n status === \"in-progress\" ? \"text-accent\" : status === \"done\" ? \"text-teal\" : \"text-muted\",\n )}\n >\n {chapter ? String(chapter).padStart(2, \"0\") : \"··\"}\n </span>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-xs font-semibold uppercase leading-snug tracking-wider text-txt\">{item.title}</p>\n <p className=\"mt-1 flex flex-wrap items-center gap-x-2 font-mono text-[10px] text-muted\">\n {epics && epics.total > 0 && <span>{epics.done}/{epics.total} epics</span>}\n <DueChip due={item.due} state={data.dueState} />\n </p>\n </div>\n {progress && (\n <ProgressRing value={progress.done} total={progress.total} className={status === \"done\" ? \"text-teal\" : \"text-accent\"} />\n )}\n <DriftMark drift={data.drift} />\n </div>\n )\n}\n\n/**\n * Three looks so the eye lands on live work: live = lit card with task segments and the next task,\n * done = one quiet line, planned = dashed outline. Height stays under ROW_H (layout.ts) so saved positions never overlap.\n */\nexport function FeatureNode({ data, selected }: NodeProps<RoadmapNode>) {\n const { item, taskStatuses, nextTaskId } = data\n const agent = useItemAgent({ kind: \"epic\", id: item.id })\n const drifting = !!data.drift?.length\n const ring = selected && \"ring-2 ring-accent/60 ring-offset-2 ring-offset-bg\"\n\n if (item.status === \"done\") {\n return (\n <div\n style={{ width: FEATURE_W }}\n className={cn(\"group relative flex items-center gap-2 rounded-lg border border-border bg-surface/60 px-3 py-2 hover:border-teal/40\", ring)}\n >\n <Handles />\n <Check className=\"h-3.5 w-3.5 shrink-0 text-teal\" strokeWidth={3} />\n <p className=\"min-w-0 flex-1 truncate text-[13px] text-muted group-hover:text-txt\" title={item.title}>{item.title}</p>\n {agent ? <AgentMark attach={{ kind: \"epic\", id: item.id }} />\n : data.progress && <span className=\"font-mono text-[10px] text-muted\">{data.progress.done}/{data.progress.total}</span>}\n <DriftMark drift={data.drift} />\n </div>\n )\n }\n\n const live = item.status === \"in-progress\"\n return (\n <div\n style={{ width: FEATURE_W }}\n className={cn(\n \"relative flex flex-col gap-1.5 rounded-lg border px-3 py-2.5 transition-shadow duration-(--duration-base)\",\n live\n ? \"border-accent/50 bg-surface shadow-[0_8px_24px_-10px_rgb(var(--rgb-accent)/0.55)]\"\n : \"border-dashed border-border2 bg-bg hover:border-muted\",\n item.status === \"paused\" && \"opacity-70\",\n ring,\n )}\n >\n <Handles />\n {live && <span className={cn(\"absolute -inset-y-px -left-px w-[3px] rounded-l-lg\", drifting ? \"bg-amber\" : \"bg-accent\")} />}\n <div className=\"flex items-center justify-between font-mono text-[10px]\">\n <span className=\"text-muted\">{item.id}</span>\n {agent ? (\n <AgentMark attach={{ kind: \"epic\", id: item.id }} />\n ) : live ? (\n <span className=\"flex items-center gap-1.5 uppercase tracking-wider text-accent\"><StatusDot status=\"in-progress\" className=\"h-1.5 w-1.5\" />Live</span>\n ) : (\n <span className=\"uppercase tracking-wider text-muted\">{item.tasks.length ? `${item.tasks.length} tasks` : \"No tasks yet\"}</span>\n )}\n </div>\n <p className={cn(\"line-clamp-2 text-[13px] leading-snug\", live ? \"font-medium text-txt\" : \"text-txt/80\")} title={item.title}>\n {item.title}\n </p>\n {taskStatuses && taskStatuses.length > 0 && (\n <div className=\"flex items-center gap-2\">\n <SegmentedProgress statuses={taskStatuses} />\n <span className=\"shrink-0 font-mono text-[10px] text-muted\">\n {live && nextTaskId ? <>next <span className=\"text-txt\">{nextTaskId}</span></> : `${taskStatuses.filter((s) => s === \"done\").length}/${taskStatuses.length}`}\n </span>\n </div>\n )}\n <DueNote data={data} />\n <DriftMark drift={data.drift} />\n </div>\n )\n}\n\nexport const nodeTypes = { horizon: HorizonNode, feature: FeatureNode }\n","/**\n * src/lib/roadmap-health.ts\n * Pure (no fs): roadmap progress + drift, shared by the Roadmap page and the MCP handler.\n * A feature's expected status comes from its linked tasks; a horizon's from its features.\n */\n\nimport type { RoadmapItem, RoadmapStatus, Task } from './core'\n\n/** What health needs from a task: status for progress, due for at-risk. */\nexport type TaskInfo = Pick<Task, 'status' | 'due'>\n\nexport interface RoadmapProgress { done: number; total: number }\n\nexport interface RoadmapDrift {\n id: string\n kind: 'status-mismatch' | 'missing-task' | 'overdue' | 'at-risk'\n message: string\n suggestedStatus?: RoadmapStatus\n}\n\nexport interface RoadmapHealth {\n progress: Record<string, RoadmapProgress>\n drift: RoadmapDrift[]\n}\n\nexport type DueState = 'overdue' | 'soon' | 'ok' | 'done'\n\nconst SOON_DAYS = 7\n\n/** Local calendar date \"YYYY-MM-DD\" (due dates are calendar dates, not instants). */\nexport function localToday(now = new Date()): string {\n const p = (n: number) => String(n).padStart(2, '0')\n return `${now.getFullYear()}-${p(now.getMonth() + 1)}-${p(now.getDate())}`\n}\n\nfunction daysBetween(from: string, to: string): number {\n const utc = (d: string) => Date.UTC(+d.slice(0, 4), +d.slice(5, 7) - 1, +d.slice(8, 10))\n return Math.round((utc(to) - utc(from)) / 86_400_000)\n}\n\nexport function dueState(due: string | null, status: RoadmapStatus, today: string): DueState | null {\n if (!due) return null\n if (status === 'done') return 'done'\n if (due < today) return 'overdue'\n return daysBetween(today, due) <= SOON_DAYS ? 'soon' : 'ok'\n}\n\ntype Started = 'done' | 'in-progress' | 'other'\n\nfunction expectedStatus(states: Started[]): RoadmapStatus {\n if (states.every(s => s === 'done')) return 'done'\n if (states.some(s => s !== 'other')) return 'in-progress'\n return 'planned'\n}\n\nexport interface TaskDueSummary { overdue: number; next: string | null }\n\n/** Open tasks' deadlines for a map node: how many are overdue, and the nearest upcoming due. */\nexport function taskDueSummary(taskIds: string[], tasks: Record<string, TaskInfo>, today: string): TaskDueSummary | null {\n const dues = taskIds\n .map(id => tasks[id])\n .filter(t => t && t.due && t.status !== 'done' && t.status !== 'cancelled')\n .map(t => t.due as string)\n if (!dues.length) return null\n const upcoming = dues.filter(d => d >= today).sort()\n return { overdue: dues.length - upcoming.length, next: upcoming[0] ?? null }\n}\n\n/** Why an unfinished epic may miss its date: overdue or blocked tasks, or due soon with nothing started. */\nfunction atRiskReasons(item: RoadmapItem, linked: string[], tasks: Record<string, TaskInfo>, today: string): string[] {\n const reasons: string[] = []\n for (const id of linked) {\n const t = tasks[id]\n if (t.status !== 'done' && t.due && t.due < today) reasons.push(`${id} overdue since ${t.due}`)\n if (t.status === 'blocked') reasons.push(`${id} blocked`)\n }\n const started = linked.some(id => ['done', 'in-progress', 'review'].includes(tasks[id].status))\n if (item.due && dueState(item.due, item.status, today) === 'soon' && !started) {\n reasons.push(`due ${item.due}, nothing started`)\n }\n return reasons\n}\n\nexport function roadmapHealth(\n items: RoadmapItem[], tasks: Record<string, TaskInfo>, today: string,\n): RoadmapHealth {\n const progress: Record<string, RoadmapProgress> = {}\n const drift: RoadmapDrift[] = []\n\n for (const item of items) {\n if (item.due && dueState(item.due, item.status, today) === 'overdue') {\n drift.push({ id: item.id, kind: 'overdue', message: `${item.id} \"${item.title}\" is overdue since ${item.due}` })\n }\n }\n const horizonIds = new Set(items.filter(i => i.parent === null).map(i => i.id))\n\n for (const item of items) {\n if (item.parent === null) continue\n const missing = item.tasks.filter(t => !(t in tasks))\n if (missing.length) {\n drift.push({ id: item.id, kind: 'missing-task', message: `${item.id} links unknown task ${missing.join(', ')}` })\n }\n // cancelled tasks don't count toward progress or expected status\n const linked = item.tasks.filter(t => t in tasks && tasks[t].status !== 'cancelled')\n // a paused epic is stopped on purpose: not at risk\n const risks = item.status === 'done' || item.status === 'paused' ? [] : atRiskReasons(item, linked, tasks, today)\n if (risks.length) {\n drift.push({ id: item.id, kind: 'at-risk', message: `${item.id} \"${item.title}\" at risk: ${risks.join('; ')}` })\n }\n if (!linked.length) continue\n const states: Started[] = linked.map(t =>\n tasks[t].status === 'done' ? 'done' : tasks[t].status === 'in-progress' || tasks[t].status === 'review' ? 'in-progress' : 'other')\n progress[item.id] = { done: states.filter(s => s === 'done').length, total: linked.length }\n const expected = expectedStatus(states)\n // paused stays paused until everything is done\n if (expected !== item.status && !(item.status === 'paused' && expected !== 'done')) {\n const open = linked.filter(t => tasks[t].status !== 'done')\n drift.push({\n id: item.id,\n kind: 'status-mismatch',\n message: expected === 'done'\n ? `${item.id} \"${item.title}\": all tasks done but status is ${item.status}`\n : `${item.id} \"${item.title}\" is ${item.status} but tasks ${open.join(', ')} are not done`,\n suggestedStatus: expected,\n })\n }\n }\n\n for (const h of items) {\n if (!horizonIds.has(h.id)) continue\n const kids = items.filter(i => i.parent === h.id)\n if (!kids.length) continue\n const states: Started[] = kids.map(k => k.status === 'done' ? 'done' : k.status === 'in-progress' ? 'in-progress' : 'other')\n // weight by tasks; an epic not broken down yet counts as one unit\n progress[h.id] = kids.reduce((sum, k) => {\n const p = progress[k.id] ?? { done: k.status === 'done' ? 1 : 0, total: 1 }\n return { done: sum.done + p.done, total: sum.total + p.total }\n }, { done: 0, total: 0 })\n const expected = expectedStatus(states)\n if (expected !== h.status && !(h.status === 'paused' && expected !== 'done')) {\n drift.push({\n id: h.id,\n kind: 'status-mismatch',\n message: `${h.id} \"${h.title}\" is ${h.status} but its features say ${expected}`,\n suggestedStatus: expected,\n })\n }\n }\n\n return { progress, drift }\n}\n","import type { RoadmapItem, RoadmapLayout } from \"@/types\"\n\nexport const HORIZON_W = 260\nexport const FEATURE_W = 220\nconst BRANCH_DX = 340\nconst ROW_H = 110\nconst HORIZON_GAP = 90\nconst COL_DX = FEATURE_W + 40\nconst MAX_ROWS_PER_SIDE = 6 // beyond this, a side gets a second (outer, half-row staggered) column\n\n/** Items that sit on the spine: real horizons plus orphans whose parent is not a horizon. */\nexport function spineItems(items: RoadmapItem[]): RoadmapItem[] {\n const horizonIds = new Set(items.filter((i) => i.parent === null).map((i) => i.id))\n return items\n .filter((i) => i.parent === null || !horizonIds.has(i.parent))\n .sort((a, b) => a.order - b.order)\n}\n\nexport function childrenOf(items: RoadmapItem[], parentId: string): RoadmapItem[] {\n return items.filter((i) => i.parent === parentId).sort((a, b) => a.order - b.order)\n}\n\n/**\n * Resolve a position for every item: saved (layout.json) wins, otherwise auto-place.\n * Horizons stack on x=0 by order; children alternate right/left of their parent's RESOLVED position.\n */\nexport function resolvePositions(items: RoadmapItem[], layout: RoadmapLayout): RoadmapLayout {\n const out: RoadmapLayout = {}\n let cursor = 0\n for (const h of spineItems(items)) {\n const hp = layout[h.id] ?? { x: 0, y: cursor }\n out[h.id] = hp\n const kids = h.parent === null ? childrenOf(items, h.id) : []\n const cols = Math.ceil(kids.length / 2) > MAX_ROWS_PER_SIDE ? 2 : 1\n kids.forEach((c, i) => {\n const side = i % 2 === 0 ? 1 : -1\n const k = Math.floor(i / 2) // index within its side\n const col = k % cols\n const row = Math.floor(k / cols)\n out[c.id] = layout[c.id] ?? {\n x: hp.x + (HORIZON_W - FEATURE_W) / 2 + side * (BRANCH_DX + col * COL_DX),\n // outer column sits half a row lower so its edges pass between inner nodes\n y: hp.y + row * ROW_H + col * (ROW_H / 2),\n }\n })\n const rows = Math.ceil(Math.ceil(kids.length / 2) / cols)\n cursor += Math.max(1, rows) * ROW_H + HORIZON_GAP\n }\n return out\n}\n","import type { RoadmapItem } from \"@/types\"\nimport { dueState, type DueState } from \"@/lib/roadmap-health\"\nimport { childrenOf, spineItems } from \"./layout\"\n\nexport const MONTH_W = 160\nexport const LANE_ROW_H = 44\nconst LABEL_W = 180 // horizontal room a marker's label needs before the next one fits on the same row\nconst MIN_MONTHS = 6\n\nconst MONTHS = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n\n// Dates are \"YYYY-MM-DD\" calendar dates — parsed by hand, never via new Date(string) (UTC shift).\nconst ymd = (d: string) => ({ y: +d.slice(0, 4), m: +d.slice(5, 7), day: +d.slice(8, 10) })\nconst daysIn = (y: number, m: number) => new Date(y, m, 0).getDate()\n\nexport function formatDay(d: string): string {\n const { m, day } = ymd(d)\n return `${day} ${MONTHS[m - 1]}`\n}\n\nexport interface TimelineMarker { item: RoadmapItem; x: number; row: number; state: DueState | null; horizon: boolean }\nexport interface TimelineLane { item: RoadmapItem; rows: number; markers: TimelineMarker[] }\nexport interface Timeline {\n months: { label: string; x: number }[]\n width: number\n todayX: number\n lanes: TimelineLane[]\n undated: RoadmapItem[]\n}\n\nexport function buildTimeline(items: RoadmapItem[], today: string): Timeline {\n const dues = items.map((i) => i.due).filter((d): d is string => !!d)\n const first = ymd([today, ...dues].sort()[0])\n const last = ymd([today, ...dues].sort().at(-1) ?? today)\n\n // pad one month each side, then stretch to a readable minimum\n const start = { y: first.y, m: first.m - 1 }\n const span = Math.max(MIN_MONTHS, (last.y - first.y) * 12 + (last.m - first.m) + 3)\n const months = Array.from({ length: span }, (_, i) => {\n const t = start.y * 12 + (start.m - 1) + i\n const y = Math.floor(t / 12)\n const m = (t % 12) + 1\n return { y, m, label: m === 1 || i === 0 ? `${MONTHS[m - 1]} ${y}` : MONTHS[m - 1], x: i * MONTH_W }\n })\n\n const xOf = (d: string) => {\n const { y, m, day } = ymd(d)\n const idx = (y - months[0].y) * 12 + (m - months[0].m)\n return idx * MONTH_W + ((day - 0.5) / daysIn(y, m)) * MONTH_W\n }\n\n const lanes = spineItems(items).map((h) => {\n const dated = [h, ...(h.parent === null ? childrenOf(items, h.id) : [])].filter((i) => i.due)\n const rowEnds: number[] = []\n const markers = dated\n .map((item) => ({ item, x: xOf(item.due as string), horizon: item.id === h.id }))\n .sort((a, b) => a.x - b.x)\n .map((mk) => {\n // greedy: first row whose last label ends before this marker\n let row = rowEnds.findIndex((end) => mk.x >= end)\n if (row === -1) row = rowEnds.push(0) - 1\n rowEnds[row] = mk.x + LABEL_W\n return { ...mk, row, state: dueState(mk.item.due, mk.item.status, today) }\n })\n return { item: h, rows: Math.max(1, rowEnds.length), markers }\n })\n\n return {\n months: months.map(({ label, x }) => ({ label, x })),\n width: span * MONTH_W,\n todayX: xOf(today),\n lanes,\n undated: items.filter((i) => !i.due && i.status !== \"done\"), // shipped work needs no date\n }\n}\n"],"names":["AGENT_LABEL","running","review","AgentMark","attach","className","agent","show","label","status","type","onClick","e","stopPropagation","chatId","title","AgentDot","SIDES","Top","Right","Bottom","Left","Handles","map","p","id","position","isConnectable","STATUS_LABEL","paused","done","planned","StatusDot","StatusPill","TASK_STATUS_BG","blocked","todo","cancelled","SegmentedProgress","statuses","length","filter","s","i","ProgressRing","value","total","r","c","Math","PI","pct","viewBox","cx","cy","fill","strokeWidth","stroke","strokeLinecap","strokeDasharray","strokeDashoffset","round","Progress","progress","style","width","DueChip","due","state","DueNote","data","taskDue","overdue","item","dueState","next","taskDueSoon","DriftMark","drift","join","HorizonNode","selected","epics","chapter","String","padStart","FeatureNode","taskStatuses","nextTaskId","kind","drifting","ring","live","tasks","nodeTypes","horizon","feature","SOON_DAYS","localToday","now","Date","n","getFullYear","getMonth","getDate","daysBetween","from","to","utc","d","UTC","slice","today","expectedStatus","states","every","some","taskDueSummary","taskIds","dues","t","upcoming","sort","atRiskReasons","linked","reasons","push","started","includes","roadmapHealth","items","message","horizonIds","Set","parent","missing","risks","expected","open","suggestedStatus","h","has","kids","k","reduce","sum"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/components/chat/AgentMark.tsx","../../../../src/components/roadmap/RoadmapNodes.tsx","../../../../src/lib/roadmap-health.ts","../../../../src/components/roadmap/layout.ts","../../../../src/components/roadmap/timeline.ts"],"sourcesContent":["\"use client\"\n\nimport { Bot, Loader2 } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\nimport { useChats, useItemAgent } from \"@/context/ChatContext\"\nimport type { Attach, ItemAgent } from \"@/lib/chats\"\nimport { StatusMarker } from \"./StatusMarker\"\n\nexport const AGENT_LABEL: Record<ItemAgent[\"status\"], string> = {\n running: \"Agent working\",\n \"needs-answer\": \"Agent needs you\",\n review: \"Plan to review\",\n}\n\n/**\n * Pill on an epic/task while a chat works on it; click opens that chat.\n * `nodrag` + stopPropagation keep a React Flow node from dragging/selecting on click.\n */\nexport function AgentMark({ attach, className }: { attach: Attach; className?: string }) {\n const agent = useItemAgent(attach)\n const { show } = useChats()\n if (!agent) return null\n const label = AGENT_LABEL[agent.status]\n return (\n <button\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); show(agent.chatId) }}\n title={`${label} · open chat`}\n aria-label={`${label}, open chat`}\n className={cn(\n \"nodrag inline-flex shrink-0 items-center gap-1 rounded-full border px-1.5 py-px font-mono text-[10px] leading-4 animate-fade-in transition-colors duration-(--duration-fast)\",\n agent.status === \"running\" && \"border-accent/50 text-accent hover:bg-accent/10\",\n agent.status === \"needs-answer\" && \"border-amber/50 text-amber hover:bg-amber/10\",\n agent.status === \"review\" && \"border-accent/50 bg-accent/10 text-accent hover:bg-accent/20\",\n className,\n )}\n >\n {agent.status === \"running\" ? <Loader2 className=\"size-3 animate-spin\" aria-hidden /> : <Bot className=\"size-3\" aria-hidden />}\n {label}\n </button>\n )\n}\n\n/** Non-interactive variant for places that are already a button (timeline markers, board cards, task rows). */\nexport function AgentDot({ attach }: { attach: Attach }) {\n const agent = useItemAgent(attach)\n if (!agent) return null\n return <StatusMarker status={agent.status} label={AGENT_LABEL[agent.status]} />\n}\n","\"use client\"\n\nimport { Handle, Position, type Node, type NodeProps } from \"@xyflow/react\"\nimport { AlertTriangle, Check } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\nimport type { RoadmapItem, RoadmapStatus, TaskStatus } from \"@/types\"\nimport type { DueState, TaskDueSummary } from \"@/lib/roadmap-health\"\nimport { formatDay } from \"./timeline\"\nimport { FEATURE_W, HORIZON_W } from \"./layout\"\nimport { AgentMark } from \"@/components/chat/AgentMark\"\nimport { useItemAgent } from \"@/context/ChatContext\"\n\nexport type RoadmapNodeData = {\n item: RoadmapItem\n progress?: { done: number; total: number } // derived, never persisted\n drift?: string[]\n dueState?: DueState | null\n taskDue?: TaskDueSummary | null\n taskDueSoon?: boolean\n taskStatuses?: TaskStatus[] // feature: linked tasks in order, cancelled/missing left out\n nextTaskId?: string | null // feature: what vibedoc_next_task would hand out\n chapter?: number // horizon: 1-based position on the spine\n epics?: { done: number; total: number } // horizon: child epics\n}\nexport type RoadmapNode = Node<RoadmapNodeData, \"horizon\" | \"feature\">\n\nconst SIDES = [Position.Top, Position.Right, Position.Bottom, Position.Left]\n\n/** One invisible source + target handle per side; edges pick `side` / `side-t`. */\nfunction Handles() {\n return (\n <>\n {SIDES.map((p) => (\n <Handle key={p} id={p} type=\"source\" position={p} isConnectable={false} className=\"opacity-0\" />\n ))}\n {SIDES.map((p) => (\n <Handle key={`${p}-t`} id={`${p}-t`} type=\"target\" position={p} isConnectable={false} className=\"opacity-0\" />\n ))}\n </>\n )\n}\n\nexport const STATUS_LABEL: Record<RoadmapStatus, string> = { \"in-progress\": \"Active\", paused: \"Paused\", done: \"Done\", planned: \"Planned\" }\n\n/** Roadmap status as a dot: live = accent with a pulse, done = teal, planned = hollow. */\nexport function StatusDot({ status, className }: { status: RoadmapStatus; className?: string }) {\n return (\n <span title={STATUS_LABEL[status]} aria-label={STATUS_LABEL[status]} className={cn(\"relative inline-flex h-2 w-2 shrink-0\", className)}>\n {status === \"in-progress\" && <span className=\"absolute inset-0 animate-ping rounded-full bg-accent/60\" />}\n <span\n className={cn(\n \"relative h-full w-full rounded-full\",\n status === \"done\" && \"bg-teal\",\n status === \"in-progress\" && \"bg-accent\",\n status === \"planned\" && \"border border-muted\",\n status === \"paused\" && \"bg-muted\",\n )}\n />\n </span>\n )\n}\n\nexport function StatusPill({ status }: { status: RoadmapStatus }) {\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-full border px-2 py-0.5 font-mono text-[10px] uppercase tracking-wider\",\n status === \"done\" && \"border-teal/40 text-teal\",\n status === \"in-progress\" && \"border-accent/50 text-accent\",\n status === \"planned\" && \"border-dashed border-border2 text-muted\",\n status === \"paused\" && \"border-border2 text-muted\",\n )}\n >\n <StatusDot status={status} className=\"h-1.5 w-1.5\" />\n {STATUS_LABEL[status]}\n </span>\n )\n}\n\nexport const TASK_STATUS_BG: Record<TaskStatus, string> = {\n done: \"bg-teal\",\n \"in-progress\": \"bg-amber\",\n review: \"bg-accent\",\n blocked: \"bg-danger\",\n paused: \"bg-muted/60\",\n todo: \"bg-border2\",\n cancelled: \"bg-border\",\n}\n\n/** One segment per task, colored by its board status (same colors as the board). */\nexport function SegmentedProgress({ statuses, className }: { statuses?: TaskStatus[]; className?: string }) {\n if (!statuses?.length) return null\n const done = statuses.filter((s) => s === \"done\").length\n return (\n <div className={cn(\"flex h-1.5 min-w-0 flex-1 gap-0.5\", className)} title={`${done}/${statuses.length} tasks done`}>\n {statuses.map((s, i) => (\n <span key={i} className={cn(\"h-full flex-1 rounded-[1px]\", TASK_STATUS_BG[s])} />\n ))}\n </div>\n )\n}\n\n/** Small progress ring; color follows `className` (currentColor). */\nexport function ProgressRing({ value, total, className }: { value: number; total: number; className?: string }) {\n const r = 14\n const c = 2 * Math.PI * r\n const pct = total > 0 ? value / total : 0\n return (\n <span className={cn(\"relative inline-flex h-9 w-9 shrink-0 items-center justify-center\", className)} title={`${value}/${total} tasks done`}>\n <svg viewBox=\"0 0 36 36\" className=\"absolute inset-0 -rotate-90\">\n <circle cx=\"18\" cy=\"18\" r={r} fill=\"none\" strokeWidth=\"3\" className=\"stroke-border\" />\n <circle cx=\"18\" cy=\"18\" r={r} fill=\"none\" strokeWidth=\"3\" stroke=\"currentColor\" strokeLinecap=\"round\"\n strokeDasharray={c} strokeDashoffset={c * (1 - pct)} />\n </svg>\n <span className=\"font-mono text-[9px] text-txt\">{Math.round(pct * 100)}</span>\n </span>\n )\n}\n\nexport function Progress({ progress }: { progress?: RoadmapNodeData[\"progress\"] }) {\n if (!progress) return null\n const pct = Math.round((progress.done / progress.total) * 100)\n return (\n <div className=\"flex items-center gap-1.5\" title={`${progress.done}/${progress.total} done`}>\n <div className=\"h-1 flex-1 overflow-hidden rounded-full bg-border\">\n <div className=\"h-full rounded-full bg-teal\" style={{ width: `${pct}%` }} />\n </div>\n <span className=\"font-mono text-[10px] text-muted\">{progress.done}/{progress.total}</span>\n </div>\n )\n}\n\nexport function DueChip({ due, state }: { due: string | null; state?: DueState | null }) {\n if (!due) return null\n return (\n <span\n className={cn(\n \"font-mono text-[10px]\",\n state === \"overdue\" ? \"text-danger\" : state === \"soon\" ? \"text-amber\" : \"text-muted\",\n )}\n >\n Due {formatDay(due)}\n </span>\n )\n}\n\n/** The single most urgent date line for a card: overdue tasks, then the epic's own due, then the next task due. */\nfunction DueNote({ data }: { data: RoadmapNodeData }) {\n const s = data.taskDue\n if (s && s.overdue > 0) {\n return <span className=\"font-mono text-[10px] text-danger\">{s.overdue} {s.overdue === 1 ? \"task\" : \"tasks\"} overdue</span>\n }\n if (data.item.due) return <DueChip due={data.item.due} state={data.dueState} />\n if (s?.next) return <span className={cn(\"font-mono text-[10px]\", data.taskDueSoon ? \"text-amber\" : \"text-muted\")}>Next due {formatDay(s.next)}</span>\n return null\n}\n\nfunction DriftMark({ drift }: { drift?: string[] }) {\n if (!drift?.length) return null\n return (\n <span title={drift.join(\"\\n\")} className=\"absolute -left-2 -top-2 rounded-full bg-bg p-0.5 text-amber\">\n <AlertTriangle className=\"h-3.5 w-3.5\" />\n </span>\n )\n}\n\n/** A horizon is a chapter: big number, title, epic count, and a ring for task progress. */\nexport function HorizonNode({ data, selected }: NodeProps<RoadmapNode>) {\n const { item, progress, epics, chapter } = data\n const status = item.status\n return (\n <div\n style={{ width: HORIZON_W }}\n className={cn(\n \"relative flex items-center gap-3 rounded-xl border bg-surface px-3.5 py-3 transition-shadow duration-(--duration-base)\",\n status === \"in-progress\" && \"border-accent/60 shadow-[0_0_0_1px_rgb(var(--rgb-accent)/0.25),0_10px_30px_-12px_rgb(var(--rgb-accent)/0.6)]\",\n status === \"done\" && \"border-teal/40\",\n status === \"planned\" && \"border-dashed border-border2\",\n status === \"paused\" && \"border-border2 opacity-75\",\n selected && \"ring-2 ring-accent/60 ring-offset-2 ring-offset-bg\",\n )}\n >\n <Handles />\n <span\n className={cn(\n \"font-mono text-2xl font-semibold leading-none tabular-nums\",\n status === \"in-progress\" ? \"text-accent\" : status === \"done\" ? \"text-teal\" : \"text-muted\",\n )}\n >\n {chapter ? String(chapter).padStart(2, \"0\") : \"··\"}\n </span>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-xs font-semibold uppercase leading-snug tracking-wider text-txt\">{item.title}</p>\n <p className=\"mt-1 flex flex-wrap items-center gap-x-2 font-mono text-[10px] text-muted\">\n {epics && epics.total > 0 && <span>{epics.done}/{epics.total} epics</span>}\n <DueChip due={item.due} state={data.dueState} />\n </p>\n </div>\n {progress && (\n <ProgressRing value={progress.done} total={progress.total} className={status === \"done\" ? \"text-teal\" : \"text-accent\"} />\n )}\n <DriftMark drift={data.drift} />\n </div>\n )\n}\n\n/**\n * Three looks so the eye lands on live work: live = lit card with task segments and the next task,\n * done = one quiet line, planned = dashed outline. Height stays under ROW_H (layout.ts) so saved positions never overlap.\n */\nexport function FeatureNode({ data, selected }: NodeProps<RoadmapNode>) {\n const { item, taskStatuses, nextTaskId } = data\n const agent = useItemAgent({ kind: \"epic\", id: item.id })\n const drifting = !!data.drift?.length\n const ring = selected && \"ring-2 ring-accent/60 ring-offset-2 ring-offset-bg\"\n\n if (item.status === \"done\") {\n return (\n <div\n style={{ width: FEATURE_W }}\n className={cn(\"group relative flex items-center gap-2 rounded-lg border border-border bg-surface/60 px-3 py-2 hover:border-teal/40\", ring)}\n >\n <Handles />\n <Check className=\"h-3.5 w-3.5 shrink-0 text-teal\" strokeWidth={3} />\n <p className=\"min-w-0 flex-1 truncate text-[13px] text-muted group-hover:text-txt\" title={item.title}>{item.title}</p>\n {agent ? <AgentMark attach={{ kind: \"epic\", id: item.id }} />\n : data.progress && <span className=\"font-mono text-[10px] text-muted\">{data.progress.done}/{data.progress.total}</span>}\n <DriftMark drift={data.drift} />\n </div>\n )\n }\n\n const live = item.status === \"in-progress\"\n return (\n <div\n style={{ width: FEATURE_W }}\n className={cn(\n \"relative flex flex-col gap-1.5 rounded-lg border px-3 py-2.5 transition-shadow duration-(--duration-base)\",\n live\n ? \"border-accent/50 bg-surface shadow-[0_8px_24px_-10px_rgb(var(--rgb-accent)/0.55)]\"\n : \"border-dashed border-border2 bg-bg hover:border-muted\",\n item.status === \"paused\" && \"opacity-70\",\n ring,\n )}\n >\n <Handles />\n {live && <span className={cn(\"absolute -inset-y-px -left-px w-[3px] rounded-l-lg\", drifting ? \"bg-amber\" : \"bg-accent\")} />}\n <div className=\"flex items-center justify-between font-mono text-[10px]\">\n <span className=\"text-muted\">{item.id}</span>\n {agent ? (\n <AgentMark attach={{ kind: \"epic\", id: item.id }} />\n ) : live ? (\n <span className=\"flex items-center gap-1.5 uppercase tracking-wider text-accent\"><StatusDot status=\"in-progress\" className=\"h-1.5 w-1.5\" />Live</span>\n ) : (\n <span className=\"uppercase tracking-wider text-muted\">{item.tasks.length ? `${item.tasks.length} tasks` : \"No tasks yet\"}</span>\n )}\n </div>\n <p className={cn(\"line-clamp-2 text-[13px] leading-snug\", live ? \"font-medium text-txt\" : \"text-txt/80\")} title={item.title}>\n {item.title}\n </p>\n {taskStatuses && taskStatuses.length > 0 && (\n <div className=\"flex items-center gap-2\">\n <SegmentedProgress statuses={taskStatuses} />\n <span className=\"shrink-0 font-mono text-[10px] text-muted\">\n {live && nextTaskId ? <>next <span className=\"text-txt\">{nextTaskId}</span></> : `${taskStatuses.filter((s) => s === \"done\").length}/${taskStatuses.length}`}\n </span>\n </div>\n )}\n <DueNote data={data} />\n <DriftMark drift={data.drift} />\n </div>\n )\n}\n\nexport const nodeTypes = { horizon: HorizonNode, feature: FeatureNode }\n","/**\n * src/lib/roadmap-health.ts\n * Pure (no fs): roadmap progress + drift, shared by the Roadmap page and the MCP handler.\n * A feature's expected status comes from its linked tasks; a horizon's from its features.\n */\n\nimport type { RoadmapItem, RoadmapStatus, Task } from './core'\n\n/** What health needs from a task: status for progress, due for at-risk. */\nexport type TaskInfo = Pick<Task, 'status' | 'due'>\n\nexport interface RoadmapProgress { done: number; total: number }\n\nexport interface RoadmapDrift {\n id: string\n kind: 'status-mismatch' | 'missing-task' | 'overdue' | 'at-risk'\n message: string\n suggestedStatus?: RoadmapStatus\n}\n\nexport interface RoadmapHealth {\n progress: Record<string, RoadmapProgress>\n drift: RoadmapDrift[]\n}\n\nexport type DueState = 'overdue' | 'soon' | 'ok' | 'done'\n\nconst SOON_DAYS = 7\n\n/** Local calendar date \"YYYY-MM-DD\" (due dates are calendar dates, not instants). */\nexport function localToday(now = new Date()): string {\n const p = (n: number) => String(n).padStart(2, '0')\n return `${now.getFullYear()}-${p(now.getMonth() + 1)}-${p(now.getDate())}`\n}\n\nfunction daysBetween(from: string, to: string): number {\n const utc = (d: string) => Date.UTC(+d.slice(0, 4), +d.slice(5, 7) - 1, +d.slice(8, 10))\n return Math.round((utc(to) - utc(from)) / 86_400_000)\n}\n\nexport function dueState(due: string | null, status: RoadmapStatus, today: string): DueState | null {\n if (!due) return null\n if (status === 'done') return 'done'\n if (due < today) return 'overdue'\n return daysBetween(today, due) <= SOON_DAYS ? 'soon' : 'ok'\n}\n\ntype Started = 'done' | 'in-progress' | 'other'\n\nfunction expectedStatus(states: Started[]): RoadmapStatus {\n if (states.every(s => s === 'done')) return 'done'\n if (states.some(s => s !== 'other')) return 'in-progress'\n return 'planned'\n}\n\nexport interface TaskDueSummary { overdue: number; next: string | null }\n\n/** Open tasks' deadlines for a map node: how many are overdue, and the nearest upcoming due. */\nexport function taskDueSummary(taskIds: string[], tasks: Record<string, TaskInfo>, today: string): TaskDueSummary | null {\n const dues = taskIds\n .map(id => tasks[id])\n .filter(t => t && t.due && t.status !== 'done' && t.status !== 'cancelled')\n .map(t => t.due as string)\n if (!dues.length) return null\n const upcoming = dues.filter(d => d >= today).sort()\n return { overdue: dues.length - upcoming.length, next: upcoming[0] ?? null }\n}\n\n/** Why an unfinished epic may miss its date: overdue or blocked tasks, or due soon with nothing started. */\nfunction atRiskReasons(item: RoadmapItem, linked: string[], tasks: Record<string, TaskInfo>, today: string): string[] {\n const reasons: string[] = []\n for (const id of linked) {\n const t = tasks[id]\n if (t.status !== 'done' && t.due && t.due < today) reasons.push(`${id} overdue since ${t.due}`)\n if (t.status === 'blocked') reasons.push(`${id} blocked`)\n }\n const started = linked.some(id => ['done', 'in-progress', 'review'].includes(tasks[id].status))\n if (item.due && dueState(item.due, item.status, today) === 'soon' && !started) {\n reasons.push(`due ${item.due}, nothing started`)\n }\n return reasons\n}\n\nexport function roadmapHealth(\n items: RoadmapItem[], tasks: Record<string, TaskInfo>, today: string,\n): RoadmapHealth {\n const progress: Record<string, RoadmapProgress> = {}\n const drift: RoadmapDrift[] = []\n\n for (const item of items) {\n if (item.due && dueState(item.due, item.status, today) === 'overdue') {\n drift.push({ id: item.id, kind: 'overdue', message: `${item.id} \"${item.title}\" is overdue since ${item.due}` })\n }\n }\n const horizonIds = new Set(items.filter(i => i.parent === null).map(i => i.id))\n\n for (const item of items) {\n if (item.parent === null) continue\n const missing = item.tasks.filter(t => !(t in tasks))\n if (missing.length) {\n drift.push({ id: item.id, kind: 'missing-task', message: `${item.id} links unknown task ${missing.join(', ')}` })\n }\n // cancelled tasks don't count toward progress or expected status\n const linked = item.tasks.filter(t => t in tasks && tasks[t].status !== 'cancelled')\n // a paused epic is stopped on purpose: not at risk\n const risks = item.status === 'done' || item.status === 'paused' ? [] : atRiskReasons(item, linked, tasks, today)\n if (risks.length) {\n drift.push({ id: item.id, kind: 'at-risk', message: `${item.id} \"${item.title}\" at risk: ${risks.join('; ')}` })\n }\n if (!linked.length) continue\n const states: Started[] = linked.map(t =>\n tasks[t].status === 'done' ? 'done' : tasks[t].status === 'in-progress' || tasks[t].status === 'review' ? 'in-progress' : 'other')\n progress[item.id] = { done: states.filter(s => s === 'done').length, total: linked.length }\n const expected = expectedStatus(states)\n // paused stays paused until everything is done\n if (expected !== item.status && !(item.status === 'paused' && expected !== 'done')) {\n const open = linked.filter(t => tasks[t].status !== 'done')\n drift.push({\n id: item.id,\n kind: 'status-mismatch',\n message: expected === 'done'\n ? `${item.id} \"${item.title}\": all tasks done but status is ${item.status}`\n : `${item.id} \"${item.title}\" is ${item.status} but tasks ${open.join(', ')} are not done`,\n suggestedStatus: expected,\n })\n }\n }\n\n for (const h of items) {\n if (!horizonIds.has(h.id)) continue\n const kids = items.filter(i => i.parent === h.id)\n if (!kids.length) continue\n const states: Started[] = kids.map(k => k.status === 'done' ? 'done' : k.status === 'in-progress' ? 'in-progress' : 'other')\n // weight by tasks; an epic not broken down yet counts as one unit\n progress[h.id] = kids.reduce((sum, k) => {\n const p = progress[k.id] ?? { done: k.status === 'done' ? 1 : 0, total: 1 }\n return { done: sum.done + p.done, total: sum.total + p.total }\n }, { done: 0, total: 0 })\n const expected = expectedStatus(states)\n if (expected !== h.status && !(h.status === 'paused' && expected !== 'done')) {\n drift.push({\n id: h.id,\n kind: 'status-mismatch',\n message: `${h.id} \"${h.title}\" is ${h.status} but its features say ${expected}`,\n suggestedStatus: expected,\n })\n }\n }\n\n return { progress, drift }\n}\n","import type { RoadmapItem, RoadmapLayout } from \"@/types\"\n\nexport const HORIZON_W = 260\nexport const FEATURE_W = 220\nconst BRANCH_DX = 340\nconst ROW_H = 110\nconst HORIZON_GAP = 90\nconst COL_DX = FEATURE_W + 40\nconst MAX_ROWS_PER_SIDE = 6 // beyond this, a side gets a second (outer, half-row staggered) column\n\n/** Items that sit on the spine: real horizons plus orphans whose parent is not a horizon. */\nexport function spineItems(items: RoadmapItem[]): RoadmapItem[] {\n const horizonIds = new Set(items.filter((i) => i.parent === null).map((i) => i.id))\n return items\n .filter((i) => i.parent === null || !horizonIds.has(i.parent))\n .sort((a, b) => a.order - b.order)\n}\n\nexport function childrenOf(items: RoadmapItem[], parentId: string): RoadmapItem[] {\n return items.filter((i) => i.parent === parentId).sort((a, b) => a.order - b.order)\n}\n\n/**\n * Resolve a position for every item: saved (layout.json) wins, otherwise auto-place.\n * Horizons stack on x=0 by order; children alternate right/left of their parent's RESOLVED position.\n */\nexport function resolvePositions(items: RoadmapItem[], layout: RoadmapLayout): RoadmapLayout {\n const out: RoadmapLayout = {}\n let cursor = 0\n for (const h of spineItems(items)) {\n const hp = layout[h.id] ?? { x: 0, y: cursor }\n out[h.id] = hp\n const kids = h.parent === null ? childrenOf(items, h.id) : []\n const cols = Math.ceil(kids.length / 2) > MAX_ROWS_PER_SIDE ? 2 : 1\n kids.forEach((c, i) => {\n const side = i % 2 === 0 ? 1 : -1\n const k = Math.floor(i / 2) // index within its side\n const col = k % cols\n const row = Math.floor(k / cols)\n out[c.id] = layout[c.id] ?? {\n x: hp.x + (HORIZON_W - FEATURE_W) / 2 + side * (BRANCH_DX + col * COL_DX),\n // outer column sits half a row lower so its edges pass between inner nodes\n y: hp.y + row * ROW_H + col * (ROW_H / 2),\n }\n })\n const rows = Math.ceil(Math.ceil(kids.length / 2) / cols)\n cursor += Math.max(1, rows) * ROW_H + HORIZON_GAP\n }\n return out\n}\n\nconst ARRANGE_ROW_GAP = 14 // between stacked epics in a column\nconst ARRANGE_BLOCK_GAP = 120 // between one horizon's block and the next\n\n/**\n * \"Arrange\" (tidy the whole map): ignores saved positions. Each horizon sits on the spine with its epics\n * in one column per side, stacked by their real heights, in order, each epic going to the shorter side.\n * The column is centred on its horizon so branches fan out evenly and never cross a node; each horizon's\n * block starts below the previous block's lowest node.\n */\nexport function arrangePositions(items: RoadmapItem[], heightOf: (id: string) => number): RoadmapLayout {\n const out: RoadmapLayout = {}\n let top = 0\n for (const h of spineItems(items)) {\n const hh = heightOf(h.id)\n const kids = h.parent === null ? childrenOf(items, h.id) : []\n const sides: { id: string; y: number }[][] = [[], []] // right, left\n const used = [0, 0]\n for (const c of kids) {\n const s = used[0] <= used[1] ? 0 : 1\n sides[s].push({ id: c.id, y: used[s] })\n used[s] += heightOf(c.id) + ARRANGE_ROW_GAP\n }\n const colH = used.map((u) => Math.max(0, u - ARRANGE_ROW_GAP))\n // centre each column on the horizon, then shift the whole block down so its top is at `top`\n const centre = hh / 2\n const colTop = colH.map((c) => centre - c / 2)\n const shift = top - Math.min(0, ...colTop)\n out[h.id] = { x: 0, y: shift }\n sides.forEach((col, s) => {\n const x = (HORIZON_W - FEATURE_W) / 2 + (s === 0 ? 1 : -1) * BRANCH_DX\n for (const { id, y } of col) out[id] = { x, y: shift + colTop[s] + y }\n })\n top = shift + Math.max(hh, ...colTop.map((t, s) => t + colH[s])) + ARRANGE_BLOCK_GAP\n }\n return out\n}\n","import type { RoadmapItem } from \"@/types\"\nimport { dueState, type DueState } from \"@/lib/roadmap-health\"\nimport { childrenOf, spineItems } from \"./layout\"\n\nexport const MONTH_W = 160\nexport const LANE_ROW_H = 44\nconst LABEL_W = 180 // horizontal room a marker's label needs before the next one fits on the same row\nconst MIN_MONTHS = 6\n\nconst MONTHS = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n\n// Dates are \"YYYY-MM-DD\" calendar dates — parsed by hand, never via new Date(string) (UTC shift).\nconst ymd = (d: string) => ({ y: +d.slice(0, 4), m: +d.slice(5, 7), day: +d.slice(8, 10) })\nconst daysIn = (y: number, m: number) => new Date(y, m, 0).getDate()\n\nexport function formatDay(d: string): string {\n const { m, day } = ymd(d)\n return `${day} ${MONTHS[m - 1]}`\n}\n\nexport interface TimelineMarker { item: RoadmapItem; x: number; row: number; state: DueState | null; horizon: boolean }\nexport interface TimelineLane { item: RoadmapItem; rows: number; markers: TimelineMarker[] }\nexport interface Timeline {\n months: { label: string; x: number }[]\n width: number\n todayX: number\n lanes: TimelineLane[]\n undated: RoadmapItem[]\n}\n\nexport function buildTimeline(items: RoadmapItem[], today: string): Timeline {\n const dues = items.map((i) => i.due).filter((d): d is string => !!d)\n const first = ymd([today, ...dues].sort()[0])\n const last = ymd([today, ...dues].sort().at(-1) ?? today)\n\n // pad one month each side, then stretch to a readable minimum\n const start = { y: first.y, m: first.m - 1 }\n const span = Math.max(MIN_MONTHS, (last.y - first.y) * 12 + (last.m - first.m) + 3)\n const months = Array.from({ length: span }, (_, i) => {\n const t = start.y * 12 + (start.m - 1) + i\n const y = Math.floor(t / 12)\n const m = (t % 12) + 1\n return { y, m, label: m === 1 || i === 0 ? `${MONTHS[m - 1]} ${y}` : MONTHS[m - 1], x: i * MONTH_W }\n })\n\n const xOf = (d: string) => {\n const { y, m, day } = ymd(d)\n const idx = (y - months[0].y) * 12 + (m - months[0].m)\n return idx * MONTH_W + ((day - 0.5) / daysIn(y, m)) * MONTH_W\n }\n\n const lanes = spineItems(items).map((h) => {\n const dated = [h, ...(h.parent === null ? childrenOf(items, h.id) : [])].filter((i) => i.due)\n const rowEnds: number[] = []\n const markers = dated\n .map((item) => ({ item, x: xOf(item.due as string), horizon: item.id === h.id }))\n .sort((a, b) => a.x - b.x)\n .map((mk) => {\n // greedy: first row whose last label ends before this marker\n let row = rowEnds.findIndex((end) => mk.x >= end)\n if (row === -1) row = rowEnds.push(0) - 1\n rowEnds[row] = mk.x + LABEL_W\n return { ...mk, row, state: dueState(mk.item.due, mk.item.status, today) }\n })\n return { item: h, rows: Math.max(1, rowEnds.length), markers }\n })\n\n return {\n months: months.map(({ label, x }) => ({ label, x })),\n width: span * MONTH_W,\n todayX: xOf(today),\n lanes,\n undated: items.filter((i) => !i.due && i.status !== \"done\"), // shipped work needs no date\n }\n}\n"],"names":["AGENT_LABEL","running","review","AgentMark","attach","className","agent","show","label","status","type","onClick","e","stopPropagation","chatId","title","AgentDot","SIDES","Top","Right","Bottom","Left","Handles","map","p","id","position","isConnectable","STATUS_LABEL","paused","done","planned","StatusDot","StatusPill","TASK_STATUS_BG","blocked","todo","cancelled","SegmentedProgress","statuses","length","filter","s","i","ProgressRing","value","total","r","c","Math","PI","pct","viewBox","cx","cy","fill","strokeWidth","stroke","strokeLinecap","strokeDasharray","strokeDashoffset","round","Progress","progress","style","width","DueChip","due","state","DueNote","data","taskDue","overdue","item","dueState","next","taskDueSoon","DriftMark","drift","join","HorizonNode","selected","epics","chapter","String","padStart","FeatureNode","taskStatuses","nextTaskId","kind","drifting","ring","live","tasks","nodeTypes","horizon","feature","SOON_DAYS","localToday","now","Date","n","getFullYear","getMonth","getDate","daysBetween","from","to","utc","d","UTC","slice","today","expectedStatus","states","every","some","taskDueSummary","taskIds","dues","t","upcoming","sort","atRiskReasons","linked","reasons","push","started","includes","roadmapHealth","items","message","horizonIds","Set","parent","missing","risks","expected","open","suggestedStatus","h","has","kids","k","reduce","sum"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- module.exports=[815122,a=>{"use strict";var b=a.i(662145),c=a.i(795667),d=a.i(108280),e=a.i(368114),f=a.i(685698),g=a.i(598984);let h={running:"Agent working","needs-answer":"Agent needs you",review:"Plan to review"};a.s(["AgentDot",0,function({attach:a}){let c=(0,f.useItemAgent)(a);return c?(0,b.jsx)(g.StatusMarker,{status:c.status,label:h[c.status]}):null},"AgentMark",0,function({attach:a,className:g}){let i=(0,f.useItemAgent)(a),{show:j}=(0,f.useChats)();if(!i)return null;let k=h[i.status];return(0,b.jsxs)("button",{type:"button",onClick:a=>{a.stopPropagation(),j(i.chatId)},title:`${k} \xb7 open chat`,"aria-label":`${k}, open chat`,className:(0,e.cn)("nodrag inline-flex shrink-0 items-center gap-1 rounded-full border px-1.5 py-px font-mono text-[10px] leading-4 animate-fade-in transition-colors duration-(--duration-fast)","running"===i.status&&"border-accent/50 text-accent hover:bg-accent/10","needs-answer"===i.status&&"border-amber/50 text-amber hover:bg-amber/10","review"===i.status&&"border-accent/50 bg-accent/10 text-accent hover:bg-accent/20",g),children:["running"===i.status?(0,b.jsx)(d.Loader2,{className:"size-3 animate-spin","aria-hidden":!0}):(0,b.jsx)(c.Bot,{className:"size-3","aria-hidden":!0}),k]})}])},618940,a=>{"use strict";var b=a.i(662145),c=a.i(365465),d=a.i(152716),e=a.i(340933),f=a.i(425404),g=a.i(368114),h=a.i(581040),i=a.i(453161),j=a.i(815122),k=a.i(685698);let l=[d.Position.Top,d.Position.Right,d.Position.Bottom,d.Position.Left];function m(){return(0,b.jsxs)(b.Fragment,{children:[l.map(a=>(0,b.jsx)(c.Handle,{id:a,type:"source",position:a,isConnectable:!1,className:"opacity-0"},a)),l.map(a=>(0,b.jsx)(c.Handle,{id:`${a}-t`,type:"target",position:a,isConnectable:!1,className:"opacity-0"},`${a}-t`))]})}let n={"in-progress":"Active",paused:"Paused",done:"Done",planned:"Planned"};function o({status:a,className:c}){return(0,b.jsxs)("span",{title:n[a],"aria-label":n[a],className:(0,g.cn)("relative inline-flex h-2 w-2 shrink-0",c),children:["in-progress"===a&&(0,b.jsx)("span",{className:"absolute inset-0 animate-ping rounded-full bg-accent/60"}),(0,b.jsx)("span",{className:(0,g.cn)("relative h-full w-full rounded-full","done"===a&&"bg-teal","in-progress"===a&&"bg-accent","planned"===a&&"border border-muted","paused"===a&&"border-2 border-y-0 border-muted")})]})}let p={done:"bg-teal","in-progress":"bg-amber",review:"bg-accent",blocked:"bg-danger",paused:"bg-muted/60",todo:"bg-border2",cancelled:"bg-border"};function q({statuses:a,className:c}){if(!a?.length)return null;let d=a.filter(a=>"done"===a).length;return(0,b.jsx)("div",{className:(0,g.cn)("flex h-1.5 min-w-0 flex-1 gap-0.5",c),title:`${d}/${a.length} tasks done`,children:a.map((a,c)=>(0,b.jsx)("span",{className:(0,g.cn)("h-full flex-1 rounded-[1px]",p[a])},c))})}function r({value:a,total:c,className:d}){let e=2*Math.PI*14,f=c>0?a/c:0;return(0,b.jsxs)("span",{className:(0,g.cn)("relative inline-flex h-9 w-9 shrink-0 items-center justify-center",d),title:`${a}/${c} tasks done`,children:[(0,b.jsxs)("svg",{viewBox:"0 0 36 36",className:"absolute inset-0 -rotate-90",children:[(0,b.jsx)("circle",{cx:"18",cy:"18",r:14,fill:"none",strokeWidth:"3",className:"stroke-border"}),(0,b.jsx)("circle",{cx:"18",cy:"18",r:14,fill:"none",strokeWidth:"3",stroke:"currentColor",strokeLinecap:"round",strokeDasharray:e,strokeDashoffset:e*(1-f)})]}),(0,b.jsx)("span",{className:"font-mono text-[9px] text-txt",children:Math.round(100*f)})]})}function s({due:a,state:c}){return a?(0,b.jsxs)("span",{className:(0,g.cn)("font-mono text-[10px]","overdue"===c?"text-danger":"soon"===c?"text-amber":"text-muted"),children:["Due ",(0,h.formatDay)(a)]}):null}function t({data:a}){let c=a.taskDue;return c&&c.overdue>0?(0,b.jsxs)("span",{className:"font-mono text-[10px] text-danger",children:[c.overdue," ",1===c.overdue?"task":"tasks"," overdue"]}):a.item.due?(0,b.jsx)(s,{due:a.item.due,state:a.dueState}):c?.next?(0,b.jsxs)("span",{className:(0,g.cn)("font-mono text-[10px]",a.taskDueSoon?"text-amber":"text-muted"),children:["Next due ",(0,h.formatDay)(c.next)]}):null}function u({drift:a}){return a?.length?(0,b.jsx)("span",{title:a.join("\n"),className:"absolute -left-2 -top-2 rounded-full bg-bg p-0.5 text-amber",children:(0,b.jsx)(e.AlertTriangle,{className:"h-3.5 w-3.5"})}):null}a.s(["DueChip",0,s,"STATUS_LABEL",0,n,"SegmentedProgress",0,q,"StatusDot",0,o,"StatusPill",0,function({status:a}){return(0,b.jsxs)("span",{className:(0,g.cn)("inline-flex items-center gap-1.5 rounded-full border px-2 py-0.5 font-mono text-[10px] uppercase tracking-wider","done"===a&&"border-teal/40 text-teal","in-progress"===a&&"border-accent/50 text-accent","planned"===a&&"border-dashed border-border2 text-muted","paused"===a&&"border-border2 text-muted"),children:[(0,b.jsx)(o,{status:a,className:"h-1.5 w-1.5"}),n[a]]})},"TASK_STATUS_BG",0,p,"nodeTypes",0,{horizon:function({data:a,selected:c}){let{item:d,progress:e,epics:f,chapter:h}=a,j=d.status;return(0,b.jsxs)("div",{style:{width:i.HORIZON_W},className:(0,g.cn)("relative flex items-center gap-3 rounded-xl border bg-surface px-3.5 py-3 transition-shadow duration-(--duration-base)","in-progress"===j&&"border-accent/60 shadow-[0_0_0_1px_rgb(var(--rgb-accent)/0.25),0_10px_30px_-12px_rgb(var(--rgb-accent)/0.6)]","done"===j&&"border-teal/40","planned"===j&&"border-dashed border-border2","paused"===j&&"border-border2 opacity-75",c&&"ring-2 ring-accent/60 ring-offset-2 ring-offset-bg"),children:[(0,b.jsx)(m,{}),(0,b.jsx)("span",{className:(0,g.cn)("font-mono text-2xl font-semibold leading-none tabular-nums","in-progress"===j?"text-accent":"done"===j?"text-teal":"text-muted"),children:h?String(h).padStart(2,"0"):"··"}),(0,b.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,b.jsx)("p",{className:"text-xs font-semibold uppercase leading-snug tracking-wider text-txt",children:d.title}),(0,b.jsxs)("p",{className:"mt-1 flex flex-wrap items-center gap-x-2 font-mono text-[10px] text-muted",children:[f&&f.total>0&&(0,b.jsxs)("span",{children:[f.done,"/",f.total," epics"]}),(0,b.jsx)(s,{due:d.due,state:a.dueState})]})]}),e&&(0,b.jsx)(r,{value:e.done,total:e.total,className:"done"===j?"text-teal":"text-accent"}),(0,b.jsx)(u,{drift:a.drift})]})},feature:function({data:a,selected:c}){let{item:d,taskStatuses:e,nextTaskId:h}=a,l=(0,k.useItemAgent)({kind:"epic",id:d.id}),n=!!a.drift?.length,p=c&&"ring-2 ring-accent/60 ring-offset-2 ring-offset-bg";if("done"===d.status)return(0,b.jsxs)("div",{style:{width:i.FEATURE_W},className:(0,g.cn)("group relative flex items-center gap-2 rounded-lg border border-border bg-surface/60 px-3 py-2 hover:border-teal/40",p),children:[(0,b.jsx)(m,{}),(0,b.jsx)(f.Check,{className:"h-3.5 w-3.5 shrink-0 text-teal",strokeWidth:3}),(0,b.jsx)("p",{className:"min-w-0 flex-1 truncate text-[13px] text-muted group-hover:text-txt",title:d.title,children:d.title}),l?(0,b.jsx)(j.AgentMark,{attach:{kind:"epic",id:d.id}}):a.progress&&(0,b.jsxs)("span",{className:"font-mono text-[10px] text-muted",children:[a.progress.done,"/",a.progress.total]}),(0,b.jsx)(u,{drift:a.drift})]});let r="in-progress"===d.status;return(0,b.jsxs)("div",{style:{width:i.FEATURE_W},className:(0,g.cn)("relative flex flex-col gap-1.5 rounded-lg border px-3 py-2.5 transition-shadow duration-(--duration-base)",r?"border-accent/50 bg-surface shadow-[0_8px_24px_-10px_rgb(var(--rgb-accent)/0.55)]":"border-dashed border-border2 bg-bg hover:border-muted","paused"===d.status&&"opacity-70",p),children:[(0,b.jsx)(m,{}),r&&(0,b.jsx)("span",{className:(0,g.cn)("absolute -inset-y-px -left-px w-[3px] rounded-l-lg",n?"bg-amber":"bg-accent")}),(0,b.jsxs)("div",{className:"flex items-center justify-between font-mono text-[10px]",children:[(0,b.jsx)("span",{className:"text-muted",children:d.id}),l?(0,b.jsx)(j.AgentMark,{attach:{kind:"epic",id:d.id}}):r?(0,b.jsxs)("span",{className:"flex items-center gap-1.5 uppercase tracking-wider text-accent",children:[(0,b.jsx)(o,{status:"in-progress",className:"h-1.5 w-1.5"}),"Live"]}):(0,b.jsx)("span",{className:"uppercase tracking-wider text-muted",children:d.tasks.length?`${d.tasks.length} tasks`:"No tasks yet"})]}),(0,b.jsx)("p",{className:(0,g.cn)("line-clamp-2 text-[13px] leading-snug",r?"font-medium text-txt":"text-txt/80"),title:d.title,children:d.title}),e&&e.length>0&&(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)(q,{statuses:e}),(0,b.jsx)("span",{className:"shrink-0 font-mono text-[10px] text-muted",children:r&&h?(0,b.jsxs)(b.Fragment,{children:["next ",(0,b.jsx)("span",{className:"text-txt",children:h})]}):`${e.filter(a=>"done"===a).length}/${e.length}`})]}),(0,b.jsx)(t,{data:a}),(0,b.jsx)(u,{drift:a.drift})]})}}])},581040,452696,453161,a=>{"use strict";function b(a,b,c){let d;return a?"done"===b?"done":a<c?"overdue":7>=Math.round(((d=a=>Date.UTC(+a.slice(0,4),a.slice(5,7)-1,+a.slice(8,10)))(a)-d(c))/864e5)?"soon":"ok":null}function c(a){return a.every(a=>"done"===a)?"done":a.some(a=>"other"!==a)?"in-progress":"planned"}a.s(["dueState",0,b,"localToday",0,function(a=new Date){let b=a=>String(a).padStart(2,"0");return`${a.getFullYear()}-${b(a.getMonth()+1)}-${b(a.getDate())}`},"roadmapHealth",0,function(a,d,e){let f={},g=[];for(let c of a)c.due&&"overdue"===b(c.due,c.status,e)&&g.push({id:c.id,kind:"overdue",message:`${c.id} "${c.title}" is overdue since ${c.due}`});let h=new Set(a.filter(a=>null===a.parent).map(a=>a.id));for(let h of a){if(null===h.parent)continue;let a=h.tasks.filter(a=>!(a in d));a.length&&g.push({id:h.id,kind:"missing-task",message:`${h.id} links unknown task ${a.join(", ")}`});let i=h.tasks.filter(a=>a in d&&"cancelled"!==d[a].status),j="done"===h.status||"paused"===h.status?[]:function(a,c,d,e){let f=[];for(let a of c){let b=d[a];"done"!==b.status&&b.due&&b.due<e&&f.push(`${a} overdue since ${b.due}`),"blocked"===b.status&&f.push(`${a} blocked`)}let g=c.some(a=>["done","in-progress","review"].includes(d[a].status));return a.due&&"soon"===b(a.due,a.status,e)&&!g&&f.push(`due ${a.due}, nothing started`),f}(h,i,d,e);if(j.length&&g.push({id:h.id,kind:"at-risk",message:`${h.id} "${h.title}" at risk: ${j.join("; ")}`}),!i.length)continue;let k=i.map(a=>"done"===d[a].status?"done":"in-progress"===d[a].status||"review"===d[a].status?"in-progress":"other");f[h.id]={done:k.filter(a=>"done"===a).length,total:i.length};let l=c(k);if(l!==h.status&&("paused"!==h.status||"done"===l)){let a=i.filter(a=>"done"!==d[a].status);g.push({id:h.id,kind:"status-mismatch",message:"done"===l?`${h.id} "${h.title}": all tasks done but status is ${h.status}`:`${h.id} "${h.title}" is ${h.status} but tasks ${a.join(", ")} are not done`,suggestedStatus:l})}}for(let b of a){if(!h.has(b.id))continue;let d=a.filter(a=>a.parent===b.id);if(!d.length)continue;let e=d.map(a=>"done"===a.status?"done":"in-progress"===a.status?"in-progress":"other");f[b.id]=d.reduce((a,b)=>{let c=f[b.id]??{done:+("done"===b.status),total:1};return{done:a.done+c.done,total:a.total+c.total}},{done:0,total:0});let i=c(e);i!==b.status&&("paused"!==b.status||"done"===i)&&g.push({id:b.id,kind:"status-mismatch",message:`${b.id} "${b.title}" is ${b.status} but its features say ${i}`,suggestedStatus:i})}return{progress:f,drift:g}},"taskDueSummary",0,function(a,b,c){let d=a.map(a=>b[a]).filter(a=>a&&a.due&&"done"!==a.status&&"cancelled"!==a.status).map(a=>a.due);if(!d.length)return null;let e=d.filter(a=>a>=c).sort();return{overdue:d.length-e.length,next:e[0]??null}}],452696);function d(a){let b=new Set(a.filter(a=>null===a.parent).map(a=>a.id));return a.filter(a=>null===a.parent||!b.has(a.parent)).sort((a,b)=>a.order-b.order)}function e(a,b){return a.filter(a=>a.parent===b).sort((a,b)=>a.order-b.order)}a.s(["FEATURE_W",0,220,"HORIZON_W",0,260,"childrenOf",0,e,"resolvePositions",0,function(a,b){let c={},f=0;for(let g of d(a)){let d=b[g.id]??{x:0,y:f};c[g.id]=d;let h=null===g.parent?e(a,g.id):[],i=Math.ceil(h.length/2)>6?2:1;h.forEach((a,e)=>{let f=e%2==0?1:-1,g=Math.floor(e/2),h=g%i,j=Math.floor(g/i);c[a.id]=b[a.id]??{x:d.x+20+f*(340+260*h),y:d.y+110*j+55*h}}),f+=110*Math.max(1,Math.ceil(Math.ceil(h.length/2)/i))+90}return c},"spineItems",0,d],453161);let f=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],g=a=>({y:+a.slice(0,4),m:+a.slice(5,7),day:+a.slice(8,10)});a.s(["LANE_ROW_H",0,44,"buildTimeline",0,function(a,c){let h=a.map(a=>a.due).filter(a=>!!a),i=g([c,...h].sort()[0]),j=g([c,...h].sort().at(-1)??c),k={y:i.y,m:i.m-1},l=Math.max(6,(j.y-i.y)*12+(j.m-i.m)+3),m=Array.from({length:l},(a,b)=>{let c=12*k.y+(k.m-1)+b,d=Math.floor(c/12),e=c%12+1;return{y:d,m:e,label:1===e||0===b?`${f[e-1]} ${d}`:f[e-1],x:160*b}}),n=a=>{let{y:b,m:c,day:d}=g(a);return((b-m[0].y)*12+(c-m[0].m))*160+(d-.5)/new Date(b,c,0).getDate()*160},o=d(a).map(d=>{let f=[d,...null===d.parent?e(a,d.id):[]].filter(a=>a.due),g=[],h=f.map(a=>({item:a,x:n(a.due),horizon:a.id===d.id})).sort((a,b)=>a.x-b.x).map(a=>{let d=g.findIndex(b=>a.x>=b);return -1===d&&(d=g.push(0)-1),g[d]=a.x+180,{...a,row:d,state:b(a.item.due,a.item.status,c)}});return{item:d,rows:Math.max(1,g.length),markers:h}});return{months:m.map(({label:a,x:b})=>({label:a,x:b})),width:160*l,todayX:n(c),lanes:o,undated:a.filter(a=>!a.due&&"done"!==a.status)}},"formatDay",0,function(a){let{m:b,day:c}=g(a);return`${c} ${f[b-1]}`}],581040)}];
1
+ module.exports=[815122,a=>{"use strict";var b=a.i(662145),c=a.i(795667),d=a.i(108280),e=a.i(368114),f=a.i(685698),g=a.i(598984);let h={running:"Agent working","needs-answer":"Agent needs you",review:"Plan to review"};a.s(["AgentDot",0,function({attach:a}){let c=(0,f.useItemAgent)(a);return c?(0,b.jsx)(g.StatusMarker,{status:c.status,label:h[c.status]}):null},"AgentMark",0,function({attach:a,className:g}){let i=(0,f.useItemAgent)(a),{show:j}=(0,f.useChats)();if(!i)return null;let k=h[i.status];return(0,b.jsxs)("button",{type:"button",onClick:a=>{a.stopPropagation(),j(i.chatId)},title:`${k} \xb7 open chat`,"aria-label":`${k}, open chat`,className:(0,e.cn)("nodrag inline-flex shrink-0 items-center gap-1 rounded-full border px-1.5 py-px font-mono text-[10px] leading-4 animate-fade-in transition-colors duration-(--duration-fast)","running"===i.status&&"border-accent/50 text-accent hover:bg-accent/10","needs-answer"===i.status&&"border-amber/50 text-amber hover:bg-amber/10","review"===i.status&&"border-accent/50 bg-accent/10 text-accent hover:bg-accent/20",g),children:["running"===i.status?(0,b.jsx)(d.Loader2,{className:"size-3 animate-spin","aria-hidden":!0}):(0,b.jsx)(c.Bot,{className:"size-3","aria-hidden":!0}),k]})}])},618940,a=>{"use strict";var b=a.i(662145),c=a.i(365465),d=a.i(152716),e=a.i(340933),f=a.i(425404),g=a.i(368114),h=a.i(581040),i=a.i(453161),j=a.i(815122),k=a.i(685698);let l=[d.Position.Top,d.Position.Right,d.Position.Bottom,d.Position.Left];function m(){return(0,b.jsxs)(b.Fragment,{children:[l.map(a=>(0,b.jsx)(c.Handle,{id:a,type:"source",position:a,isConnectable:!1,className:"opacity-0"},a)),l.map(a=>(0,b.jsx)(c.Handle,{id:`${a}-t`,type:"target",position:a,isConnectable:!1,className:"opacity-0"},`${a}-t`))]})}let n={"in-progress":"Active",paused:"Paused",done:"Done",planned:"Planned"};function o({status:a,className:c}){return(0,b.jsxs)("span",{title:n[a],"aria-label":n[a],className:(0,g.cn)("relative inline-flex h-2 w-2 shrink-0",c),children:["in-progress"===a&&(0,b.jsx)("span",{className:"absolute inset-0 animate-ping rounded-full bg-accent/60"}),(0,b.jsx)("span",{className:(0,g.cn)("relative h-full w-full rounded-full","done"===a&&"bg-teal","in-progress"===a&&"bg-accent","planned"===a&&"border border-muted","paused"===a&&"bg-muted")})]})}let p={done:"bg-teal","in-progress":"bg-amber",review:"bg-accent",blocked:"bg-danger",paused:"bg-muted/60",todo:"bg-border2",cancelled:"bg-border"};function q({statuses:a,className:c}){if(!a?.length)return null;let d=a.filter(a=>"done"===a).length;return(0,b.jsx)("div",{className:(0,g.cn)("flex h-1.5 min-w-0 flex-1 gap-0.5",c),title:`${d}/${a.length} tasks done`,children:a.map((a,c)=>(0,b.jsx)("span",{className:(0,g.cn)("h-full flex-1 rounded-[1px]",p[a])},c))})}function r({value:a,total:c,className:d}){let e=2*Math.PI*14,f=c>0?a/c:0;return(0,b.jsxs)("span",{className:(0,g.cn)("relative inline-flex h-9 w-9 shrink-0 items-center justify-center",d),title:`${a}/${c} tasks done`,children:[(0,b.jsxs)("svg",{viewBox:"0 0 36 36",className:"absolute inset-0 -rotate-90",children:[(0,b.jsx)("circle",{cx:"18",cy:"18",r:14,fill:"none",strokeWidth:"3",className:"stroke-border"}),(0,b.jsx)("circle",{cx:"18",cy:"18",r:14,fill:"none",strokeWidth:"3",stroke:"currentColor",strokeLinecap:"round",strokeDasharray:e,strokeDashoffset:e*(1-f)})]}),(0,b.jsx)("span",{className:"font-mono text-[9px] text-txt",children:Math.round(100*f)})]})}function s({due:a,state:c}){return a?(0,b.jsxs)("span",{className:(0,g.cn)("font-mono text-[10px]","overdue"===c?"text-danger":"soon"===c?"text-amber":"text-muted"),children:["Due ",(0,h.formatDay)(a)]}):null}function t({data:a}){let c=a.taskDue;return c&&c.overdue>0?(0,b.jsxs)("span",{className:"font-mono text-[10px] text-danger",children:[c.overdue," ",1===c.overdue?"task":"tasks"," overdue"]}):a.item.due?(0,b.jsx)(s,{due:a.item.due,state:a.dueState}):c?.next?(0,b.jsxs)("span",{className:(0,g.cn)("font-mono text-[10px]",a.taskDueSoon?"text-amber":"text-muted"),children:["Next due ",(0,h.formatDay)(c.next)]}):null}function u({drift:a}){return a?.length?(0,b.jsx)("span",{title:a.join("\n"),className:"absolute -left-2 -top-2 rounded-full bg-bg p-0.5 text-amber",children:(0,b.jsx)(e.AlertTriangle,{className:"h-3.5 w-3.5"})}):null}a.s(["DueChip",0,s,"STATUS_LABEL",0,n,"SegmentedProgress",0,q,"StatusDot",0,o,"StatusPill",0,function({status:a}){return(0,b.jsxs)("span",{className:(0,g.cn)("inline-flex items-center gap-1.5 rounded-full border px-2 py-0.5 font-mono text-[10px] uppercase tracking-wider","done"===a&&"border-teal/40 text-teal","in-progress"===a&&"border-accent/50 text-accent","planned"===a&&"border-dashed border-border2 text-muted","paused"===a&&"border-border2 text-muted"),children:[(0,b.jsx)(o,{status:a,className:"h-1.5 w-1.5"}),n[a]]})},"TASK_STATUS_BG",0,p,"nodeTypes",0,{horizon:function({data:a,selected:c}){let{item:d,progress:e,epics:f,chapter:h}=a,j=d.status;return(0,b.jsxs)("div",{style:{width:i.HORIZON_W},className:(0,g.cn)("relative flex items-center gap-3 rounded-xl border bg-surface px-3.5 py-3 transition-shadow duration-(--duration-base)","in-progress"===j&&"border-accent/60 shadow-[0_0_0_1px_rgb(var(--rgb-accent)/0.25),0_10px_30px_-12px_rgb(var(--rgb-accent)/0.6)]","done"===j&&"border-teal/40","planned"===j&&"border-dashed border-border2","paused"===j&&"border-border2 opacity-75",c&&"ring-2 ring-accent/60 ring-offset-2 ring-offset-bg"),children:[(0,b.jsx)(m,{}),(0,b.jsx)("span",{className:(0,g.cn)("font-mono text-2xl font-semibold leading-none tabular-nums","in-progress"===j?"text-accent":"done"===j?"text-teal":"text-muted"),children:h?String(h).padStart(2,"0"):"··"}),(0,b.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,b.jsx)("p",{className:"text-xs font-semibold uppercase leading-snug tracking-wider text-txt",children:d.title}),(0,b.jsxs)("p",{className:"mt-1 flex flex-wrap items-center gap-x-2 font-mono text-[10px] text-muted",children:[f&&f.total>0&&(0,b.jsxs)("span",{children:[f.done,"/",f.total," epics"]}),(0,b.jsx)(s,{due:d.due,state:a.dueState})]})]}),e&&(0,b.jsx)(r,{value:e.done,total:e.total,className:"done"===j?"text-teal":"text-accent"}),(0,b.jsx)(u,{drift:a.drift})]})},feature:function({data:a,selected:c}){let{item:d,taskStatuses:e,nextTaskId:h}=a,l=(0,k.useItemAgent)({kind:"epic",id:d.id}),n=!!a.drift?.length,p=c&&"ring-2 ring-accent/60 ring-offset-2 ring-offset-bg";if("done"===d.status)return(0,b.jsxs)("div",{style:{width:i.FEATURE_W},className:(0,g.cn)("group relative flex items-center gap-2 rounded-lg border border-border bg-surface/60 px-3 py-2 hover:border-teal/40",p),children:[(0,b.jsx)(m,{}),(0,b.jsx)(f.Check,{className:"h-3.5 w-3.5 shrink-0 text-teal",strokeWidth:3}),(0,b.jsx)("p",{className:"min-w-0 flex-1 truncate text-[13px] text-muted group-hover:text-txt",title:d.title,children:d.title}),l?(0,b.jsx)(j.AgentMark,{attach:{kind:"epic",id:d.id}}):a.progress&&(0,b.jsxs)("span",{className:"font-mono text-[10px] text-muted",children:[a.progress.done,"/",a.progress.total]}),(0,b.jsx)(u,{drift:a.drift})]});let r="in-progress"===d.status;return(0,b.jsxs)("div",{style:{width:i.FEATURE_W},className:(0,g.cn)("relative flex flex-col gap-1.5 rounded-lg border px-3 py-2.5 transition-shadow duration-(--duration-base)",r?"border-accent/50 bg-surface shadow-[0_8px_24px_-10px_rgb(var(--rgb-accent)/0.55)]":"border-dashed border-border2 bg-bg hover:border-muted","paused"===d.status&&"opacity-70",p),children:[(0,b.jsx)(m,{}),r&&(0,b.jsx)("span",{className:(0,g.cn)("absolute -inset-y-px -left-px w-[3px] rounded-l-lg",n?"bg-amber":"bg-accent")}),(0,b.jsxs)("div",{className:"flex items-center justify-between font-mono text-[10px]",children:[(0,b.jsx)("span",{className:"text-muted",children:d.id}),l?(0,b.jsx)(j.AgentMark,{attach:{kind:"epic",id:d.id}}):r?(0,b.jsxs)("span",{className:"flex items-center gap-1.5 uppercase tracking-wider text-accent",children:[(0,b.jsx)(o,{status:"in-progress",className:"h-1.5 w-1.5"}),"Live"]}):(0,b.jsx)("span",{className:"uppercase tracking-wider text-muted",children:d.tasks.length?`${d.tasks.length} tasks`:"No tasks yet"})]}),(0,b.jsx)("p",{className:(0,g.cn)("line-clamp-2 text-[13px] leading-snug",r?"font-medium text-txt":"text-txt/80"),title:d.title,children:d.title}),e&&e.length>0&&(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)(q,{statuses:e}),(0,b.jsx)("span",{className:"shrink-0 font-mono text-[10px] text-muted",children:r&&h?(0,b.jsxs)(b.Fragment,{children:["next ",(0,b.jsx)("span",{className:"text-txt",children:h})]}):`${e.filter(a=>"done"===a).length}/${e.length}`})]}),(0,b.jsx)(t,{data:a}),(0,b.jsx)(u,{drift:a.drift})]})}}])},581040,452696,453161,a=>{"use strict";function b(a,b,c){let d;return a?"done"===b?"done":a<c?"overdue":7>=Math.round(((d=a=>Date.UTC(+a.slice(0,4),a.slice(5,7)-1,+a.slice(8,10)))(a)-d(c))/864e5)?"soon":"ok":null}function c(a){return a.every(a=>"done"===a)?"done":a.some(a=>"other"!==a)?"in-progress":"planned"}a.s(["dueState",0,b,"localToday",0,function(a=new Date){let b=a=>String(a).padStart(2,"0");return`${a.getFullYear()}-${b(a.getMonth()+1)}-${b(a.getDate())}`},"roadmapHealth",0,function(a,d,e){let f={},g=[];for(let c of a)c.due&&"overdue"===b(c.due,c.status,e)&&g.push({id:c.id,kind:"overdue",message:`${c.id} "${c.title}" is overdue since ${c.due}`});let h=new Set(a.filter(a=>null===a.parent).map(a=>a.id));for(let h of a){if(null===h.parent)continue;let a=h.tasks.filter(a=>!(a in d));a.length&&g.push({id:h.id,kind:"missing-task",message:`${h.id} links unknown task ${a.join(", ")}`});let i=h.tasks.filter(a=>a in d&&"cancelled"!==d[a].status),j="done"===h.status||"paused"===h.status?[]:function(a,c,d,e){let f=[];for(let a of c){let b=d[a];"done"!==b.status&&b.due&&b.due<e&&f.push(`${a} overdue since ${b.due}`),"blocked"===b.status&&f.push(`${a} blocked`)}let g=c.some(a=>["done","in-progress","review"].includes(d[a].status));return a.due&&"soon"===b(a.due,a.status,e)&&!g&&f.push(`due ${a.due}, nothing started`),f}(h,i,d,e);if(j.length&&g.push({id:h.id,kind:"at-risk",message:`${h.id} "${h.title}" at risk: ${j.join("; ")}`}),!i.length)continue;let k=i.map(a=>"done"===d[a].status?"done":"in-progress"===d[a].status||"review"===d[a].status?"in-progress":"other");f[h.id]={done:k.filter(a=>"done"===a).length,total:i.length};let l=c(k);if(l!==h.status&&("paused"!==h.status||"done"===l)){let a=i.filter(a=>"done"!==d[a].status);g.push({id:h.id,kind:"status-mismatch",message:"done"===l?`${h.id} "${h.title}": all tasks done but status is ${h.status}`:`${h.id} "${h.title}" is ${h.status} but tasks ${a.join(", ")} are not done`,suggestedStatus:l})}}for(let b of a){if(!h.has(b.id))continue;let d=a.filter(a=>a.parent===b.id);if(!d.length)continue;let e=d.map(a=>"done"===a.status?"done":"in-progress"===a.status?"in-progress":"other");f[b.id]=d.reduce((a,b)=>{let c=f[b.id]??{done:+("done"===b.status),total:1};return{done:a.done+c.done,total:a.total+c.total}},{done:0,total:0});let i=c(e);i!==b.status&&("paused"!==b.status||"done"===i)&&g.push({id:b.id,kind:"status-mismatch",message:`${b.id} "${b.title}" is ${b.status} but its features say ${i}`,suggestedStatus:i})}return{progress:f,drift:g}},"taskDueSummary",0,function(a,b,c){let d=a.map(a=>b[a]).filter(a=>a&&a.due&&"done"!==a.status&&"cancelled"!==a.status).map(a=>a.due);if(!d.length)return null;let e=d.filter(a=>a>=c).sort();return{overdue:d.length-e.length,next:e[0]??null}}],452696);function d(a){let b=new Set(a.filter(a=>null===a.parent).map(a=>a.id));return a.filter(a=>null===a.parent||!b.has(a.parent)).sort((a,b)=>a.order-b.order)}function e(a,b){return a.filter(a=>a.parent===b).sort((a,b)=>a.order-b.order)}a.s(["FEATURE_W",0,220,"HORIZON_W",0,260,"arrangePositions",0,function(a,b){let c={},f=0;for(let g of d(a)){let d=b(g.id),h=null===g.parent?e(a,g.id):[],i=[[],[]],j=[0,0];for(let a of h){let c=j[0]<=j[1]?0:1;i[c].push({id:a.id,y:j[c]}),j[c]+=b(a.id)+14}let k=j.map(a=>Math.max(0,a-14)),l=d/2,m=k.map(a=>l-a/2),n=f-Math.min(0,...m);c[g.id]={x:0,y:n},i.forEach((a,b)=>{let d=20+(0===b?1:-1)*340;for(let{id:e,y:f}of a)c[e]={x:d,y:n+m[b]+f}}),f=n+Math.max(d,...m.map((a,b)=>a+k[b]))+120}return c},"childrenOf",0,e,"resolvePositions",0,function(a,b){let c={},f=0;for(let g of d(a)){let d=b[g.id]??{x:0,y:f};c[g.id]=d;let h=null===g.parent?e(a,g.id):[],i=Math.ceil(h.length/2)>6?2:1;h.forEach((a,e)=>{let f=e%2==0?1:-1,g=Math.floor(e/2),h=g%i,j=Math.floor(g/i);c[a.id]=b[a.id]??{x:d.x+20+f*(340+260*h),y:d.y+110*j+55*h}}),f+=110*Math.max(1,Math.ceil(Math.ceil(h.length/2)/i))+90}return c},"spineItems",0,d],453161);let f=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],g=a=>({y:+a.slice(0,4),m:+a.slice(5,7),day:+a.slice(8,10)});a.s(["LANE_ROW_H",0,44,"buildTimeline",0,function(a,c){let h=a.map(a=>a.due).filter(a=>!!a),i=g([c,...h].sort()[0]),j=g([c,...h].sort().at(-1)??c),k={y:i.y,m:i.m-1},l=Math.max(6,(j.y-i.y)*12+(j.m-i.m)+3),m=Array.from({length:l},(a,b)=>{let c=12*k.y+(k.m-1)+b,d=Math.floor(c/12),e=c%12+1;return{y:d,m:e,label:1===e||0===b?`${f[e-1]} ${d}`:f[e-1],x:160*b}}),n=a=>{let{y:b,m:c,day:d}=g(a);return((b-m[0].y)*12+(c-m[0].m))*160+(d-.5)/new Date(b,c,0).getDate()*160},o=d(a).map(d=>{let f=[d,...null===d.parent?e(a,d.id):[]].filter(a=>a.due),g=[],h=f.map(a=>({item:a,x:n(a.due),horizon:a.id===d.id})).sort((a,b)=>a.x-b.x).map(a=>{let d=g.findIndex(b=>a.x>=b);return -1===d&&(d=g.push(0)-1),g[d]=a.x+180,{...a,row:d,state:b(a.item.due,a.item.status,c)}});return{item:d,rows:Math.max(1,g.length),markers:h}});return{months:m.map(({label:a,x:b})=>({label:a,x:b})),width:160*l,todayX:n(c),lanes:o,undated:a.filter(a=>!a.due&&"done"!==a.status)}},"formatDay",0,function(a){let{m:b,day:c}=g(a);return`${c} ${f[b-1]}`}],581040)}];
2
2
 
3
3
  //# sourceMappingURL=src_components_1s861m8._.js.map