vibedoc 1.6.1 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (651) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +11 -0
  3. package/.next/build-manifest.json +3 -3
  4. package/.next/prerender-manifest.json +69 -13
  5. package/.next/routes-manifest.json +66 -0
  6. package/.next/server/app/(app)/activity/page.js.nft.json +1 -1
  7. package/.next/server/app/(app)/activity/page_client-reference-manifest.js +1 -1
  8. package/.next/server/app/(app)/board/page.js.nft.json +1 -1
  9. package/.next/server/app/(app)/board/page_client-reference-manifest.js +1 -1
  10. package/.next/server/app/(app)/chat/page/app-paths-manifest.json +3 -0
  11. package/.next/server/app/(app)/chat/page/build-manifest.json +20 -0
  12. package/.next/server/app/(app)/chat/page/next-font-manifest.json +11 -0
  13. package/.next/server/app/(app)/chat/page/react-loadable-manifest.json +1 -0
  14. package/.next/server/app/(app)/chat/page/server-reference-manifest.json +4 -0
  15. package/.next/server/app/(app)/chat/page.js +15 -0
  16. package/.next/server/app/(app)/chat/page.js.map +5 -0
  17. package/.next/server/app/(app)/chat/page.js.nft.json +1 -0
  18. package/.next/server/app/(app)/chat/page_client-reference-manifest.js +3 -0
  19. package/.next/server/app/(app)/docs/page.js.nft.json +1 -1
  20. package/.next/server/app/(app)/docs/page_client-reference-manifest.js +1 -1
  21. package/.next/server/app/(app)/explorer/page.js.nft.json +1 -1
  22. package/.next/server/app/(app)/explorer/page_client-reference-manifest.js +1 -1
  23. package/.next/server/app/(app)/manual-tests/page/app-paths-manifest.json +3 -0
  24. package/.next/server/app/(app)/manual-tests/page/build-manifest.json +20 -0
  25. package/.next/server/app/(app)/manual-tests/page/next-font-manifest.json +11 -0
  26. package/.next/server/app/(app)/manual-tests/page/react-loadable-manifest.json +1 -0
  27. package/.next/server/app/(app)/manual-tests/page/server-reference-manifest.json +4 -0
  28. package/.next/server/app/(app)/manual-tests/page.js +15 -0
  29. package/.next/server/app/(app)/manual-tests/page.js.map +5 -0
  30. package/.next/server/app/(app)/manual-tests/page.js.nft.json +1 -0
  31. package/.next/server/app/(app)/manual-tests/page_client-reference-manifest.js +3 -0
  32. package/.next/server/app/(app)/memory/page.js.nft.json +1 -1
  33. package/.next/server/app/(app)/memory/page_client-reference-manifest.js +1 -1
  34. package/.next/server/app/(app)/roadmap/page.js.nft.json +1 -1
  35. package/.next/server/app/(app)/roadmap/page_client-reference-manifest.js +1 -1
  36. package/.next/server/app/(app)/settings/page.js.nft.json +1 -1
  37. package/.next/server/app/(app)/settings/page_client-reference-manifest.js +1 -1
  38. package/.next/server/app/(app)/setup/page.js.nft.json +1 -1
  39. package/.next/server/app/(app)/setup/page_client-reference-manifest.js +1 -1
  40. package/.next/server/app/_global-error.html +1 -1
  41. package/.next/server/app/_global-error.rsc +1 -1
  42. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  43. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  44. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  45. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  46. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  47. package/.next/server/app/_not-found.html +1 -1
  48. package/.next/server/app/_not-found.rsc +3 -2
  49. package/.next/server/app/_not-found.segments/_full.segment.rsc +3 -2
  50. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +3 -2
  51. package/.next/server/app/_not-found.segments/_tree.segment.rsc +3 -2
  52. package/.next/server/app/activity.html +1 -1
  53. package/.next/server/app/activity.rsc +14 -13
  54. package/.next/server/app/activity.segments/!KGFwcCk/activity/__PAGE__.segment.rsc +10 -10
  55. package/.next/server/app/activity.segments/_full.segment.rsc +14 -13
  56. package/.next/server/app/activity.segments/_tree.segment.rsc +3 -2
  57. package/.next/server/app/api/activity/route.js +2 -2
  58. package/.next/server/app/api/activity/route.js.nft.json +1 -1
  59. package/.next/server/app/api/backlinks/route.js +2 -2
  60. package/.next/server/app/api/backlinks/route.js.nft.json +1 -1
  61. package/.next/server/app/api/chat/route.js +1 -1
  62. package/.next/server/app/api/chat/route.js.nft.json +1 -1
  63. package/.next/server/app/api/context/route.js +2 -2
  64. package/.next/server/app/api/context/route.js.nft.json +1 -1
  65. package/.next/server/app/api/conversations/route/app-paths-manifest.json +3 -0
  66. package/.next/server/app/api/conversations/route/build-manifest.json +12 -0
  67. package/.next/server/app/api/conversations/route/server-reference-manifest.json +4 -0
  68. package/.next/server/app/api/conversations/route.js +9 -0
  69. package/.next/server/app/api/conversations/route.js.map +5 -0
  70. package/.next/server/app/api/conversations/route.js.nft.json +1 -0
  71. package/.next/server/app/api/conversations/route_client-reference-manifest.js +3 -0
  72. package/.next/server/app/api/decisions/route.js +2 -2
  73. package/.next/server/app/api/decisions/route.js.nft.json +1 -1
  74. package/.next/server/app/api/docs/route.js +1 -1
  75. package/.next/server/app/api/docs/route.js.nft.json +1 -1
  76. package/.next/server/app/api/explorer/route.js +2 -2
  77. package/.next/server/app/api/explorer/route.js.nft.json +1 -1
  78. package/.next/server/app/api/mcp/route.js +1 -1
  79. package/.next/server/app/api/mcp/route.js.nft.json +1 -1
  80. package/.next/server/app/api/memory/route.js +2 -2
  81. package/.next/server/app/api/memory/route.js.nft.json +1 -1
  82. package/.next/server/app/api/plan/apply/route.js +3 -3
  83. package/.next/server/app/api/plan/apply/route.js.nft.json +1 -1
  84. package/.next/server/app/api/projects/route.js +2 -2
  85. package/.next/server/app/api/projects/route.js.nft.json +1 -1
  86. package/.next/server/app/api/registry/route.js +2 -2
  87. package/.next/server/app/api/registry/route.js.nft.json +1 -1
  88. package/.next/server/app/api/roadmap/create/route.js +3 -3
  89. package/.next/server/app/api/roadmap/create/route.js.nft.json +1 -1
  90. package/.next/server/app/api/roadmap/delete/route.js +3 -3
  91. package/.next/server/app/api/roadmap/delete/route.js.nft.json +1 -1
  92. package/.next/server/app/api/roadmap/generate/route.js +3 -3
  93. package/.next/server/app/api/roadmap/generate/route.js.nft.json +1 -1
  94. package/.next/server/app/api/roadmap/layout/route.js +3 -3
  95. package/.next/server/app/api/roadmap/layout/route.js.nft.json +1 -1
  96. package/.next/server/app/api/roadmap/restore/route/app-paths-manifest.json +3 -0
  97. package/.next/server/app/api/roadmap/restore/route/build-manifest.json +12 -0
  98. package/.next/server/app/api/roadmap/restore/route/server-reference-manifest.json +4 -0
  99. package/.next/server/app/api/roadmap/restore/route.js +9 -0
  100. package/.next/server/app/api/roadmap/restore/route.js.map +5 -0
  101. package/.next/server/app/api/roadmap/restore/route.js.nft.json +1 -0
  102. package/.next/server/app/api/roadmap/restore/route_client-reference-manifest.js +3 -0
  103. package/.next/server/app/api/roadmap/route.js +3 -3
  104. package/.next/server/app/api/roadmap/route.js.nft.json +1 -1
  105. package/.next/server/app/api/roadmap/update/route.js +3 -3
  106. package/.next/server/app/api/roadmap/update/route.js.nft.json +1 -1
  107. package/.next/server/app/api/sessions/route.js +2 -2
  108. package/.next/server/app/api/sessions/route.js.nft.json +1 -1
  109. package/.next/server/app/api/settings/route.js +3 -3
  110. package/.next/server/app/api/settings/route.js.nft.json +1 -1
  111. package/.next/server/app/api/setup/generate/route.js +1 -1
  112. package/.next/server/app/api/setup/generate/route.js.nft.json +1 -1
  113. package/.next/server/app/api/setup/write/route.js +2 -2
  114. package/.next/server/app/api/setup/write/route.js.nft.json +1 -1
  115. package/.next/server/app/api/summary/route.js +2 -2
  116. package/.next/server/app/api/summary/route.js.nft.json +1 -1
  117. package/.next/server/app/api/tasks/bulk/route/app-paths-manifest.json +3 -0
  118. package/.next/server/app/api/tasks/bulk/route/build-manifest.json +12 -0
  119. package/.next/server/app/api/tasks/bulk/route/server-reference-manifest.json +4 -0
  120. package/.next/server/app/api/tasks/bulk/route.js +9 -0
  121. package/.next/server/app/api/tasks/bulk/route.js.map +5 -0
  122. package/.next/server/app/api/tasks/bulk/route.js.nft.json +1 -0
  123. package/.next/server/app/api/tasks/bulk/route_client-reference-manifest.js +3 -0
  124. package/.next/server/app/api/tasks/create/route.js +2 -2
  125. package/.next/server/app/api/tasks/create/route.js.nft.json +1 -1
  126. package/.next/server/app/api/tasks/delete/route/app-paths-manifest.json +3 -0
  127. package/.next/server/app/api/tasks/delete/route/build-manifest.json +12 -0
  128. package/.next/server/app/api/tasks/delete/route/server-reference-manifest.json +4 -0
  129. package/.next/server/app/api/tasks/delete/route.js +9 -0
  130. package/.next/server/app/api/tasks/delete/route.js.map +5 -0
  131. package/.next/server/app/api/tasks/delete/route.js.nft.json +1 -0
  132. package/.next/server/app/api/tasks/delete/route_client-reference-manifest.js +3 -0
  133. package/.next/server/app/api/tasks/manual-tests/route/app-paths-manifest.json +3 -0
  134. package/.next/server/app/api/tasks/manual-tests/route/build-manifest.json +12 -0
  135. package/.next/server/app/api/tasks/manual-tests/route/server-reference-manifest.json +4 -0
  136. package/.next/server/app/api/tasks/manual-tests/route.js +8 -0
  137. package/.next/server/app/api/tasks/manual-tests/route.js.map +5 -0
  138. package/.next/server/app/api/tasks/manual-tests/route.js.nft.json +1 -0
  139. package/.next/server/app/api/tasks/manual-tests/route_client-reference-manifest.js +3 -0
  140. package/.next/server/app/api/tasks/restore/route/app-paths-manifest.json +3 -0
  141. package/.next/server/app/api/tasks/restore/route/build-manifest.json +12 -0
  142. package/.next/server/app/api/tasks/restore/route/server-reference-manifest.json +4 -0
  143. package/.next/server/app/api/tasks/restore/route.js +9 -0
  144. package/.next/server/app/api/tasks/restore/route.js.map +5 -0
  145. package/.next/server/app/api/tasks/restore/route.js.nft.json +1 -0
  146. package/.next/server/app/api/tasks/restore/route_client-reference-manifest.js +3 -0
  147. package/.next/server/app/api/tasks/review/route/app-paths-manifest.json +3 -0
  148. package/.next/server/app/api/tasks/review/route/build-manifest.json +12 -0
  149. package/.next/server/app/api/tasks/review/route/server-reference-manifest.json +4 -0
  150. package/.next/server/app/api/tasks/review/route.js +9 -0
  151. package/.next/server/app/api/tasks/review/route.js.map +5 -0
  152. package/.next/server/app/api/tasks/review/route.js.nft.json +1 -0
  153. package/.next/server/app/api/tasks/review/route_client-reference-manifest.js +3 -0
  154. package/.next/server/app/api/tasks/route.js +2 -2
  155. package/.next/server/app/api/tasks/route.js.nft.json +1 -1
  156. package/.next/server/app/api/tasks/update/route/app-paths-manifest.json +3 -0
  157. package/.next/server/app/api/tasks/update/route/build-manifest.json +12 -0
  158. package/.next/server/app/api/tasks/update/route/server-reference-manifest.json +4 -0
  159. package/.next/server/app/api/tasks/update/route.js +9 -0
  160. package/.next/server/app/api/tasks/update/route.js.map +5 -0
  161. package/.next/server/app/api/tasks/update/route.js.nft.json +1 -0
  162. package/.next/server/app/api/tasks/update/route_client-reference-manifest.js +3 -0
  163. package/.next/server/app/api/views/route/app-paths-manifest.json +3 -0
  164. package/.next/server/app/api/views/route/build-manifest.json +12 -0
  165. package/.next/server/app/api/views/route/server-reference-manifest.json +4 -0
  166. package/.next/server/app/api/views/route.js +9 -0
  167. package/.next/server/app/api/views/route.js.map +5 -0
  168. package/.next/server/app/api/views/route.js.nft.json +1 -0
  169. package/.next/server/app/api/views/route_client-reference-manifest.js +3 -0
  170. package/.next/server/app/board.html +1 -1
  171. package/.next/server/app/board.rsc +14 -13
  172. package/.next/server/app/board.segments/!KGFwcCk/board/__PAGE__.segment.rsc +10 -10
  173. package/.next/server/app/board.segments/_full.segment.rsc +14 -13
  174. package/.next/server/app/board.segments/_tree.segment.rsc +3 -2
  175. package/.next/server/app/chat.html +1 -0
  176. package/.next/server/app/chat.meta +31 -0
  177. package/.next/server/app/chat.rsc +31 -0
  178. package/.next/server/app/chat.segments/!KGFwcCk/chat/__PAGE__.segment.rsc +34 -0
  179. package/.next/server/app/chat.segments/_full.segment.rsc +31 -0
  180. package/.next/server/app/chat.segments/_tree.segment.rsc +5 -0
  181. package/.next/server/app/docs.html +1 -1
  182. package/.next/server/app/docs.rsc +24 -27
  183. package/.next/server/app/docs.segments/!KGFwcCk/docs/__PAGE__.segment.rsc +7 -6
  184. package/.next/server/app/docs.segments/_full.segment.rsc +24 -27
  185. package/.next/server/app/docs.segments/_tree.segment.rsc +3 -2
  186. package/.next/server/app/explorer.html +1 -1
  187. package/.next/server/app/explorer.rsc +14 -13
  188. package/.next/server/app/explorer.segments/!KGFwcCk/explorer/__PAGE__.segment.rsc +6 -5
  189. package/.next/server/app/explorer.segments/_full.segment.rsc +14 -13
  190. package/.next/server/app/explorer.segments/_tree.segment.rsc +3 -2
  191. package/.next/server/app/index.html +1 -1
  192. package/.next/server/app/index.rsc +3 -2
  193. package/.next/server/app/index.segments/__PAGE__.segment.rsc +3 -2
  194. package/.next/server/app/index.segments/_full.segment.rsc +3 -2
  195. package/.next/server/app/index.segments/_tree.segment.rsc +3 -2
  196. package/.next/server/app/manual-tests.html +1 -0
  197. package/.next/server/app/manual-tests.meta +31 -0
  198. package/.next/server/app/manual-tests.rsc +31 -0
  199. package/.next/server/app/manual-tests.segments/!KGFwcCk/manual-tests/__PAGE__.segment.rsc +33 -0
  200. package/.next/server/app/manual-tests.segments/_full.segment.rsc +31 -0
  201. package/.next/server/app/manual-tests.segments/_tree.segment.rsc +5 -0
  202. package/.next/server/app/memory.html +1 -1
  203. package/.next/server/app/memory.rsc +14 -13
  204. package/.next/server/app/memory.segments/!KGFwcCk/memory/__PAGE__.segment.rsc +6 -5
  205. package/.next/server/app/memory.segments/_full.segment.rsc +14 -13
  206. package/.next/server/app/memory.segments/_tree.segment.rsc +3 -2
  207. package/.next/server/app/page.js.nft.json +1 -1
  208. package/.next/server/app/page_client-reference-manifest.js +1 -1
  209. package/.next/server/app/roadmap.html +1 -1
  210. package/.next/server/app/roadmap.rsc +24 -26
  211. package/.next/server/app/roadmap.segments/!KGFwcCk/roadmap/__PAGE__.segment.rsc +10 -11
  212. package/.next/server/app/roadmap.segments/_full.segment.rsc +24 -26
  213. package/.next/server/app/roadmap.segments/_tree.segment.rsc +3 -2
  214. package/.next/server/app/settings.html +1 -1
  215. package/.next/server/app/settings.rsc +14 -13
  216. package/.next/server/app/settings.segments/!KGFwcCk/settings/__PAGE__.segment.rsc +10 -10
  217. package/.next/server/app/settings.segments/_full.segment.rsc +14 -13
  218. package/.next/server/app/settings.segments/_tree.segment.rsc +3 -2
  219. package/.next/server/app/setup.html +1 -1
  220. package/.next/server/app/setup.rsc +14 -13
  221. package/.next/server/app/setup.segments/!KGFwcCk/setup/__PAGE__.segment.rsc +6 -5
  222. package/.next/server/app/setup.segments/_full.segment.rsc +14 -13
  223. package/.next/server/app/setup.segments/_tree.segment.rsc +3 -2
  224. package/.next/server/app-paths-manifest.json +11 -0
  225. package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0-5bkpj._.js → 11mp_@anthropic-ai_sdk_00p3fu1._.js} +1 -1
  226. package/.next/server/chunks/{11mp_@anthropic-ai_sdk_01l5h3i._.js → 11mp_@anthropic-ai_sdk_01amtux._.js} +1 -1
  227. package/.next/server/chunks/{11mp_@anthropic-ai_sdk_00psb_y._.js → 11mp_@anthropic-ai_sdk_01jjl08._.js} +1 -1
  228. package/.next/server/chunks/{11mp_@anthropic-ai_sdk_072r2bd._.js → 11mp_@anthropic-ai_sdk_071zfm8._.js} +1 -1
  229. package/.next/server/chunks/11mp_@anthropic-ai_sdk_07v3boe._.js +3 -0
  230. package/.next/server/chunks/11mp_@anthropic-ai_sdk_09iva72._.js +3 -0
  231. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0bom1b1._.js +3 -0
  232. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0dvji7p._.js +3 -0
  233. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0dzo8jn._.js +3 -0
  234. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0hvqsqq._.js +3 -0
  235. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0i7i-jw._.js +3 -0
  236. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0k0iop5._.js +3 -0
  237. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0l3-6aq._.js +3 -0
  238. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0oegm3y._.js +3 -0
  239. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0p5cyes._.js +3 -0
  240. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0qw8i6_._.js +3 -0
  241. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0yk-a7v._.js +3 -0
  242. package/.next/server/chunks/11mp_@anthropic-ai_sdk_11fsqvb._.js +3 -0
  243. package/.next/server/chunks/11mp_@anthropic-ai_sdk_143_7ez._.js +3 -0
  244. package/.next/server/chunks/11mp_@anthropic-ai_sdk_14a4-64._.js +3 -0
  245. package/.next/server/chunks/11mp_@anthropic-ai_sdk_17d_oma._.js +3 -0
  246. package/.next/server/chunks/11mp_@anthropic-ai_sdk_18qwuyb._.js +3 -0
  247. package/.next/server/chunks/11mp_@anthropic-ai_sdk_19au8y6._.js +3 -0
  248. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1ak_hy5._.js +3 -0
  249. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1cqa0nq._.js +3 -0
  250. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1i-x_q0._.js +3 -0
  251. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1i-x_q0._.js.map +1 -0
  252. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1jmtliz._.js +3 -0
  253. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1jmtliz._.js.map +1 -0
  254. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1jouwlj._.js +3 -0
  255. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1jouwlj._.js.map +1 -0
  256. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1r_q5um._.js +3 -0
  257. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1r_q5um._.js.map +1 -0
  258. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1t959xd._.js +3 -0
  259. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1t959xd._.js.map +1 -0
  260. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1vkprw9._.js +3 -0
  261. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1vkprw9._.js.map +1 -0
  262. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1y95ax9._.js +3 -0
  263. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1y95ax9._.js.map +1 -0
  264. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1y9misr._.js +3 -0
  265. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1y9misr._.js.map +1 -0
  266. package/.next/server/chunks/11mp_@anthropic-ai_sdk_21b8wwy._.js +3 -0
  267. package/.next/server/chunks/11mp_@anthropic-ai_sdk_21b8wwy._.js.map +1 -0
  268. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_08ecfgc._.js +3 -0
  269. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_09--sd6._.js +3 -0
  270. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0e3mwc6._.js +3 -0
  271. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0go4301._.js +3 -0
  272. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0iq9dmt._.js +3 -0
  273. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0n9ijke._.js +3 -0
  274. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0szcyrx._.js +3 -0
  275. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0xy2s3x._.js +3 -0
  276. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0yaujn7._.js +3 -0
  277. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0z9ly74._.js +3 -0
  278. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1hmq3al._.js +3 -0
  279. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1tqk4bp._.js +3 -0
  280. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1x-hr6f._.js +3 -0
  281. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1zsdhg0._.js +3 -0
  282. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_20t__fe._.js +3 -0
  283. package/.next/server/chunks/{[root-of-the-server]__1u_q61h._.js → [root-of-the-server]__0-pmfg2._.js} +2 -2
  284. package/.next/server/chunks/[root-of-the-server]__02co2yq._.js +3 -0
  285. package/.next/server/chunks/[root-of-the-server]__02co2yq._.js.map +1 -0
  286. package/.next/server/chunks/{[root-of-the-server]__1y3u5ud._.js → [root-of-the-server]__04tibmn._.js} +2 -2
  287. package/.next/server/chunks/{[root-of-the-server]__17xb02p._.js → [root-of-the-server]__05g5cgo._.js} +2 -2
  288. package/.next/server/chunks/{[root-of-the-server]__0aynzrb._.js → [root-of-the-server]__0b5pwze._.js} +2 -2
  289. package/.next/server/chunks/{[root-of-the-server]__142icjb._.js → [root-of-the-server]__0druay_._.js} +2 -2
  290. package/.next/server/chunks/{[root-of-the-server]__106gpvh._.js → [root-of-the-server]__0p6ja6l._.js} +2 -2
  291. package/.next/server/chunks/[root-of-the-server]__0q3-t8a._.js +3 -0
  292. package/.next/server/chunks/[root-of-the-server]__0q3-t8a._.js.map +1 -0
  293. package/.next/server/chunks/[root-of-the-server]__0vcsqzd._.js +3 -0
  294. package/.next/server/chunks/[root-of-the-server]__0vcsqzd._.js.map +1 -0
  295. package/.next/server/chunks/{[root-of-the-server]__0nfvvy9._.js → [root-of-the-server]__1-e3i_5._.js} +2 -2
  296. package/.next/server/chunks/[root-of-the-server]__1-ic3af._.js +3 -0
  297. package/.next/server/chunks/[root-of-the-server]__1-ic3af._.js.map +1 -0
  298. package/.next/server/chunks/[root-of-the-server]__11a4ptn._.js +3 -0
  299. package/.next/server/chunks/[root-of-the-server]__11a4ptn._.js.map +1 -0
  300. package/.next/server/chunks/{[root-of-the-server]__0e59y5j._.js → [root-of-the-server]__11c8641._.js} +2 -2
  301. package/.next/server/chunks/[root-of-the-server]__11c8641._.js.map +1 -0
  302. package/.next/server/chunks/[root-of-the-server]__12nzy_6._.js +3 -0
  303. package/.next/server/chunks/[root-of-the-server]__12nzy_6._.js.map +1 -0
  304. package/.next/server/chunks/[root-of-the-server]__15ck1wv._.js +3 -0
  305. package/.next/server/chunks/[root-of-the-server]__15ck1wv._.js.map +1 -0
  306. package/.next/server/chunks/[root-of-the-server]__1613hjb._.js +30 -19
  307. package/.next/server/chunks/[root-of-the-server]__1613hjb._.js.map +1 -1
  308. package/.next/server/chunks/{[root-of-the-server]__06zf_sh._.js → [root-of-the-server]__197vw9g._.js} +2 -2
  309. package/.next/server/chunks/{[root-of-the-server]__1j0rrps._.js → [root-of-the-server]__19k8t87._.js} +2 -2
  310. package/.next/server/chunks/{[root-of-the-server]__0eqd-tw._.js → [root-of-the-server]__1ezzeji._.js} +2 -2
  311. package/.next/server/chunks/[root-of-the-server]__1jxu2x9._.js +3 -0
  312. package/.next/server/chunks/[root-of-the-server]__1jxu2x9._.js.map +1 -0
  313. package/.next/server/chunks/[root-of-the-server]__1mrmaf9._.js +3 -0
  314. package/.next/server/chunks/{[root-of-the-server]__17p0rkn._.js → [root-of-the-server]__1n68akx._.js} +2 -2
  315. package/.next/server/chunks/[root-of-the-server]__1n68akx._.js.map +1 -0
  316. package/.next/server/chunks/{[root-of-the-server]__11s76m8._.js → [root-of-the-server]__1npya5q._.js} +2 -2
  317. package/.next/server/chunks/[root-of-the-server]__1npya5q._.js.map +1 -0
  318. package/.next/server/chunks/[root-of-the-server]__1qusy4g._.js +3 -0
  319. package/.next/server/chunks/[root-of-the-server]__1qusy4g._.js.map +1 -0
  320. package/.next/server/chunks/{[root-of-the-server]__1q4ahvz._.js → [root-of-the-server]__1umrorf._.js} +2 -2
  321. package/.next/server/chunks/{[root-of-the-server]__093hlkh._.js → [root-of-the-server]__1vh9g2o._.js} +2 -2
  322. package/.next/server/chunks/{[root-of-the-server]__1y-tt29._.js → [root-of-the-server]__1vq38ov._.js} +2 -2
  323. package/.next/server/chunks/[root-of-the-server]__1xb0fmp._.js +1 -1
  324. package/.next/server/chunks/[root-of-the-server]__1xb0fmp._.js.map +1 -1
  325. package/.next/server/chunks/_04byth9._.js +24 -19
  326. package/.next/server/chunks/_04byth9._.js.map +1 -1
  327. package/.next/server/chunks/_1au4syj._.js +1 -1
  328. package/.next/server/chunks/_1au4syj._.js.map +1 -1
  329. package/.next/server/chunks/_1b5fqxy._.js.map +1 -1
  330. package/.next/server/chunks/_1ivswa9._.js +3 -0
  331. package/.next/server/chunks/_1ivswa9._.js.map +1 -0
  332. package/.next/server/chunks/_next-internal_server_app_api_conversations_route_actions_1-pu7gs.js +3 -0
  333. package/.next/server/chunks/_next-internal_server_app_api_conversations_route_actions_1-pu7gs.js.map +1 -0
  334. package/.next/server/chunks/_next-internal_server_app_api_roadmap_restore_route_actions_0skshp1.js +3 -0
  335. package/.next/server/chunks/_next-internal_server_app_api_roadmap_restore_route_actions_0skshp1.js.map +1 -0
  336. package/.next/server/chunks/_next-internal_server_app_api_tasks_bulk_route_actions_1k75mlb.js +3 -0
  337. package/.next/server/chunks/_next-internal_server_app_api_tasks_bulk_route_actions_1k75mlb.js.map +1 -0
  338. package/.next/server/chunks/_next-internal_server_app_api_tasks_delete_route_actions_1k1g6mw.js +3 -0
  339. package/.next/server/chunks/_next-internal_server_app_api_tasks_delete_route_actions_1k1g6mw.js.map +1 -0
  340. package/.next/server/chunks/_next-internal_server_app_api_tasks_manual-tests_route_actions_1rpog0y.js +3 -0
  341. package/.next/server/chunks/_next-internal_server_app_api_tasks_manual-tests_route_actions_1rpog0y.js.map +1 -0
  342. package/.next/server/chunks/_next-internal_server_app_api_tasks_restore_route_actions_1ecsti8.js +3 -0
  343. package/.next/server/chunks/_next-internal_server_app_api_tasks_restore_route_actions_1ecsti8.js.map +1 -0
  344. package/.next/server/chunks/_next-internal_server_app_api_tasks_review_route_actions_1dly07f.js +3 -0
  345. package/.next/server/chunks/_next-internal_server_app_api_tasks_review_route_actions_1dly07f.js.map +1 -0
  346. package/.next/server/chunks/_next-internal_server_app_api_tasks_update_route_actions_0z-ho6g.js +3 -0
  347. package/.next/server/chunks/_next-internal_server_app_api_tasks_update_route_actions_0z-ho6g.js.map +1 -0
  348. package/.next/server/chunks/_next-internal_server_app_api_views_route_actions_10-2c0e.js +3 -0
  349. package/.next/server/chunks/_next-internal_server_app_api_views_route_actions_10-2c0e.js.map +1 -0
  350. package/.next/server/chunks/ssr/{_0qyglif._.js → 0_g__next_dist_000c5_m._.js} +2 -4
  351. package/.next/server/chunks/ssr/0_g__next_dist_000c5_m._.js.map +1 -0
  352. package/.next/server/chunks/ssr/{0_nd_mermaid_dist_mermaid_core_mjs_1vulg1x._.js → 0_nd_mermaid_dist_mermaid_core_mjs_027n2yl._.js} +2 -2
  353. package/.next/server/chunks/ssr/0_nd_mermaid_dist_mermaid_core_mjs_027n2yl._.js.map +1 -0
  354. package/.next/server/chunks/ssr/{1u84_katex_dist_katex_mjs_0mwkb-i._.js → 1u84_katex_dist_katex_mjs_1kb5xea._.js} +1 -1
  355. package/.next/server/chunks/ssr/1u84_katex_dist_katex_mjs_1kb5xea._.js.map +1 -0
  356. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_05ggp3i._.js +1 -1
  357. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_05ggp3i._.js.map +1 -1
  358. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_0wurouw._.js +3 -0
  359. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_0wurouw._.js.map +1 -0
  360. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_14hl50o._.js +3 -0
  361. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_14hl50o._.js.map +1 -0
  362. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_folder-open_mjs_117ipzw._.js +3 -0
  363. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_folder-open_mjs_117ipzw._.js.map +1 -0
  364. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_triangle-alert_mjs_0ei-mpz._.js +3 -0
  365. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_triangle-alert_mjs_0ei-mpz._.js.map +1 -0
  366. package/.next/server/chunks/ssr/[root-of-the-server]__0hcextx._.js +3 -0
  367. package/.next/server/chunks/ssr/[root-of-the-server]__0hcextx._.js.map +1 -0
  368. package/.next/server/chunks/ssr/[root-of-the-server]__0xt_0w2._.js.map +1 -1
  369. package/.next/server/chunks/ssr/[root-of-the-server]__11lfnu0._.js +3 -0
  370. package/.next/server/chunks/ssr/[root-of-the-server]__11lfnu0._.js.map +1 -0
  371. package/.next/server/chunks/ssr/_04xff_2._.js +1 -1
  372. package/.next/server/chunks/ssr/_04xff_2._.js.map +1 -1
  373. package/.next/server/chunks/ssr/_071j6mr._.js +4 -0
  374. package/.next/server/chunks/ssr/_071j6mr._.js.map +1 -0
  375. package/.next/server/chunks/ssr/_09b02z-._.js +3 -0
  376. package/.next/server/chunks/ssr/_09b02z-._.js.map +1 -0
  377. package/.next/server/chunks/ssr/_0d0f1s1._.js +3 -0
  378. package/.next/server/chunks/ssr/_0d0f1s1._.js.map +1 -0
  379. package/.next/server/chunks/ssr/_0idb-vo._.js +151 -0
  380. package/.next/server/chunks/ssr/_0idb-vo._.js.map +1 -0
  381. package/.next/server/chunks/ssr/_0lnt_va._.js +4 -0
  382. package/.next/server/chunks/ssr/_0lnt_va._.js.map +1 -0
  383. package/.next/server/chunks/ssr/_0qlymco._.js +3 -0
  384. package/.next/server/chunks/ssr/_0qlymco._.js.map +1 -0
  385. package/.next/server/chunks/ssr/_0qp3gu7._.js +3 -0
  386. package/.next/server/chunks/ssr/_0qp3gu7._.js.map +1 -0
  387. package/.next/server/chunks/ssr/_0sg1oeq._.js +3 -0
  388. package/.next/server/chunks/ssr/_0sg1oeq._.js.map +1 -0
  389. package/.next/server/chunks/ssr/_14emfpq._.js +3 -0
  390. package/.next/server/chunks/ssr/_14emfpq._.js.map +1 -0
  391. package/.next/server/chunks/ssr/_1ftruw6._.js +4 -0
  392. package/.next/server/chunks/ssr/_1ftruw6._.js.map +1 -0
  393. package/.next/server/chunks/ssr/_1gxjjvh._.js +1 -1
  394. package/.next/server/chunks/ssr/_1gxjjvh._.js.map +1 -1
  395. package/.next/server/chunks/ssr/_1ncdakv._.js +4 -0
  396. package/.next/server/chunks/ssr/_1ncdakv._.js.map +1 -0
  397. package/.next/server/chunks/ssr/_1t76zdx._.js +3 -0
  398. package/.next/server/chunks/ssr/_1t76zdx._.js.map +1 -0
  399. package/.next/server/chunks/ssr/_1x7ggg5._.js +4 -0
  400. package/.next/server/chunks/ssr/_1x7ggg5._.js.map +1 -0
  401. package/.next/server/chunks/ssr/_next-internal_server_app_(app)_chat_page_actions_0g4tbzt.js +3 -0
  402. package/.next/server/chunks/ssr/_next-internal_server_app_(app)_chat_page_actions_0g4tbzt.js.map +1 -0
  403. package/.next/server/chunks/ssr/_next-internal_server_app_(app)_manual-tests_page_actions_1g5zjb7.js +3 -0
  404. package/.next/server/chunks/ssr/_next-internal_server_app_(app)_manual-tests_page_actions_1g5zjb7.js.map +1 -0
  405. package/.next/server/chunks/ssr/{node_modules__pnpm_0w9uewb._.js → node_modules__pnpm_01bjcv9._.js} +1 -1
  406. package/.next/server/chunks/ssr/{node_modules__pnpm_0p10j87._.js → node_modules__pnpm_03qrzdb._.js} +1 -1
  407. package/.next/server/chunks/ssr/{node_modules__pnpm_1a3fo7j._.js → node_modules__pnpm_06d-fdo._.js} +2 -2
  408. package/.next/server/chunks/ssr/{node_modules__pnpm_1o30a9w._.js → node_modules__pnpm_0ctisl0._.js} +1 -1
  409. package/.next/server/chunks/ssr/{node_modules__pnpm_17o8zbz._.js → node_modules__pnpm_0fwp8jm._.js} +1 -1
  410. package/.next/server/chunks/ssr/{node_modules__pnpm_19ys1iv._.js → node_modules__pnpm_0kpu0-2._.js} +1 -1
  411. package/.next/server/chunks/ssr/{node_modules__pnpm_1r4w_7k._.js → node_modules__pnpm_0vry74x._.js} +2 -2
  412. package/.next/server/chunks/ssr/{node_modules__pnpm_11lluiq._.js → node_modules__pnpm_0ycbjbd._.js} +2 -2
  413. package/.next/server/chunks/ssr/{node_modules__pnpm_1_34wt2._.js → node_modules__pnpm_1-76qxg._.js} +1 -1
  414. package/.next/server/chunks/ssr/{node_modules__pnpm_0ma8hho._.js → node_modules__pnpm_1-r94f7._.js} +1 -1
  415. package/.next/server/chunks/ssr/{node_modules__pnpm_0--x5-5._.js → node_modules__pnpm_14piqi4._.js} +1 -1
  416. package/.next/server/chunks/ssr/node_modules__pnpm_14piqi4._.js.map +1 -0
  417. package/.next/server/chunks/ssr/{node_modules__pnpm_04xoqd9._.js → node_modules__pnpm_16u1vfb._.js} +2 -2
  418. package/.next/server/chunks/ssr/node_modules__pnpm_16u1vfb._.js.map +1 -0
  419. package/.next/server/chunks/ssr/{node_modules__pnpm_19ejwjv._.js → node_modules__pnpm_17i6z2d._.js} +1 -1
  420. package/.next/server/chunks/ssr/{node_modules__pnpm_0cj37c-._.js → node_modules__pnpm_189m48n._.js} +1 -1
  421. package/.next/server/chunks/ssr/node_modules__pnpm_189m48n._.js.map +1 -0
  422. package/.next/server/chunks/ssr/{node_modules__pnpm_18pu1wl._.js → node_modules__pnpm_192f222._.js} +1 -1
  423. package/.next/server/chunks/ssr/{node_modules__pnpm_1zsbfem._.js → node_modules__pnpm_1a48_nl._.js} +1 -1
  424. package/.next/server/chunks/ssr/{node_modules__pnpm_00i3mh2._.js → node_modules__pnpm_1aa37e1._.js} +1 -1
  425. package/.next/server/chunks/ssr/{node_modules__pnpm_0kna82c._.js → node_modules__pnpm_1f440kx._.js} +1 -1
  426. package/.next/server/chunks/ssr/{node_modules__pnpm_1-poetj._.js → node_modules__pnpm_1fn3ejy._.js} +1 -1
  427. package/.next/server/chunks/ssr/{node_modules__pnpm_0yixxj2._.js → node_modules__pnpm_1min2jl._.js} +1 -1
  428. package/.next/server/chunks/ssr/node_modules__pnpm_1q89l7p._.js +3 -0
  429. package/.next/server/chunks/ssr/node_modules__pnpm_1q89l7p._.js.map +1 -0
  430. package/.next/server/chunks/ssr/{node_modules__pnpm_1l-posw._.js → node_modules__pnpm_1q_hhr3._.js} +2 -2
  431. package/.next/server/chunks/ssr/{node_modules__pnpm_0fk-8nl._.js → node_modules__pnpm_1qmkxyo._.js} +1 -1
  432. package/.next/server/chunks/ssr/{node_modules__pnpm_1xolwvc._.js → node_modules__pnpm_1qp_jvj._.js} +2 -2
  433. package/.next/server/chunks/ssr/{node_modules__pnpm_07j8gcu._.js → node_modules__pnpm_1ssjj4u._.js} +1 -1
  434. package/.next/server/chunks/ssr/{node_modules__pnpm_042y3e-._.js → node_modules__pnpm_1txccoj._.js} +1 -1
  435. package/.next/server/chunks/ssr/{node_modules__pnpm_0nbxdp_._.js → node_modules__pnpm_1uwkcin._.js} +1 -1
  436. package/.next/server/chunks/ssr/node_modules__pnpm_1xeothw._.js +3 -0
  437. package/.next/server/chunks/ssr/node_modules__pnpm_1xeothw._.js.map +1 -0
  438. package/.next/server/chunks/ssr/{node_modules__pnpm_00wjhj4._.js → node_modules__pnpm_1ygal0c._.js} +1 -1
  439. package/.next/server/chunks/ssr/src_app_(app)_activity_page_tsx_13jd6bn._.js +1 -1
  440. package/.next/server/chunks/ssr/src_app_(app)_activity_page_tsx_13jd6bn._.js.map +1 -1
  441. package/.next/server/chunks/ssr/src_app_(app)_board_page_tsx_0gpfc77._.js +3 -0
  442. package/.next/server/chunks/ssr/src_app_(app)_board_page_tsx_0gpfc77._.js.map +1 -0
  443. package/.next/server/chunks/ssr/src_app_(app)_chat_page_tsx_0c3e4l4._.js +3 -0
  444. package/.next/server/chunks/ssr/src_app_(app)_chat_page_tsx_0c3e4l4._.js.map +1 -0
  445. package/.next/server/chunks/ssr/src_app_(app)_layout_tsx_1yu5hom._.js +3 -0
  446. package/.next/server/chunks/ssr/src_app_(app)_layout_tsx_1yu5hom._.js.map +1 -0
  447. package/.next/server/chunks/ssr/src_app_(app)_manual-tests_page_tsx_01tnunf._.js +3 -0
  448. package/.next/server/chunks/ssr/src_app_(app)_manual-tests_page_tsx_01tnunf._.js.map +1 -0
  449. package/.next/server/chunks/ssr/src_app_(app)_roadmap_page_tsx_0vcq3jr._.js +5 -0
  450. package/.next/server/chunks/ssr/src_app_(app)_roadmap_page_tsx_0vcq3jr._.js.map +1 -0
  451. package/.next/server/chunks/ssr/src_app_(app)_settings_page_tsx_0zevtee._.js +2 -2
  452. package/.next/server/chunks/ssr/src_app_(app)_settings_page_tsx_0zevtee._.js.map +1 -1
  453. package/.next/server/chunks/ssr/src_app_(app)_setup_page_tsx_1yids_n._.js +1 -1
  454. package/.next/server/chunks/ssr/src_app_(app)_setup_page_tsx_1yids_n._.js.map +1 -1
  455. package/.next/server/chunks/ssr/src_components_chat_ChatView_tsx_0h5j-e2._.js +3 -0
  456. package/.next/server/chunks/ssr/src_components_chat_ChatView_tsx_0h5j-e2._.js.map +1 -0
  457. package/.next/server/chunks/ssr/src_context_ChatContext_tsx_0lowp8p._.js +5 -0
  458. package/.next/server/chunks/ssr/src_context_ChatContext_tsx_0lowp8p._.js.map +1 -0
  459. package/.next/server/chunks/ssr/{_1wf14_u._.js → src_lib_templates_index_ts_1s61uk7._.js} +2 -2
  460. package/.next/server/chunks/ssr/{_1wf14_u._.js.map → src_lib_templates_index_ts_1s61uk7._.js.map} +1 -1
  461. package/.next/server/middleware-build-manifest.js +3 -3
  462. package/.next/server/next-font-manifest.js +1 -1
  463. package/.next/server/next-font-manifest.json +8 -0
  464. package/.next/server/pages/404.html +1 -1
  465. package/.next/server/pages/500.html +1 -1
  466. package/.next/server/prefetch-hints.json +38 -0
  467. package/.next/server/server-reference-manifest.js +1 -1
  468. package/.next/server/server-reference-manifest.json +1 -1
  469. package/.next/static/chunks/02cj5_i9np4sg.js +3 -0
  470. package/.next/static/chunks/02i5hsdat1nuq.css +9 -0
  471. package/.next/static/chunks/0mgifb98wbesa.js +1 -0
  472. package/.next/static/chunks/0p1-hkgnm2ll2.js +1 -0
  473. package/.next/static/chunks/0pgu5q5vodev6.js +1 -0
  474. package/.next/static/chunks/0rqzvayflendx.js +2 -0
  475. package/.next/static/chunks/0vcfs7dii85tw.js +21 -0
  476. package/.next/static/chunks/13l4l-boqg8fx.js +1 -0
  477. package/.next/static/chunks/14hxe1qiaram9.js +1 -0
  478. package/.next/static/chunks/150y5rwg6gwvx.css +1 -0
  479. package/.next/static/chunks/16k196zyl-n9q.js +1 -0
  480. package/.next/static/chunks/18b5l8p0vd9f8.js +1 -0
  481. package/.next/static/chunks/1c_8t2kecjnua.js +1 -0
  482. package/.next/static/chunks/1fd43t9y42wd3.js +1 -0
  483. package/.next/static/chunks/1q50zh5z-fq2k.js +2 -0
  484. package/.next/static/chunks/1tu8lforstp1o.js +1 -0
  485. package/.next/static/chunks/23-xknrz6o748.js +1 -0
  486. package/.next/static/chunks/2_xpm7qhr69n8.js +2 -0
  487. package/.next/static/chunks/2ls_yp4-qgb42.js +1 -0
  488. package/.next/static/chunks/2zz0ip2l_29c3.js +3 -0
  489. package/.next/static/chunks/3ly7b47esdb7j.js +1 -0
  490. package/.next/static/chunks/3ruw8lu2_re-h.js +1 -0
  491. package/.next/static/chunks/3vf5nnd4xjo5_.js +1 -0
  492. package/.next/static/chunks/{0eggcu0ovk8sd.js → 40jaenrnspnlh.js} +26 -26
  493. package/.next/static/chunks/41oxcdcw-pcwt.js +1 -0
  494. package/README.md +3 -2
  495. package/package.json +1 -1
  496. package/skills/work-epic/SKILL.md +22 -3
  497. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0am8bw2._.js +0 -3
  498. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0enefn6._.js +0 -3
  499. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0k3n_5f._.js +0 -3
  500. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0lcfjm4._.js +0 -3
  501. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0lfx9av._.js +0 -3
  502. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0qau3qw._.js +0 -3
  503. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0r1pmvm._.js +0 -3
  504. package/.next/server/chunks/11mp_@anthropic-ai_sdk_11t-z2t._.js +0 -3
  505. package/.next/server/chunks/11mp_@anthropic-ai_sdk_15hyn79._.js +0 -3
  506. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1_qk07x._.js +0 -3
  507. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1b2929e._.js +0 -3
  508. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1e72c89._.js +0 -3
  509. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1eq7asn._.js +0 -3
  510. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1fhdojs._.js +0 -3
  511. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1lh_vwq._.js +0 -3
  512. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1ludf-o._.js +0 -3
  513. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1m3luz3._.js +0 -3
  514. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1x1iz3d._.js +0 -3
  515. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1xsmwlh._.js +0 -3
  516. package/.next/server/chunks/11mp_@anthropic-ai_sdk_202spah._.js +0 -3
  517. package/.next/server/chunks/11mp_@anthropic-ai_sdk_215hw9u._.js +0 -3
  518. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0n-i0pd._.js +0 -3
  519. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_13pos4j._.js +0 -3
  520. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_17b4pqr._.js +0 -3
  521. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1bkcmom._.js +0 -3
  522. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1hlj_3l._.js +0 -3
  523. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1ip-sor._.js +0 -3
  524. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1pex5o1._.js +0 -3
  525. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1s8lc8_._.js +0 -3
  526. package/.next/server/chunks/[root-of-the-server]__1o4a-4j._.js +0 -3
  527. package/.next/server/chunks/[root-of-the-server]__1o4a-4j._.js.map +0 -1
  528. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_08ca0b4._.js +0 -3
  529. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_08ca0b4._.js.map +0 -1
  530. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_0c1k9is._.js +0 -3
  531. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_0c1k9is._.js.map +0 -1
  532. package/.next/server/chunks/ssr/_0qyglif._.js.map +0 -1
  533. package/.next/server/chunks/ssr/_0skuoxv._.js +0 -6
  534. package/.next/server/chunks/ssr/_0skuoxv._.js.map +0 -1
  535. package/.next/server/chunks/ssr/_14i_6yb._.js +0 -3
  536. package/.next/server/chunks/ssr/_14i_6yb._.js.map +0 -1
  537. package/.next/server/chunks/ssr/_1c95ems._.js +0 -151
  538. package/.next/server/chunks/ssr/_1c95ems._.js.map +0 -1
  539. package/.next/server/chunks/ssr/_1cbhuz4._.js +0 -3
  540. package/.next/server/chunks/ssr/_1cbhuz4._.js.map +0 -1
  541. package/.next/server/chunks/ssr/_1ewk_mn._.js +0 -3
  542. package/.next/server/chunks/ssr/_1ewk_mn._.js.map +0 -1
  543. package/.next/server/chunks/ssr/_1y-ofyw._.js +0 -3
  544. package/.next/server/chunks/ssr/_1y-ofyw._.js.map +0 -1
  545. package/.next/server/chunks/ssr/node_modules__pnpm_0bmkw6o._.js +0 -3
  546. package/.next/server/chunks/ssr/node_modules__pnpm_0bmkw6o._.js.map +0 -1
  547. package/.next/server/chunks/ssr/node_modules__pnpm_1imm4ut._.js +0 -3
  548. package/.next/server/chunks/ssr/node_modules__pnpm_1imm4ut._.js.map +0 -1
  549. package/.next/server/chunks/ssr/src_components_008q3v8._.js +0 -3
  550. package/.next/server/chunks/ssr/src_components_008q3v8._.js.map +0 -1
  551. package/.next/server/chunks/ssr/src_components_14pwej-._.js +0 -3
  552. package/.next/server/chunks/ssr/src_components_14pwej-._.js.map +0 -1
  553. package/.next/server/chunks/ssr/src_components_ui_scroll-area_tsx_0i-n_27._.js +0 -3
  554. package/.next/server/chunks/ssr/src_components_ui_scroll-area_tsx_0i-n_27._.js.map +0 -1
  555. package/.next/static/chunks/0-vk2d2nnzav2.js +0 -3
  556. package/.next/static/chunks/0-z7kyblalrea.js +0 -1
  557. package/.next/static/chunks/02sab26ica2x3.js +0 -1
  558. package/.next/static/chunks/0iva6rdtfqpbz.js +0 -1
  559. package/.next/static/chunks/0k2qhx29amdgs.js +0 -1
  560. package/.next/static/chunks/0qm101bdsxdyh.css +0 -10
  561. package/.next/static/chunks/0wg9n5zb8mo2p.js +0 -1
  562. package/.next/static/chunks/0z_y7el6m76yk.js +0 -1
  563. package/.next/static/chunks/1-ekntoveuxzd.js +0 -4
  564. package/.next/static/chunks/10neasnz6hhq1.js +0 -1
  565. package/.next/static/chunks/1r7z33e9jk3vp.js +0 -1
  566. package/.next/static/chunks/22dw7r8x0h2sx.js +0 -1
  567. package/.next/static/chunks/26ee8jsbellqk.js +0 -21
  568. package/.next/static/chunks/3kkg030rcpz7l.js +0 -1
  569. package/.next/static/chunks/3pf_4ye6ju8gt.js +0 -1
  570. package/.next/static/chunks/3smp1lj103j-l.js +0 -1
  571. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0-5bkpj._.js.map → 11mp_@anthropic-ai_sdk_00p3fu1._.js.map} +0 -0
  572. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_00psb_y._.js.map → 11mp_@anthropic-ai_sdk_01amtux._.js.map} +0 -0
  573. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_01l5h3i._.js.map → 11mp_@anthropic-ai_sdk_01jjl08._.js.map} +0 -0
  574. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_072r2bd._.js.map → 11mp_@anthropic-ai_sdk_071zfm8._.js.map} +0 -0
  575. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0am8bw2._.js.map → 11mp_@anthropic-ai_sdk_07v3boe._.js.map} +0 -0
  576. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0enefn6._.js.map → 11mp_@anthropic-ai_sdk_09iva72._.js.map} +0 -0
  577. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0k3n_5f._.js.map → 11mp_@anthropic-ai_sdk_0bom1b1._.js.map} +0 -0
  578. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0lcfjm4._.js.map → 11mp_@anthropic-ai_sdk_0dvji7p._.js.map} +0 -0
  579. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0lfx9av._.js.map → 11mp_@anthropic-ai_sdk_0dzo8jn._.js.map} +0 -0
  580. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0qau3qw._.js.map → 11mp_@anthropic-ai_sdk_0hvqsqq._.js.map} +0 -0
  581. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0r1pmvm._.js.map → 11mp_@anthropic-ai_sdk_0i7i-jw._.js.map} +0 -0
  582. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_11t-z2t._.js.map → 11mp_@anthropic-ai_sdk_0k0iop5._.js.map} +0 -0
  583. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_15hyn79._.js.map → 11mp_@anthropic-ai_sdk_0l3-6aq._.js.map} +0 -0
  584. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1_qk07x._.js.map → 11mp_@anthropic-ai_sdk_0oegm3y._.js.map} +0 -0
  585. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1b2929e._.js.map → 11mp_@anthropic-ai_sdk_0p5cyes._.js.map} +0 -0
  586. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1e72c89._.js.map → 11mp_@anthropic-ai_sdk_0qw8i6_._.js.map} +0 -0
  587. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1eq7asn._.js.map → 11mp_@anthropic-ai_sdk_0yk-a7v._.js.map} +0 -0
  588. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1fhdojs._.js.map → 11mp_@anthropic-ai_sdk_11fsqvb._.js.map} +0 -0
  589. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1lh_vwq._.js.map → 11mp_@anthropic-ai_sdk_143_7ez._.js.map} +0 -0
  590. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1ludf-o._.js.map → 11mp_@anthropic-ai_sdk_14a4-64._.js.map} +0 -0
  591. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1m3luz3._.js.map → 11mp_@anthropic-ai_sdk_17d_oma._.js.map} +0 -0
  592. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1x1iz3d._.js.map → 11mp_@anthropic-ai_sdk_18qwuyb._.js.map} +0 -0
  593. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1xsmwlh._.js.map → 11mp_@anthropic-ai_sdk_19au8y6._.js.map} +0 -0
  594. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_202spah._.js.map → 11mp_@anthropic-ai_sdk_1ak_hy5._.js.map} +0 -0
  595. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_215hw9u._.js.map → 11mp_@anthropic-ai_sdk_1cqa0nq._.js.map} +0 -0
  596. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_0n-i0pd._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_08ecfgc._.js.map} +0 -0
  597. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_13pos4j._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_09--sd6._.js.map} +0 -0
  598. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_17b4pqr._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0e3mwc6._.js.map} +0 -0
  599. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1bkcmom._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0go4301._.js.map} +0 -0
  600. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1hlj_3l._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0iq9dmt._.js.map} +0 -0
  601. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1ip-sor._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0n9ijke._.js.map} +0 -0
  602. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1pex5o1._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0szcyrx._.js.map} +0 -0
  603. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1s8lc8_._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0xy2s3x._.js.map} +0 -0
  604. /package/.next/server/chunks/{[root-of-the-server]__0e59y5j._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0yaujn7._.js.map} +0 -0
  605. /package/.next/server/chunks/{[root-of-the-server]__11s76m8._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0z9ly74._.js.map} +0 -0
  606. /package/.next/server/chunks/{ssr/0_nd_mermaid_dist_mermaid_core_mjs_1vulg1x._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1hmq3al._.js.map} +0 -0
  607. /package/.next/server/chunks/{ssr/1u84_katex_dist_katex_mjs_0mwkb-i._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1tqk4bp._.js.map} +0 -0
  608. /package/.next/server/chunks/{ssr/node_modules__pnpm_0--x5-5._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1x-hr6f._.js.map} +0 -0
  609. /package/.next/server/chunks/{ssr/node_modules__pnpm_04xoqd9._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1zsdhg0._.js.map} +0 -0
  610. /package/.next/server/chunks/{ssr/node_modules__pnpm_0cj37c-._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_20t__fe._.js.map} +0 -0
  611. /package/.next/server/chunks/{[root-of-the-server]__1u_q61h._.js.map → [root-of-the-server]__0-pmfg2._.js.map} +0 -0
  612. /package/.next/server/chunks/{[root-of-the-server]__1y3u5ud._.js.map → [root-of-the-server]__04tibmn._.js.map} +0 -0
  613. /package/.next/server/chunks/{[root-of-the-server]__17xb02p._.js.map → [root-of-the-server]__05g5cgo._.js.map} +0 -0
  614. /package/.next/server/chunks/{[root-of-the-server]__0aynzrb._.js.map → [root-of-the-server]__0b5pwze._.js.map} +0 -0
  615. /package/.next/server/chunks/{[root-of-the-server]__142icjb._.js.map → [root-of-the-server]__0druay_._.js.map} +0 -0
  616. /package/.next/server/chunks/{[root-of-the-server]__106gpvh._.js.map → [root-of-the-server]__0p6ja6l._.js.map} +0 -0
  617. /package/.next/server/chunks/{[root-of-the-server]__0nfvvy9._.js.map → [root-of-the-server]__1-e3i_5._.js.map} +0 -0
  618. /package/.next/server/chunks/{[root-of-the-server]__06zf_sh._.js.map → [root-of-the-server]__197vw9g._.js.map} +0 -0
  619. /package/.next/server/chunks/{[root-of-the-server]__1j0rrps._.js.map → [root-of-the-server]__19k8t87._.js.map} +0 -0
  620. /package/.next/server/chunks/{[root-of-the-server]__0eqd-tw._.js.map → [root-of-the-server]__1ezzeji._.js.map} +0 -0
  621. /package/.next/server/chunks/{[root-of-the-server]__17p0rkn._.js.map → [root-of-the-server]__1mrmaf9._.js.map} +0 -0
  622. /package/.next/server/chunks/{[root-of-the-server]__1q4ahvz._.js.map → [root-of-the-server]__1umrorf._.js.map} +0 -0
  623. /package/.next/server/chunks/{[root-of-the-server]__093hlkh._.js.map → [root-of-the-server]__1vh9g2o._.js.map} +0 -0
  624. /package/.next/server/chunks/{[root-of-the-server]__1y-tt29._.js.map → [root-of-the-server]__1vq38ov._.js.map} +0 -0
  625. /package/.next/server/chunks/ssr/{node_modules__pnpm_0w9uewb._.js.map → node_modules__pnpm_01bjcv9._.js.map} +0 -0
  626. /package/.next/server/chunks/ssr/{node_modules__pnpm_0p10j87._.js.map → node_modules__pnpm_03qrzdb._.js.map} +0 -0
  627. /package/.next/server/chunks/ssr/{node_modules__pnpm_1a3fo7j._.js.map → node_modules__pnpm_06d-fdo._.js.map} +0 -0
  628. /package/.next/server/chunks/ssr/{node_modules__pnpm_1o30a9w._.js.map → node_modules__pnpm_0ctisl0._.js.map} +0 -0
  629. /package/.next/server/chunks/ssr/{node_modules__pnpm_17o8zbz._.js.map → node_modules__pnpm_0fwp8jm._.js.map} +0 -0
  630. /package/.next/server/chunks/ssr/{node_modules__pnpm_19ys1iv._.js.map → node_modules__pnpm_0kpu0-2._.js.map} +0 -0
  631. /package/.next/server/chunks/ssr/{node_modules__pnpm_1r4w_7k._.js.map → node_modules__pnpm_0vry74x._.js.map} +0 -0
  632. /package/.next/server/chunks/ssr/{node_modules__pnpm_11lluiq._.js.map → node_modules__pnpm_0ycbjbd._.js.map} +0 -0
  633. /package/.next/server/chunks/ssr/{node_modules__pnpm_1_34wt2._.js.map → node_modules__pnpm_1-76qxg._.js.map} +0 -0
  634. /package/.next/server/chunks/ssr/{node_modules__pnpm_0ma8hho._.js.map → node_modules__pnpm_1-r94f7._.js.map} +0 -0
  635. /package/.next/server/chunks/ssr/{node_modules__pnpm_19ejwjv._.js.map → node_modules__pnpm_17i6z2d._.js.map} +0 -0
  636. /package/.next/server/chunks/ssr/{node_modules__pnpm_18pu1wl._.js.map → node_modules__pnpm_192f222._.js.map} +0 -0
  637. /package/.next/server/chunks/ssr/{node_modules__pnpm_1zsbfem._.js.map → node_modules__pnpm_1a48_nl._.js.map} +0 -0
  638. /package/.next/server/chunks/ssr/{node_modules__pnpm_00i3mh2._.js.map → node_modules__pnpm_1aa37e1._.js.map} +0 -0
  639. /package/.next/server/chunks/ssr/{node_modules__pnpm_0kna82c._.js.map → node_modules__pnpm_1f440kx._.js.map} +0 -0
  640. /package/.next/server/chunks/ssr/{node_modules__pnpm_1-poetj._.js.map → node_modules__pnpm_1fn3ejy._.js.map} +0 -0
  641. /package/.next/server/chunks/ssr/{node_modules__pnpm_0yixxj2._.js.map → node_modules__pnpm_1min2jl._.js.map} +0 -0
  642. /package/.next/server/chunks/ssr/{node_modules__pnpm_1l-posw._.js.map → node_modules__pnpm_1q_hhr3._.js.map} +0 -0
  643. /package/.next/server/chunks/ssr/{node_modules__pnpm_0fk-8nl._.js.map → node_modules__pnpm_1qmkxyo._.js.map} +0 -0
  644. /package/.next/server/chunks/ssr/{node_modules__pnpm_1xolwvc._.js.map → node_modules__pnpm_1qp_jvj._.js.map} +0 -0
  645. /package/.next/server/chunks/ssr/{node_modules__pnpm_07j8gcu._.js.map → node_modules__pnpm_1ssjj4u._.js.map} +0 -0
  646. /package/.next/server/chunks/ssr/{node_modules__pnpm_042y3e-._.js.map → node_modules__pnpm_1txccoj._.js.map} +0 -0
  647. /package/.next/server/chunks/ssr/{node_modules__pnpm_0nbxdp_._.js.map → node_modules__pnpm_1uwkcin._.js.map} +0 -0
  648. /package/.next/server/chunks/ssr/{node_modules__pnpm_00wjhj4._.js.map → node_modules__pnpm_1ygal0c._.js.map} +0 -0
  649. /package/.next/static/{gJtrYenzL6_deB-6pdvIL → fGPda81_8-K4GmaNUE6KA}/_buildManifest.js +0 -0
  650. /package/.next/static/{gJtrYenzL6_deB-6pdvIL → fGPda81_8-K4GmaNUE6KA}/_clientMiddlewareManifest.js +0 -0
  651. /package/.next/static/{gJtrYenzL6_deB-6pdvIL → fGPda81_8-K4GmaNUE6KA}/_ssgManifest.js +0 -0
@@ -1,3 +1,3 @@
1
- module.exports=[136642,a=>{"use strict";var b=a.i(662145),c=a.i(174897),d=a.i(913975),e=a.i(544394),f=a.i(368114),g=a.i(578520);function h({activity:a}){return(0,b.jsxs)("div",{className:"relative",children:[(0,b.jsx)("div",{className:"absolute left-4 top-0 bottom-0 w-px bg-border"}),(0,b.jsx)("div",{className:"flex flex-col gap-0",children:a.map(a=>(0,b.jsx)(g.ActivityEventRow,{event:a},a.id))})]})}let i={done:"bg-teal","in-progress":"bg-amber",blocked:"bg-danger",todo:"bg-muted",cancelled:"bg-border2"},j="inline-flex max-w-full items-center gap-1.5 truncate rounded-md border border-border bg-bg/40 px-2 py-1 text-xs font-mono text-txt transition-[border-color,background-color,transform] duration-(--duration-fast) ease-out-soft hover:-translate-y-px hover:border-border2 hover:bg-surface2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/60";function k({open:a,events:c}){return(0,b.jsx)("div",{className:(0,f.cn)("grid transition-[grid-template-rows,opacity] duration-(--duration-slow) ease-out-soft",a?"grid-rows-[1fr] opacity-100":"grid-rows-[0fr] opacity-0"),children:(0,b.jsx)("div",{className:"min-h-0 overflow-hidden",inert:!a,children:(0,b.jsxs)("div",{className:"relative mt-4 border-t border-border pt-4",children:[(0,b.jsx)("div",{className:"absolute left-4 top-4 bottom-0 w-px bg-border"}),c.map(a=>(0,b.jsx)(g.ActivityEventRow,{event:a},a.id))]})})})}function l({open:a}){return(0,b.jsx)("span",{className:(0,f.cn)("inline-block text-muted transition-transform duration-(--duration-base) ease-out-soft",a&&"rotate-90"),"aria-hidden":!0,children:"▸"})}function m({session:a,events:d,onOpenTask:e,onOpenDoc:g,focused:h=!1,live:n=!1}){let o,[p,q]=(0,c.useState)(h),r=(0,c.useRef)(null);(0,c.useEffect)(()=>{h&&r.current?.scrollIntoView({block:"center",behavior:"smooth"})},[h]);let s="ai"===a.actor,t=a.tasks.filter(a=>"done"===a.lastStatus).length,u=a.tasks.length+a.docs.length+a.decisions.length>0,v=`${(o=Math.round((Date.parse(a.end)-Date.parse(a.start))/6e4))<1?"<1m":o<60?`${o}m`:`${Math.floor(o/60)}h ${o%60}m`} \xb7 ${a.eventCount} event${1===a.eventCount?"":"s"}`;return u?(0,b.jsxs)("div",{ref:r,className:(0,f.cn)("group rounded-xl border bg-surface p-4 transition-[border-color,transform,box-shadow] duration-(--duration-base) ease-out-soft hover:-translate-y-0.5 hover:border-border2 hover:shadow-lg hover:shadow-black/20",n?"border-accent/40":"border-border",h&&"border-accent/60 animate-flash"),children:[(0,b.jsxs)("button",{onClick:()=>q(a=>!a),"aria-expanded":p,className:"flex w-full items-center gap-2 text-left text-xs",children:[(0,b.jsx)("span",{className:(0,f.cn)("font-medium",s?"text-accent":"text-txt"),children:s?"🤖 Agent":"👤 Human"}),n&&(0,b.jsxs)("span",{className:"flex items-center gap-1 rounded-full bg-accent/10 px-1.5 py-0.5 font-mono text-[10px] uppercase tracking-wide text-accent",children:[(0,b.jsx)("span",{className:"h-1.5 w-1.5 rounded-full bg-accent animate-pulse-dot"}),"live"]}),(0,b.jsx)("span",{className:"ml-auto font-mono text-muted",children:v}),(0,b.jsx)(l,{open:p})]}),(0,b.jsx)("p",{className:"mt-2 text-[15px] font-medium leading-snug text-txt",children:a.headline}),a.tasks.length>0&&(0,b.jsxs)("div",{className:"mt-3 flex items-center gap-2",title:`${t} of ${a.tasks.length} tasks done`,children:[(0,b.jsx)("div",{className:"h-1 flex-1 overflow-hidden rounded-full bg-surface2",children:(0,b.jsx)("div",{className:"h-full origin-left rounded-full bg-teal animate-grow-x transition-[width] duration-(--duration-slow) ease-out-soft",style:{width:`${t/a.tasks.length*100}%`}})}),(0,b.jsxs)("span",{className:"font-mono text-[11px] text-muted",children:[t,"/",a.tasks.length]})]}),(0,b.jsxs)("div",{className:"mt-3 flex flex-wrap gap-1.5",children:[a.tasks.map(a=>(0,b.jsxs)("button",{onClick:()=>e(a.id),className:j,title:`${a.id} → ${a.lastStatus}`,children:[(0,b.jsx)("span",{className:(0,f.cn)("h-1.5 w-1.5 shrink-0 rounded-full",i[a.lastStatus])}),a.id,(0,b.jsx)("span",{className:"text-muted",children:a.lastStatus})]},a.id)),a.docs.map(a=>(0,b.jsxs)("button",{onClick:()=>g(a),className:j,title:a,children:["📄 ",a.split("/").pop()]},a)),a.decisions.map(a=>(0,b.jsxs)("button",{onClick:()=>g(a.split(":")[0]),className:(0,f.cn)(j,"text-accent"),title:a,children:["📝 ",a]},a))]}),(0,b.jsx)(k,{open:p,events:d})]}):(0,b.jsxs)("div",{ref:r,className:(0,f.cn)("rounded-lg px-3 py-2 transition-colors duration-(--duration-fast) hover:bg-surface/60",h&&"bg-surface animate-flash"),children:[(0,b.jsxs)("button",{onClick:()=>q(a=>!a),"aria-expanded":p,className:"flex w-full items-center gap-2 text-left text-sm text-muted",children:[(0,b.jsx)("span",{children:s?"🤖":"👤"}),(0,b.jsx)("span",{className:"truncate",children:a.headline}),(0,b.jsx)("span",{className:"ml-auto shrink-0 font-mono text-xs text-muted/70",children:v}),(0,b.jsx)(l,{open:p})]}),(0,b.jsx)(k,{open:p,events:d})]})}function n(a){let b=new Date(a),c=new Date,d=new Date(c);return(d.setDate(c.getDate()-1),b.toDateString()===c.toDateString())?"Today":b.toDateString()===d.toDateString()?"Yesterday":b.toLocaleDateString(void 0,{weekday:"short",month:"short",day:"numeric"})}function o({value:a,label:c,tone:d}){return(0,b.jsxs)("div",{className:"min-w-0",children:[(0,b.jsx)("p",{className:(0,f.cn)("font-display text-2xl font-semibold tabular-nums leading-none",a?d??"text-txt":"text-muted/50"),children:a}),(0,b.jsx)("p",{className:"mt-1.5 text-xs text-muted",children:c})]})}function p({sessions:a,events:d,onOpenTask:e,onOpenDoc:g,focusSessionId:h}){var i;let j,[k,l]=(0,c.useState)("all"),[q,r]=(0,c.useState)(()=>Date.now());(0,c.useEffect)(()=>{let a=setInterval(()=>r(Date.now()),3e4);return()=>clearInterval(a)},[]);let s=(i=q-864e5,{sessions:(j=a.filter(a=>Date.parse(a.end)>=i)).length,tasksDone:new Set(j.flatMap(a=>a.tasks.filter(a=>"done"===a.lastStatus).map(a=>a.id))).size,docs:new Set(j.flatMap(a=>a.docs)).size,decisions:j.reduce((a,b)=>a+b.decisions.length,0)}),t={all:a.length,ai:a.filter(a=>"ai"===a.actor).length,human:a.filter(a=>"human"===a.actor).length},u="all"===k?a:a.filter(a=>a.actor===k);return(0,b.jsxs)("div",{children:[(0,b.jsxs)("section",{className:"mb-6 grid grid-cols-2 gap-5 rounded-xl border border-border bg-surface px-5 py-4 animate-fade-in sm:grid-cols-4",children:[(0,b.jsx)(o,{value:s.sessions,label:"sessions · 24h"}),(0,b.jsx)(o,{value:s.tasksDone,label:"tasks done",tone:"text-teal"}),(0,b.jsx)(o,{value:s.docs,label:"docs changed"}),(0,b.jsx)(o,{value:s.decisions,label:"ADRs logged",tone:"text-accent"})]}),(0,b.jsx)("div",{className:"mb-4 flex items-center gap-1 text-xs",role:"tablist","aria-label":"Filter by actor",children:["all","ai","human"].map(a=>(0,b.jsxs)("button",{role:"tab","aria-selected":k===a,onClick:()=>l(a),className:(0,f.cn)("rounded-full px-3 py-1 transition-colors duration-(--duration-fast)",k===a?"bg-surface2 text-txt":"text-muted hover:text-txt"),children:["all"===a?"All":"ai"===a?"🤖 Agent":"👤 Human",(0,b.jsx)("span",{className:"ml-1.5 font-mono text-muted",children:t[a]})]},a))}),0===u.length?(0,b.jsxs)("p",{className:"py-10 text-center text-sm text-muted",children:["No ","ai"===k?"agent":"human"," sessions yet."]}):(0,b.jsxs)("ol",{className:"relative",children:[(0,b.jsx)("div",{className:"absolute left-[3.5rem] top-2 bottom-2 w-px bg-border","aria-hidden":!0}),u.map((a,c)=>{let i=n(a.start),j=0===c||n(u[c-1].start)!==i,k=function(a,b=Date.now(),c=3e5){return b-Date.parse(a.end)<c}(a,q),l=a.tasks.length+a.docs.length+a.decisions.length===0;return(0,b.jsxs)("li",{className:"animate-fade-in",style:{animationDelay:`${45*Math.min(c,8)}ms`,animationFillMode:"both"},children:[j&&(0,b.jsx)("p",{className:"sticky top-0 z-10 -mx-1 mb-2 bg-bg/90 px-1 py-2 text-xs font-mono uppercase tracking-wide text-muted backdrop-blur-sm",children:i}),(0,b.jsxs)("div",{className:"grid grid-cols-[2.75rem_1.5rem_1fr] items-start pb-3",children:[(0,b.jsx)("time",{dateTime:a.start,className:(0,f.cn)("text-right font-mono text-[11px] text-muted",l?"pt-2.5":"pt-4"),title:new Date(a.start).toLocaleString(),children:new Date(a.start).toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",hourCycle:"h23"})}),(0,b.jsx)("span",{className:(0,f.cn)("flex justify-center",l?"pt-[0.95rem]":"pt-[1.2rem]"),"aria-hidden":!0,children:(0,b.jsx)("span",{className:(0,f.cn)("relative z-[1] rounded-full ring-4 ring-bg",l?"h-1.5 w-1.5":"h-2.5 w-2.5","ai"===a.actor?"bg-accent":"bg-muted",k&&"animate-pulse-dot")})}),(0,b.jsx)(m,{session:a,events:a.eventIds.flatMap(a=>d.get(a)??[]),onOpenTask:e,onOpenDoc:g,focused:a.id===h,live:k})]})]},a.id)})]})]})}var q=a.i(21215);function r({activity:a,liveIndicator:d,rootParam:e,onOpenTask:g,onOpenDoc:i,focusSessionId:j}){let[k,l]=(0,c.useState)("sessions"),[m,n]=(0,c.useState)(j);j!==m&&(n(j),j&&l("sessions"));let[o,s]=(0,c.useState)(null),[t,u]=(0,c.useState)(!1),[v,w]=(0,c.useState)(new Map);(0,c.useEffect)(()=>{let a=e?`${e}&`:"?",b=()=>Promise.all([fetch(`/api/sessions${e}`).then(a=>a.json()),fetch(`/api/activity${a}limit=2000`).then(a=>a.json())]).then(([a,b])=>{u(!1),s(Array.isArray(a)?a:[]),w(new Map((Array.isArray(b)?b:[]).map(a=>[a.id,a])))}).catch(()=>{u(!0),s(a=>a??[])});return b(),window.addEventListener("vibedoc:sse",b),()=>window.removeEventListener("vibedoc:sse",b)},[e]);let x="sessions"===k?o?.length===0:0===a.length;return(0,b.jsxs)("div",{className:"p-6 max-w-3xl",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between mb-6",children:[(0,b.jsx)("h1",{className:"font-display text-xl font-semibold tracking-tight",children:"Activity"}),(0,b.jsxs)("div",{className:"flex items-center gap-4",children:[(0,b.jsxs)("div",{className:"relative grid grid-cols-2 rounded-md border border-border p-0.5 text-xs",children:[(0,b.jsx)("span",{"aria-hidden":!0,className:(0,f.cn)("absolute inset-y-0.5 left-0.5 w-[calc(50%-2px)] rounded-sm bg-surface2 transition-transform duration-(--duration-base) ease-out-soft","events"===k&&"translate-x-full")}),["sessions","events"].map(a=>(0,b.jsx)("button",{onClick:()=>l(a),"aria-pressed":k===a,className:(0,f.cn)("relative px-3 py-1 transition-colors duration-(--duration-fast)",k===a?"text-txt":"text-muted hover:text-txt"),children:"sessions"===a?"Sessions":"All events"},a))]}),(0,b.jsxs)("div",{className:"flex items-center gap-1.5 text-xs font-mono text-teal",children:[(0,b.jsxs)("span",{className:"relative flex h-1.5 w-1.5",children:[d&&(0,b.jsx)("span",{className:"absolute inset-0 rounded-full bg-teal animate-ping"}),(0,b.jsx)("span",{className:"relative h-1.5 w-1.5 rounded-full bg-teal"})]}),"live"]})]})]}),t&&(0,b.jsx)("p",{className:"mb-4 rounded-md border border-danger/30 bg-danger/5 px-3 py-2 text-xs text-danger animate-fade-in",children:"Couldn't load sessions. Showing the last data we had; it retries on the next update."}),"sessions"===k&&null===o?(0,b.jsxs)("div",{className:"flex flex-col gap-3","aria-busy":"true","aria-label":"Loading sessions",children:[(0,b.jsx)("div",{className:"h-[76px] rounded-xl bg-surface animate-pulse"}),[0,1,2].map(a=>(0,b.jsx)("div",{className:"ml-[4.25rem] h-24 rounded-xl bg-surface animate-pulse",style:{animationDelay:`${120*a}ms`}},a))]}):x?(0,b.jsx)(q.EmptyState,{icon:"⚡",message:"No activity yet.",subMessage:"Connect an AI agent to see real-time updates here."}):"sessions"===k?(0,b.jsx)(p,{focusSessionId:j,sessions:o??[],events:v,onOpenTask:g,onOpenDoc:i},j??""):(0,b.jsx)(h,{activity:a})]})}var s=a.i(536236);function t(){let{activity:a,liveIndicator:f,rootParam:g,board:h,moveTask:i,openDoc:j}=(0,e.useApp)(),k=(0,d.useSearchParams)().get("session"),[l,m]=(0,c.useState)(null),n=h&&l&&Object.values(h).flat().find(a=>a.id===l)||null;return(0,b.jsxs)("div",{className:"relative flex-1",children:[(0,b.jsx)(r,{activity:a,liveIndicator:f,rootParam:g,onOpenTask:m,onOpenDoc:j,focusSessionId:k}),(0,b.jsx)(s.TaskDetailPanel,{task:n,onClose:()=>m(null),onMove:i})]})}a.s(["default",0,function(){return(0,b.jsx)(c.Suspense,{children:(0,b.jsx)(t,{})})}],136642)}];
1
+ module.exports=[136642,a=>{"use strict";var b=a.i(662145),c=a.i(174897),d=a.i(913975),e=a.i(544394),f=a.i(368114),g=a.i(578520),h=a.i(795667),i=a.i(892678),j=a.i(376847),k=a.i(156298),l=a.i(926128),m=a.i(471617),n=a.i(173628);let o={done:"bg-teal","in-progress":"bg-amber",review:"bg-accent",blocked:"bg-danger",todo:"bg-border2",cancelled:"bg-border2"},p="inline-flex max-w-full min-w-0 items-center gap-1.5 rounded-sm border border-border px-2 py-1 font-mono text-[11px] text-txt transition-colors duration-(--duration-fast) hover:border-border2 hover:bg-surface2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/60";function q({open:a,events:c}){return(0,b.jsx)("div",{className:(0,f.cn)("grid transition-[grid-template-rows,opacity] duration-(--duration-slow) ease-out-soft",a?"grid-rows-[1fr] opacity-100":"grid-rows-[0fr] opacity-0"),children:(0,b.jsx)("div",{className:"min-h-0 overflow-hidden",inert:!a,children:(0,b.jsx)("div",{className:"mt-3 border-t border-border pt-2",children:c.map(a=>(0,b.jsx)(g.ActivityEventRow,{event:a},a.id))})})})}function r({open:a}){return(0,b.jsx)(k.ChevronRight,{"aria-hidden":!0,className:(0,f.cn)("size-3.5 shrink-0 text-muted transition-transform duration-(--duration-base) ease-out-soft",a&&"rotate-90")})}function s({session:a,events:d,onOpenTask:e,onOpenDoc:g,focused:k=!1,live:t=!1}){let[u,v]=(0,c.useState)(k),w=(0,c.useRef)(null);(0,c.useEffect)(()=>{k&&w.current?.scrollIntoView({block:"center",behavior:"smooth"})},[k]);let x="ai"===a.actor,y=x?h.Bot:i.User,z=a.tasks.filter(a=>"done"===a.lastStatus).length,A=a.tasks.length+a.docs.length+a.decisions.length>0,B=`${a.eventCount} event${1===a.eventCount?"":"s"}`;if(!A)return(0,b.jsxs)("div",{ref:w,className:(0,f.cn)("min-w-0 rounded-md px-3 py-1.5 transition-colors duration-(--duration-fast) hover:bg-surface/60",k&&"bg-surface animate-flash"),children:[(0,b.jsxs)("button",{onClick:()=>v(a=>!a),"aria-expanded":u,className:"flex w-full min-w-0 items-center gap-2 text-left text-[13px] text-muted focus-visible:text-txt focus-visible:outline-none",children:[(0,b.jsx)(y,{className:"size-3.5 shrink-0","aria-label":x?"Agent":"Human"}),(0,b.jsx)("span",{className:"min-w-0 truncate",children:/^\d+ events?$/.test(a.headline)?"Connected, nothing changed":a.headline}),(0,b.jsxs)("span",{className:"ml-auto shrink-0 font-mono text-[11px]",children:[(0,j.sessionDuration)(a),(0,b.jsxs)("span",{className:"hidden sm:inline",children:[" · ",B]})]}),(0,b.jsx)(r,{open:u})]}),(0,b.jsx)(q,{open:u,events:d})]});return(0,b.jsx)("div",{ref:w,className:(0,f.cn)("min-w-0 rounded-lg border bg-surface transition-colors duration-(--duration-base) hover:border-border2",t?"border-accent/40":"border-border",k&&"border-accent/60 animate-flash"),children:(0,b.jsxs)("div",{className:"px-4 pt-3.5 pb-4",children:[(0,b.jsxs)("button",{onClick:()=>v(a=>!a),"aria-expanded":u,className:"group flex w-full min-w-0 items-center gap-2 text-left focus-visible:outline-none",children:[(0,b.jsx)(y,{className:"size-3.5 shrink-0 text-muted","aria-hidden":!0}),(0,b.jsx)("span",{className:"text-xs text-muted",children:x?"Agent":"Human"}),t&&(0,b.jsxs)("span",{className:"flex items-center gap-1 font-mono text-[10px] text-accent",children:[(0,b.jsx)("span",{className:"size-1.5 rounded-full bg-accent animate-pulse-dot"}),"working"]}),(0,b.jsxs)("span",{className:"ml-auto shrink-0 font-mono text-[11px] text-muted",children:[(0,j.sessionDuration)(a)," · ",B]}),(0,b.jsx)("span",{className:"flex items-center gap-1 text-[11px] text-muted group-hover:text-txt group-focus-visible:text-txt",children:(0,b.jsx)(r,{open:u})})]}),(0,b.jsx)("p",{className:"mt-1.5 text-[15px] leading-snug font-semibold text-txt",children:a.headline}),a.tasks.length>0&&(0,b.jsxs)("div",{className:"mt-3 flex items-center gap-3",children:[(0,b.jsx)("div",{className:"flex flex-1 gap-0.5",role:"img","aria-label":`${z} of ${a.tasks.length} tasks done`,children:a.tasks.map(a=>(0,b.jsx)("span",{className:(0,f.cn)("h-1 flex-1 rounded-full",o[a.lastStatus]??"bg-border2")},a.id))}),(0,b.jsxs)("span",{className:"font-mono text-[11px] text-muted tabular-nums",children:[(0,b.jsx)("span",{className:"text-txt",children:z}),"/",a.tasks.length]})]}),(0,b.jsxs)("div",{className:"mt-3 flex flex-wrap gap-1.5",children:[a.tasks.map(a=>(0,b.jsxs)("button",{onClick:()=>e(a.id),className:p,title:`${a.id} → ${n.STATUS_META[a.lastStatus]?.label??a.lastStatus}`,children:[(0,b.jsx)(n.StatusIcon,{status:a.lastStatus,className:"size-3"}),a.id]},a.id)),a.docs.map(a=>(0,b.jsxs)("button",{onClick:()=>g(a),className:p,title:a,children:[(0,b.jsx)(l.FileText,{className:"size-3 shrink-0 text-muted","aria-hidden":!0}),(0,b.jsx)("span",{className:"truncate",children:a.split("/").pop()})]},a)),a.decisions.map(a=>{let[c,...d]=a.split(":");return(0,b.jsxs)("button",{onClick:()=>g(c),className:(0,f.cn)(p,"font-sans text-xs"),title:a,children:[(0,b.jsx)(m.Scale,{className:"size-3 shrink-0 text-muted","aria-hidden":!0}),(0,b.jsx)("span",{className:"shrink-0 font-mono text-[11px] whitespace-nowrap",children:c}),d.length>0&&(0,b.jsx)("span",{className:"truncate text-muted",children:d.join(":").trim()})]},a)})]}),(0,b.jsx)(q,{open:u,events:d})]})})}function t(a){let b=new Date(a),c=new Date,d=new Date(c);return(d.setDate(c.getDate()-1),b.toDateString()===c.toDateString())?"Today":b.toDateString()===d.toDateString()?"Yesterday":b.toLocaleDateString(void 0,{weekday:"short",month:"short",day:"numeric"})}function u({label:a}){return(0,b.jsxs)("h2",{className:"sticky top-0 z-10 -mx-1 mt-4 mb-1 flex items-center gap-3 bg-bg/90 px-1 py-2 backdrop-blur-sm first:mt-0",children:[(0,b.jsx)("span",{className:"text-[13px] font-semibold text-txt",children:a}),(0,b.jsx)("span",{className:"h-px flex-1 bg-border","aria-hidden":!0})]})}function v({sessions:a,events:d,onOpenTask:e,onOpenDoc:k,focusSessionId:l}){let[m,n]=(0,c.useState)("all"),[o,p]=(0,c.useState)(()=>Date.now());(0,c.useEffect)(()=>{let a=setInterval(()=>p(Date.now()),3e4);return()=>clearInterval(a)},[]);let q={all:a.length,ai:a.filter(a=>"ai"===a.actor).length,human:a.filter(a=>"human"===a.actor).length},r="all"===m?a:a.filter(a=>a.actor===m);return(0,b.jsxs)("div",{children:[(0,b.jsx)("div",{className:"mb-3 flex items-center gap-1 text-xs",role:"group","aria-label":"Filter by actor",children:["all","ai","human"].map(a=>{let c="ai"===a?h.Bot:"human"===a?i.User:null;return(0,b.jsxs)("button",{"aria-pressed":m===a,onClick:()=>n(a),className:(0,f.cn)("flex items-center gap-1.5 rounded-md px-2.5 py-1 transition-colors duration-(--duration-fast) focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/60",m===a?"bg-surface2 text-txt":"text-muted hover:text-txt"),children:[c&&(0,b.jsx)(c,{className:"size-3.5","aria-hidden":!0}),"all"===a?"All":"ai"===a?"Agent":"Human",(0,b.jsx)("span",{className:"font-mono text-[11px] text-muted tabular-nums",children:q[a]})]},a)})}),0===r.length?(0,b.jsxs)("p",{className:"py-10 text-center text-sm text-muted",children:["No ","ai"===m?"agent":"human"," sessions yet."]}):(0,b.jsxs)("ol",{className:"relative",children:[(0,b.jsx)("div",{className:"absolute left-[3.5rem] top-10 bottom-2 w-px bg-border","aria-hidden":!0}),r.map((a,c)=>{let h=t(a.start),i=0===c||t(r[c-1].start)!==h,m=(0,j.isLive)(a,o),n=a.tasks.length+a.docs.length+a.decisions.length===0;return(0,b.jsxs)("li",{className:"animate-fade-in",style:{animationDelay:`${45*Math.min(c,8)}ms`,animationFillMode:"both"},children:[i&&(0,b.jsx)(u,{label:h}),(0,b.jsxs)("div",{className:(0,f.cn)("grid grid-cols-[2.75rem_1.5rem_minmax(0,1fr)] items-start",n?"pb-1":"py-2"),children:[(0,b.jsx)("time",{dateTime:a.start,className:(0,f.cn)("text-right font-mono text-[11px] tabular-nums",n?"pt-2 text-muted":"pt-4 text-txt"),title:new Date(a.start).toLocaleString(),children:(0,g.clock)(a.start)}),(0,b.jsx)("span",{className:(0,f.cn)("flex justify-center",n?"pt-[0.8rem]":"pt-[1.15rem]"),"aria-hidden":!0,children:(0,b.jsx)("span",{className:(0,f.cn)("relative z-[1] rounded-full ring-4 ring-bg",n?"size-1.5 bg-border2":"size-2.5",!n&&("ai"===a.actor?"bg-accent":"bg-muted"),m&&"animate-pulse-dot")})}),(0,b.jsx)(s,{session:a,events:a.eventIds.flatMap(a=>d.get(a)??[]),onOpenTask:e,onOpenDoc:k,focused:a.id===l,live:m})]})]},a.id)})]})]})}function w({activity:a}){return(0,b.jsx)("ol",{className:"flex flex-col",children:a.map((c,d)=>{let e=t(c.timestamp);return(0,b.jsxs)("li",{children:[(0===d||t(a[d-1].timestamp)!==e)&&(0,b.jsx)(u,{label:e}),(0,b.jsx)(g.ActivityEventRow,{event:c,showActor:!0})]},c.id)})})}var x=a.i(192676);function y({sessions:a}){let[d,e]=(0,c.useState)(()=>Date.now());(0,c.useEffect)(()=>{let a=setInterval(()=>e(Date.now()),6e4);return()=>clearInterval(a)},[]);let f=(0,j.catchUp)(a,d-864e5),g=[[f.tasksDone,"task","done"],[f.decisions,"ADR","logged"],[f.docs,"doc","changed"],[f.sessions,"session",""]].filter(([a])=>a>0);return g.length?(0,b.jsxs)(b.Fragment,{children:[g.map(([a,c,d],e)=>(0,b.jsxs)("span",{children:[e>0&&(0,b.jsx)("span",{className:"text-muted",children:" · "}),(0,b.jsx)("span",{className:"font-mono tabular-nums",children:a})," ",c,1===a?"":"s",d&&` ${d}`]},c)),(0,b.jsx)("span",{className:"font-normal text-muted",children:" in the last 24h"})]}):(0,b.jsx)(b.Fragment,{children:"Quiet for the last 24 hours"})}function z({activity:a,rootParam:d,onOpenTask:e,onOpenDoc:g,focusSessionId:h}){let[i,j]=(0,c.useState)("sessions"),[k,l]=(0,c.useState)(h);h!==k&&(l(h),h&&j("sessions"));let[m,n]=(0,c.useState)(null),[o,p]=(0,c.useState)(!1),[q,r]=(0,c.useState)(new Map);(0,c.useEffect)(()=>{let a=d?`${d}&`:"?",b=()=>Promise.all([fetch(`/api/sessions${d}`).then(a=>a.json()),fetch(`/api/activity${a}limit=2000`).then(a=>a.json())]).then(([a,b])=>{p(!1),n(Array.isArray(a)?a:[]),r(new Map((Array.isArray(b)?b:[]).map(a=>[a.id,a])))}).catch(()=>{p(!0),n(a=>a??[])});return b(),window.addEventListener("vibedoc:sse",b),()=>window.removeEventListener("vibedoc:sse",b)},[d]);let s="sessions"===i?m?.length===0:0===a.length;return(0,b.jsxs)("div",{className:"mx-auto flex max-w-4xl flex-col px-6 py-8",children:[(0,b.jsxs)("header",{className:"mb-6 flex flex-wrap items-end gap-x-6 gap-y-4 border-b border-border pb-5",children:[(0,b.jsxs)("div",{className:"min-w-0 flex-1 basis-full sm:basis-0",children:[(0,b.jsx)("h1",{className:"text-[1.6rem] leading-tight font-semibold tracking-[-0.02em] text-txt",children:"Activity"}),(0,b.jsx)("p",{className:"mt-2 text-[1.1rem] leading-snug font-semibold text-txt",children:null===m?(0,b.jsx)("span",{className:"text-muted",children:"Loading…"}):(0,b.jsx)(y,{sessions:m})}),(0,b.jsxs)("p",{className:"mt-1 text-sm text-muted",children:["Everything agents and you changed, read from ",(0,b.jsx)("code",{className:"font-mono text-[0.9em]",children:".vibedoc-activity.json"}),"."]})]}),(0,b.jsxs)("div",{className:"relative grid grid-cols-2 rounded-md border border-border p-0.5 text-xs",role:"group","aria-label":"View",children:[(0,b.jsx)("span",{"aria-hidden":!0,className:(0,f.cn)("absolute inset-y-0.5 left-0.5 w-[calc(50%-2px)] rounded-sm bg-surface2 transition-transform duration-(--duration-base) ease-out-soft","events"===i&&"translate-x-full")}),["sessions","events"].map(a=>(0,b.jsx)("button",{onClick:()=>j(a),"aria-pressed":i===a,className:(0,f.cn)("relative rounded-sm px-3 py-1 transition-colors duration-(--duration-fast) focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/60",i===a?"text-txt":"text-muted hover:text-txt"),children:"sessions"===a?"Sessions":"All events"},a))]})]}),o&&(0,b.jsx)("p",{className:"mb-4 rounded-md border border-danger/30 bg-danger/5 px-3 py-2 text-xs text-danger animate-fade-in",children:"Couldn't load sessions. Showing the last data we had; it retries on the next update."}),"sessions"===i&&null===m?(0,b.jsx)("div",{className:"flex flex-col gap-3","aria-busy":"true","aria-label":"Loading sessions",children:[0,1,2].map(a=>(0,b.jsx)("div",{className:"ml-[4.25rem] h-24 rounded-lg bg-surface animate-pulse",style:{animationDelay:`${120*a}ms`}},a))}):s?(0,b.jsxs)("div",{className:"flex flex-col items-start gap-2 rounded-lg border border-dashed border-border2 p-6 animate-fade-in",children:[(0,b.jsx)(x.Activity,{className:"size-5 text-muted","aria-hidden":!0}),(0,b.jsx)("p",{className:"text-sm text-txt",children:"No activity yet"}),(0,b.jsx)("p",{className:"max-w-lg text-xs leading-relaxed text-muted",children:"Moves on the board and every agent call through the MCP server show up here as they happen. Use Connect in the header to hook up Claude Code or Cursor."})]}):"sessions"===i?(0,b.jsx)(v,{focusSessionId:h,sessions:m??[],events:q,onOpenTask:e,onOpenDoc:g},h??""):(0,b.jsx)(w,{activity:a})]})}var A=a.i(536236);function B(){let{activity:a,rootParam:f,board:g,moveTask:h,openDoc:i}=(0,e.useApp)(),j=(0,d.useSearchParams)().get("session"),[k,l]=(0,c.useState)(null),m=g&&k&&Object.values(g).flat().find(a=>a.id===k)||null;return(0,b.jsxs)("div",{className:"relative flex-1",children:[(0,b.jsx)(z,{activity:a,rootParam:f,onOpenTask:l,onOpenDoc:i,focusSessionId:j}),(0,b.jsx)(A.TaskDetailPanel,{task:m,onClose:()=>l(null),onMove:h})]})}a.s(["default",0,function(){return(0,b.jsx)(c.Suspense,{children:(0,b.jsx)(B,{})})}],136642)}];
2
2
 
3
3
  //# sourceMappingURL=src_app_%28app%29_activity_page_tsx_13jd6bn._.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/app/%28app%29/activity/page.tsx","../../../../src/components/activity/ActivityTab.tsx","../../../../src/components/activity/ActivityFeed.tsx","../../../../src/lib/sessions.ts","../../../../src/components/activity/SessionCard.tsx","../../../../src/components/activity/SessionTimeline.tsx"],"sourcesContent":["\"use client\"\r\n\r\nimport { Suspense, useState } from \"react\"\r\nimport { useSearchParams } from \"next/navigation\"\r\nimport { useApp } from \"@/context/AppContext\"\r\nimport { ActivityTab } from \"@/components/activity/ActivityTab\"\r\nimport { TaskDetailPanel } from \"@/components/board/TaskDetailPanel\"\r\n\r\nfunction ActivityContent() {\r\n const { activity, liveIndicator, rootParam, board, moveTask, openDoc } = useApp()\r\n const focusSessionId = useSearchParams().get(\"session\")\r\n const [taskId, setTaskId] = useState<string | null>(null)\r\n // Derive from the board so the panel reflects moves made while it is open\r\n const task = (board && taskId && Object.values(board).flat().find(t => t.id === taskId)) || null\r\n\r\n return (\r\n <div className=\"relative flex-1\">\r\n <ActivityTab\r\n activity={activity}\r\n liveIndicator={liveIndicator}\r\n rootParam={rootParam}\r\n onOpenTask={setTaskId}\r\n onOpenDoc={openDoc}\r\n focusSessionId={focusSessionId}\r\n />\r\n <TaskDetailPanel task={task} onClose={() => setTaskId(null)} onMove={moveTask} />\r\n </div>\r\n )\r\n}\r\n\r\nexport default function ActivityPage() {\r\n return (\r\n <Suspense>\r\n <ActivityContent />\r\n </Suspense>\r\n )\r\n}\r\n","\"use client\"\r\n\r\nimport { useEffect, useState } from \"react\"\r\nimport type { ActivityEvent, Session } from \"@/types\"\r\nimport { cn } from \"@/lib/utils\"\r\nimport { ActivityFeed } from \"./ActivityFeed\"\r\nimport { SessionTimeline } from \"./SessionTimeline\"\r\nimport { EmptyState } from \"@/components/shared/EmptyState\"\r\n\r\ninterface ActivityTabProps {\r\n activity: ActivityEvent[]\r\n liveIndicator: boolean\r\n rootParam: string\r\n onOpenTask: (taskId: string) => void\r\n onOpenDoc: (path: string) => void\r\n focusSessionId?: string | null\r\n}\r\n\r\nexport function ActivityTab({ activity, liveIndicator, rootParam, onOpenTask, onOpenDoc, focusSessionId }: ActivityTabProps) {\r\n const [view, setView] = useState<\"sessions\" | \"events\">(\"sessions\")\r\n // A new focus target (from a task's Sessions list) always lands on the Sessions view\r\n const [lastFocus, setLastFocus] = useState(focusSessionId)\r\n if (focusSessionId !== lastFocus) {\r\n setLastFocus(focusSessionId)\r\n if (focusSessionId) setView(\"sessions\")\r\n }\r\n const [sessions, setSessions] = useState<Session[] | null>(null) // null = first load\r\n const [failed, setFailed] = useState(false)\r\n const [events, setEvents] = useState<Map<string, ActivityEvent>>(new Map())\r\n\r\n // Refetch on every SSE event (AppContext re-dispatches them as `vibedoc:sse`), not only the ones that refresh `activity`.\r\n useEffect(() => {\r\n const qs = rootParam ? `${rootParam}&` : \"?\"\r\n const load = () => Promise.all([\r\n fetch(`/api/sessions${rootParam}`).then(r => r.json()),\r\n fetch(`/api/activity${qs}limit=2000`).then(r => r.json()),\r\n ])\r\n .then(([ses, evs]) => {\r\n setFailed(false)\r\n setSessions(Array.isArray(ses) ? ses : [])\r\n setEvents(new Map((Array.isArray(evs) ? evs as ActivityEvent[] : []).map(e => [e.id, e])))\r\n })\r\n .catch(() => { setFailed(true); setSessions(prev => prev ?? []) })\r\n load()\r\n window.addEventListener(\"vibedoc:sse\", load)\r\n return () => window.removeEventListener(\"vibedoc:sse\", load)\r\n }, [rootParam])\r\n\r\n const empty = view === \"sessions\" ? sessions?.length === 0 : activity.length === 0\r\n\r\n return (\r\n <div className=\"p-6 max-w-3xl\">\r\n <div className=\"flex items-center justify-between mb-6\">\r\n <h1 className=\"font-display text-xl font-semibold tracking-tight\">Activity</h1>\r\n <div className=\"flex items-center gap-4\">\r\n {/* Segmented toggle with a sliding pill */}\r\n <div className=\"relative grid grid-cols-2 rounded-md border border-border p-0.5 text-xs\">\r\n <span\r\n aria-hidden\r\n className={cn(\r\n \"absolute inset-y-0.5 left-0.5 w-[calc(50%-2px)] rounded-sm bg-surface2 transition-transform duration-(--duration-base) ease-out-soft\",\r\n view === \"events\" && \"translate-x-full\",\r\n )}\r\n />\r\n {([\"sessions\", \"events\"] as const).map(v => (\r\n <button\r\n key={v}\r\n onClick={() => setView(v)}\r\n aria-pressed={view === v}\r\n className={cn(\"relative px-3 py-1 transition-colors duration-(--duration-fast)\", view === v ? \"text-txt\" : \"text-muted hover:text-txt\")}\r\n >\r\n {v === \"sessions\" ? \"Sessions\" : \"All events\"}\r\n </button>\r\n ))}\r\n </div>\r\n {/* Pings when an SSE event lands */}\r\n <div className=\"flex items-center gap-1.5 text-xs font-mono text-teal\">\r\n <span className=\"relative flex h-1.5 w-1.5\">\r\n {liveIndicator && <span className=\"absolute inset-0 rounded-full bg-teal animate-ping\" />}\r\n <span className=\"relative h-1.5 w-1.5 rounded-full bg-teal\" />\r\n </span>\r\n live\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {failed && (\r\n <p className=\"mb-4 rounded-md border border-danger/30 bg-danger/5 px-3 py-2 text-xs text-danger animate-fade-in\">\r\n Couldn&apos;t load sessions. Showing the last data we had; it retries on the next update.\r\n </p>\r\n )}\r\n\r\n {view === \"sessions\" && sessions === null ? (\r\n <div className=\"flex flex-col gap-3\" aria-busy=\"true\" aria-label=\"Loading sessions\">\r\n <div className=\"h-[76px] rounded-xl bg-surface animate-pulse\" />\r\n {[0, 1, 2].map(i => (\r\n <div key={i} className=\"ml-[4.25rem] h-24 rounded-xl bg-surface animate-pulse\" style={{ animationDelay: `${i * 120}ms` }} />\r\n ))}\r\n </div>\r\n ) : empty ? (\r\n <EmptyState\r\n icon=\"⚡\"\r\n message=\"No activity yet.\"\r\n subMessage=\"Connect an AI agent to see real-time updates here.\"\r\n />\r\n ) : view === \"sessions\" ? (\r\n <SessionTimeline key={focusSessionId ?? \"\"} focusSessionId={focusSessionId} sessions={sessions ?? []} events={events} onOpenTask={onOpenTask} onOpenDoc={onOpenDoc} />\r\n ) : (\r\n <ActivityFeed activity={activity} />\r\n )}\r\n </div>\r\n )\r\n}\r\n","import type { ActivityEvent } from \"@/types\"\r\nimport { ActivityEventRow } from \"./ActivityEventRow\"\r\n\r\ninterface ActivityFeedProps {\r\n activity: ActivityEvent[]\r\n}\r\n\r\nexport function ActivityFeed({ activity }: ActivityFeedProps) {\r\n return (\r\n <div className=\"relative\">\r\n <div className=\"absolute left-4 top-0 bottom-0 w-px bg-border\" />\r\n <div className=\"flex flex-col gap-0\">\r\n {activity.map((evt) => (\r\n <ActivityEventRow key={evt.id} event={evt} />\r\n ))}\r\n </div>\r\n </div>\r\n )\r\n}\r\n","/**\n * src/lib/sessions.ts\n * Pure grouping of the activity log into agent/human sessions (no fs). Used by /api/sessions and /api/mcp.\n * Stamped events group by `sessionId`; legacy events (no sessionId) split on a per-actor idle gap or `session_start`.\n */\nimport type { ActivityEvent, TaskStatus } from './core'\n\nexport const SESSION_GAP_MS = 30 * 60 * 1000\n\nexport interface Session {\n id: string\n actor: ActivityEvent['actor']\n start: string\n end: string\n eventCount: number\n eventIds: string[]\n tasks: { id: string; lastStatus: TaskStatus }[]\n docs: string[]\n decisions: string[]\n memoryUpdated: boolean\n headline: string\n}\n\n// Doc path a change event carries; null for events that don't change a doc (doc_read included).\nfunction changedDoc(e: ActivityEvent): string | null {\n switch (e.type) {\n case 'doc_created': return e.detail ?? e.title.replace(/^Created: /, '')\n case 'doc_deleted': return e.title.replace(/^Deleted /, '')\n case 'doc_renamed': return e.title.split(' → ')[1] ?? null\n default: return null\n }\n}\n\nconst plural = (n: number, word: string) => `${n} ${word}${n === 1 ? '' : 's'}`\n\nfunction summarize(id: string, events: ActivityEvent[]): Session {\n const tasks = new Map<string, TaskStatus>()\n const docs = new Set<string>()\n const decisions: string[] = []\n let memoryUpdated = false\n let roadmapEdits = 0\n for (const e of events) {\n if (e.type === 'task_updated' && e.taskId && e.taskStatus) tasks.set(e.taskId, e.taskStatus)\n const doc = changedDoc(e)\n if (doc) docs.add(doc)\n if (e.type === 'decision_logged') decisions.push(e.title)\n if (e.type === 'memory_updated') memoryUpdated = true\n if (e.type === 'roadmap_updated') roadmapEdits++\n }\n const taskList = [...tasks].map(([tid, lastStatus]) => ({ id: tid, lastStatus }))\n const done = taskList.filter(t => t.lastStatus === 'done').length\n const parts = [\n taskList.length ? `${plural(taskList.length, 'task')} moved${done ? ` (${done} done)` : ''}` : '',\n docs.size ? `${plural(docs.size, 'doc')} changed` : '',\n decisions.length ? plural(decisions.length, 'ADR') : '',\n roadmapEdits ? plural(roadmapEdits, 'roadmap edit') : '',\n memoryUpdated ? 'memory updated' : '',\n ].filter(Boolean)\n return {\n id,\n actor: events[0].actor,\n start: events[0].timestamp,\n end: events[events.length - 1].timestamp,\n eventCount: events.length,\n eventIds: events.map(e => e.id),\n tasks: taskList,\n docs: [...docs],\n decisions,\n memoryUpdated,\n headline: parts.join(' · ') || plural(events.length, 'event'),\n }\n}\n\n/** Events may come in any order (the log is newest-first). Returns sessions newest first. */\nexport function groupSessions(events: ActivityEvent[], opts: { gapMs?: number } = {}): Session[] {\n const gapMs = opts.gapMs ?? SESSION_GAP_MS\n const chrono = [...events].sort((a, b) => a.timestamp.localeCompare(b.timestamp))\n const groups = new Map<string, ActivityEvent[]>()\n const legacy = new Map<string, { id: string; lastAt: number }>() // per actor\n for (const e of chrono) {\n let id = e.sessionId\n if (!id) {\n const at = Date.parse(e.timestamp)\n let cur = legacy.get(e.actor)\n if (!cur || e.type === 'session_start' || at - cur.lastAt > gapMs) {\n cur = { id: `legacy_${e.id}`, lastAt: at }\n legacy.set(e.actor, cur)\n }\n cur.lastAt = at\n id = cur.id\n }\n const g = groups.get(id)\n if (g) g.push(e)\n else groups.set(id, [e])\n }\n return [...groups]\n .map(([id, evs]) => summarize(id, evs))\n .sort((a, b) => b.start.localeCompare(a.start))\n}\n\nexport function sessionDuration(s: Pick<Session, 'start' | 'end'>): string {\n const min = Math.round((Date.parse(s.end) - Date.parse(s.start)) / 60_000)\n if (min < 1) return '<1m'\n return min < 60 ? `${min}m` : `${Math.floor(min / 60)}h ${min % 60}m`\n}\n\n/** A session still receiving events (last one within `windowMs`). */\nexport function isLive(s: Pick<Session, 'end'>, now = Date.now(), windowMs = 5 * 60 * 1000): boolean {\n return now - Date.parse(s.end) < windowMs\n}\n\n/** Totals for the \"catch up\" strip: sessions that ended at or after `sinceMs`. */\nexport function catchUp(sessions: Session[], sinceMs: number) {\n const recent = sessions.filter(s => Date.parse(s.end) >= sinceMs)\n return {\n sessions: recent.length,\n tasksDone: new Set(recent.flatMap(s => s.tasks.filter(t => t.lastStatus === 'done').map(t => t.id))).size,\n docs: new Set(recent.flatMap(s => s.docs)).size,\n decisions: recent.reduce((n, s) => n + s.decisions.length, 0),\n }\n}\n\nexport function sessionsForTask(sessions: Session[], taskId: string): Session[] {\n return sessions.filter(s => s.tasks.some(t => t.id === taskId))\n}\n","\"use client\"\n\nimport { useEffect, useRef, useState } from \"react\"\nimport type { ActivityEvent, Session } from \"@/types\"\nimport { cn } from \"@/lib/utils\"\nimport { sessionDuration } from \"@/lib/sessions\"\nimport { ActivityEventRow } from \"./ActivityEventRow\"\n\nconst STATUS_DOT: Record<string, string> = {\n done: \"bg-teal\",\n \"in-progress\": \"bg-amber\",\n blocked: \"bg-danger\",\n todo: \"bg-muted\",\n cancelled: \"bg-border2\",\n}\n\nconst chip =\n \"inline-flex max-w-full items-center gap-1.5 truncate rounded-md border border-border bg-bg/40 px-2 py-1 text-xs font-mono text-txt transition-[border-color,background-color,transform] duration-(--duration-fast) ease-out-soft hover:-translate-y-px hover:border-border2 hover:bg-surface2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/60\"\n\ninterface SessionCardProps {\n session: Session\n events: ActivityEvent[]\n onOpenTask: (taskId: string) => void\n onOpenDoc: (path: string) => void\n focused?: boolean\n live?: boolean\n}\n\n/** Expandable body shared by cards and quiet rows: grid-rows 0fr↔1fr animates height without measuring. */\nfunction EventList({ open, events }: { open: boolean; events: ActivityEvent[] }) {\n return (\n <div className={cn(\"grid transition-[grid-template-rows,opacity] duration-(--duration-slow) ease-out-soft\", open ? \"grid-rows-[1fr] opacity-100\" : \"grid-rows-[0fr] opacity-0\")}>\n <div className=\"min-h-0 overflow-hidden\" inert={!open}>\n <div className=\"relative mt-4 border-t border-border pt-4\">\n <div className=\"absolute left-4 top-4 bottom-0 w-px bg-border\" />\n {events.map(e => <ActivityEventRow key={e.id} event={e} />)}\n </div>\n </div>\n </div>\n )\n}\n\nfunction Chevron({ open }: { open: boolean }) {\n return (\n <span className={cn(\"inline-block text-muted transition-transform duration-(--duration-base) ease-out-soft\", open && \"rotate-90\")} aria-hidden>\n ▸\n </span>\n )\n}\n\nexport function SessionCard({ session, events, onOpenTask, onOpenDoc, focused = false, live = false }: SessionCardProps) {\n const [open, setOpen] = useState(focused)\n const ref = useRef<HTMLDivElement>(null)\n useEffect(() => {\n if (focused) ref.current?.scrollIntoView({ block: \"center\", behavior: \"smooth\" })\n }, [focused])\n\n const isAgent = session.actor === \"ai\"\n const done = session.tasks.filter(t => t.lastStatus === \"done\").length\n const hasLinks = session.tasks.length + session.docs.length + session.decisions.length > 0\n const meta = `${sessionDuration(session)} · ${session.eventCount} event${session.eventCount === 1 ? \"\" : \"s\"}`\n\n // Quiet sessions (only roadmap edits, reads, session starts) collapse to one line so real work stands out.\n if (!hasLinks) {\n return (\n <div ref={ref} className={cn(\"rounded-lg px-3 py-2 transition-colors duration-(--duration-fast) hover:bg-surface/60\", focused && \"bg-surface animate-flash\")}>\n <button onClick={() => setOpen(o => !o)} aria-expanded={open} className=\"flex w-full items-center gap-2 text-left text-sm text-muted\">\n <span>{isAgent ? \"🤖\" : \"👤\"}</span>\n <span className=\"truncate\">{session.headline}</span>\n <span className=\"ml-auto shrink-0 font-mono text-xs text-muted/70\">{meta}</span>\n <Chevron open={open} />\n </button>\n <EventList open={open} events={events} />\n </div>\n )\n }\n\n return (\n <div\n ref={ref}\n className={cn(\n \"group rounded-xl border bg-surface p-4 transition-[border-color,transform,box-shadow] duration-(--duration-base) ease-out-soft hover:-translate-y-0.5 hover:border-border2 hover:shadow-lg hover:shadow-black/20\",\n live ? \"border-accent/40\" : \"border-border\",\n focused && \"border-accent/60 animate-flash\",\n )}\n >\n <button onClick={() => setOpen(o => !o)} aria-expanded={open} className=\"flex w-full items-center gap-2 text-left text-xs\">\n <span className={cn(\"font-medium\", isAgent ? \"text-accent\" : \"text-txt\")}>{isAgent ? \"🤖 Agent\" : \"👤 Human\"}</span>\n {live && (\n <span className=\"flex items-center gap-1 rounded-full bg-accent/10 px-1.5 py-0.5 font-mono text-[10px] uppercase tracking-wide text-accent\">\n <span className=\"h-1.5 w-1.5 rounded-full bg-accent animate-pulse-dot\" />\n live\n </span>\n )}\n <span className=\"ml-auto font-mono text-muted\">{meta}</span>\n <Chevron open={open} />\n </button>\n\n <p className=\"mt-2 text-[15px] font-medium leading-snug text-txt\">{session.headline}</p>\n\n {session.tasks.length > 0 && (\n <div className=\"mt-3 flex items-center gap-2\" title={`${done} of ${session.tasks.length} tasks done`}>\n <div className=\"h-1 flex-1 overflow-hidden rounded-full bg-surface2\">\n <div\n className=\"h-full origin-left rounded-full bg-teal animate-grow-x transition-[width] duration-(--duration-slow) ease-out-soft\"\n style={{ width: `${(done / session.tasks.length) * 100}%` }}\n />\n </div>\n <span className=\"font-mono text-[11px] text-muted\">{done}/{session.tasks.length}</span>\n </div>\n )}\n\n <div className=\"mt-3 flex flex-wrap gap-1.5\">\n {session.tasks.map(t => (\n <button key={t.id} onClick={() => onOpenTask(t.id)} className={chip} title={`${t.id} → ${t.lastStatus}`}>\n <span className={cn(\"h-1.5 w-1.5 shrink-0 rounded-full\", STATUS_DOT[t.lastStatus])} />\n {t.id}\n <span className=\"text-muted\">{t.lastStatus}</span>\n </button>\n ))}\n {session.docs.map(d => (\n <button key={d} onClick={() => onOpenDoc(d)} className={chip} title={d}>\n 📄 {d.split(\"/\").pop()}\n </button>\n ))}\n {session.decisions.map(d => (\n <button key={d} onClick={() => onOpenDoc(d.split(\":\")[0])} className={cn(chip, \"text-accent\")} title={d}>\n 📝 {d}\n </button>\n ))}\n </div>\n\n <EventList open={open} events={events} />\n </div>\n )\n}\n","\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport type { ActivityEvent, Session } from \"@/types\"\nimport { cn } from \"@/lib/utils\"\nimport { catchUp, isLive } from \"@/lib/sessions\"\nimport { SessionCard } from \"./SessionCard\"\n\nconst DAY_MS = 24 * 60 * 60 * 1000\n\nfunction dayLabel(ts: string): string {\n const d = new Date(ts)\n const today = new Date()\n const yesterday = new Date(today)\n yesterday.setDate(today.getDate() - 1)\n if (d.toDateString() === today.toDateString()) return \"Today\"\n if (d.toDateString() === yesterday.toDateString()) return \"Yesterday\"\n return d.toLocaleDateString(undefined, { weekday: \"short\", month: \"short\", day: \"numeric\" })\n}\n\nconst clock = (ts: string) => new Date(ts).toLocaleTimeString(undefined, { hour: \"2-digit\", minute: \"2-digit\", hourCycle: \"h23\" })\n\nfunction Stat({ value, label, tone }: { value: number; label: string; tone?: string }) {\n return (\n <div className=\"min-w-0\">\n <p className={cn(\"font-display text-2xl font-semibold tabular-nums leading-none\", value ? tone ?? \"text-txt\" : \"text-muted/50\")}>{value}</p>\n <p className=\"mt-1.5 text-xs text-muted\">{label}</p>\n </div>\n )\n}\n\ntype ActorFilter = \"all\" | \"ai\" | \"human\"\n\ninterface SessionTimelineProps {\n sessions: Session[]\n events: Map<string, ActivityEvent>\n onOpenTask: (taskId: string) => void\n onOpenDoc: (path: string) => void\n focusSessionId?: string | null\n}\n\nexport function SessionTimeline({ sessions, events, onOpenTask, onOpenDoc, focusSessionId }: SessionTimelineProps) {\n const [actor, setActor] = useState<ActorFilter>(\"all\")\n // Ticking clock: expires \"live\" badges and keeps the 24h window honest without new events\n const [now, setNow] = useState(() => Date.now())\n useEffect(() => {\n const t = setInterval(() => setNow(Date.now()), 30_000)\n return () => clearInterval(t)\n }, [])\n const day = catchUp(sessions, now - DAY_MS)\n const counts = { all: sessions.length, ai: sessions.filter(s => s.actor === \"ai\").length, human: sessions.filter(s => s.actor === \"human\").length }\n const shown = actor === \"all\" ? sessions : sessions.filter(s => s.actor === actor)\n\n return (\n <div>\n {/* Catch-up: the one-read answer to \"what happened while I was away?\" */}\n <section className=\"mb-6 grid grid-cols-2 gap-5 rounded-xl border border-border bg-surface px-5 py-4 animate-fade-in sm:grid-cols-4\">\n <Stat value={day.sessions} label=\"sessions · 24h\" />\n <Stat value={day.tasksDone} label=\"tasks done\" tone=\"text-teal\" />\n <Stat value={day.docs} label=\"docs changed\" />\n <Stat value={day.decisions} label=\"ADRs logged\" tone=\"text-accent\" />\n </section>\n\n <div className=\"mb-4 flex items-center gap-1 text-xs\" role=\"tablist\" aria-label=\"Filter by actor\">\n {([\"all\", \"ai\", \"human\"] as const).map(a => (\n <button\n key={a}\n role=\"tab\"\n aria-selected={actor === a}\n onClick={() => setActor(a)}\n className={cn(\n \"rounded-full px-3 py-1 transition-colors duration-(--duration-fast)\",\n actor === a ? \"bg-surface2 text-txt\" : \"text-muted hover:text-txt\",\n )}\n >\n {a === \"all\" ? \"All\" : a === \"ai\" ? \"🤖 Agent\" : \"👤 Human\"}\n <span className=\"ml-1.5 font-mono text-muted\">{counts[a]}</span>\n </button>\n ))}\n </div>\n\n {shown.length === 0 ? (\n <p className=\"py-10 text-center text-sm text-muted\">No {actor === \"ai\" ? \"agent\" : \"human\"} sessions yet.</p>\n ) : (\n <ol className=\"relative\">\n {/* Rail runs behind the dots, between the clock gutter and the cards */}\n <div className=\"absolute left-[3.5rem] top-2 bottom-2 w-px bg-border\" aria-hidden />\n {shown.map((s, i) => {\n const label = dayLabel(s.start)\n const showDay = i === 0 || dayLabel(shown[i - 1].start) !== label\n const live = isLive(s, now)\n // Matches SessionCard's one-line layout for sessions with nothing to link\n const quiet = s.tasks.length + s.docs.length + s.decisions.length === 0\n return (\n <li\n key={s.id}\n className=\"animate-fade-in\"\n style={{ animationDelay: `${Math.min(i, 8) * 45}ms`, animationFillMode: \"both\" }}\n >\n {showDay && (\n <p className=\"sticky top-0 z-10 -mx-1 mb-2 bg-bg/90 px-1 py-2 text-xs font-mono uppercase tracking-wide text-muted backdrop-blur-sm\">\n {label}\n </p>\n )}\n <div className=\"grid grid-cols-[2.75rem_1.5rem_1fr] items-start pb-3\">\n <time dateTime={s.start} className={cn(\"text-right font-mono text-[11px] text-muted\", quiet ? \"pt-2.5\" : \"pt-4\")} title={new Date(s.start).toLocaleString()}>\n {clock(s.start)}\n </time>\n <span className={cn(\"flex justify-center\", quiet ? \"pt-[0.95rem]\" : \"pt-[1.2rem]\")} aria-hidden>\n <span\n className={cn(\n \"relative z-[1] rounded-full ring-4 ring-bg\",\n quiet ? \"h-1.5 w-1.5\" : \"h-2.5 w-2.5\",\n s.actor === \"ai\" ? \"bg-accent\" : \"bg-muted\",\n live && \"animate-pulse-dot\",\n )}\n />\n </span>\n <SessionCard\n session={s}\n // eventIds are chronological; the feed reads oldest → newest within a session\n events={s.eventIds.flatMap(id => events.get(id) ?? [])}\n onOpenTask={onOpenTask}\n onOpenDoc={onOpenDoc}\n focused={s.id === focusSessionId}\n live={live}\n />\n </div>\n </li>\n )\n })}\n </ol>\n )}\n </div>\n )\n}\n"],"names":["ActivityFeed","activity","className","map","evt","event","id"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/app/%28app%29/activity/page.tsx","../../../../src/components/activity/ActivityTab.tsx","../../../../src/components/activity/ActivityFeed.tsx","../../../../src/components/activity/SessionTimeline.tsx","../../../../src/components/activity/SessionCard.tsx"],"sourcesContent":["\"use client\"\r\n\r\nimport { Suspense, useState } from \"react\"\r\nimport { useSearchParams } from \"next/navigation\"\r\nimport { useApp } from \"@/context/AppContext\"\r\nimport { ActivityTab } from \"@/components/activity/ActivityTab\"\r\nimport { TaskDetailPanel } from \"@/components/board/TaskDetailPanel\"\r\n\r\nfunction ActivityContent() {\r\n const { activity, rootParam, board, moveTask, openDoc } = useApp()\r\n const focusSessionId = useSearchParams().get(\"session\")\r\n const [taskId, setTaskId] = useState<string | null>(null)\r\n // Derive from the board so the panel reflects moves made while it is open\r\n const task = (board && taskId && Object.values(board).flat().find(t => t.id === taskId)) || null\r\n\r\n return (\r\n <div className=\"relative flex-1\">\r\n <ActivityTab\r\n activity={activity}\r\n rootParam={rootParam}\r\n onOpenTask={setTaskId}\r\n onOpenDoc={openDoc}\r\n focusSessionId={focusSessionId}\r\n />\r\n <TaskDetailPanel task={task} onClose={() => setTaskId(null)} onMove={moveTask} />\r\n </div>\r\n )\r\n}\r\n\r\nexport default function ActivityPage() {\r\n return (\r\n <Suspense>\r\n <ActivityContent />\r\n </Suspense>\r\n )\r\n}\r\n","\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport type { ActivityEvent, Session } from \"@/types\"\nimport { cn } from \"@/lib/utils\"\nimport { ActivityFeed } from \"./ActivityFeed\"\nimport { SessionTimeline } from \"./SessionTimeline\"\nimport { Activity as ActivityIcon } from \"lucide-react\"\nimport { catchUp } from \"@/lib/sessions\"\n\nconst DAY_MS = 24 * 60 * 60 * 1000\n\n/** \"5 tasks done · 1 ADR · 4 sessions\": the one-read answer to \"what happened while I was away?\" Zeros drop out. */\nfunction Summary({ sessions }: { sessions: Session[] }) {\n // Ticks so the 24h window stays honest without new events\n const [now, setNow] = useState(() => Date.now())\n useEffect(() => {\n const t = setInterval(() => setNow(Date.now()), 60_000)\n return () => clearInterval(t)\n }, [])\n const day = catchUp(sessions, now - DAY_MS)\n const parts = ([\n [day.tasksDone, \"task\", \"done\"],\n [day.decisions, \"ADR\", \"logged\"],\n [day.docs, \"doc\", \"changed\"],\n [day.sessions, \"session\", \"\"],\n ] as const).filter(([n]) => n > 0)\n if (!parts.length) return <>Quiet for the last 24 hours</>\n return (\n <>\n {parts.map(([n, noun, verb], i) => (\n <span key={noun}>\n {i > 0 && <span className=\"text-muted\"> · </span>}\n <span className=\"font-mono tabular-nums\">{n}</span> {noun}{n === 1 ? \"\" : \"s\"}{verb && ` ${verb}`}\n </span>\n ))}\n <span className=\"font-normal text-muted\"> in the last 24h</span>\n </>\n )\n}\n\ninterface ActivityTabProps {\n activity: ActivityEvent[]\n rootParam: string\n onOpenTask: (taskId: string) => void\n onOpenDoc: (path: string) => void\n focusSessionId?: string | null\n}\n\nexport function ActivityTab({ activity, rootParam, onOpenTask, onOpenDoc, focusSessionId }: ActivityTabProps) {\n const [view, setView] = useState<\"sessions\" | \"events\">(\"sessions\")\n // A new focus target (from a task's Sessions list) always lands on the Sessions view\n const [lastFocus, setLastFocus] = useState(focusSessionId)\n if (focusSessionId !== lastFocus) {\n setLastFocus(focusSessionId)\n if (focusSessionId) setView(\"sessions\")\n }\n const [sessions, setSessions] = useState<Session[] | null>(null) // null = first load\n const [failed, setFailed] = useState(false)\n const [events, setEvents] = useState<Map<string, ActivityEvent>>(new Map())\n\n // Refetch on every SSE event (AppContext re-dispatches them as `vibedoc:sse`), not only the ones that refresh `activity`.\n useEffect(() => {\n const qs = rootParam ? `${rootParam}&` : \"?\"\n const load = () => Promise.all([\n fetch(`/api/sessions${rootParam}`).then(r => r.json()),\n fetch(`/api/activity${qs}limit=2000`).then(r => r.json()),\n ])\n .then(([ses, evs]) => {\n setFailed(false)\n setSessions(Array.isArray(ses) ? ses : [])\n setEvents(new Map((Array.isArray(evs) ? evs as ActivityEvent[] : []).map(e => [e.id, e])))\n })\n .catch(() => { setFailed(true); setSessions(prev => prev ?? []) })\n load()\n window.addEventListener(\"vibedoc:sse\", load)\n return () => window.removeEventListener(\"vibedoc:sse\", load)\n }, [rootParam])\n\n const empty = view === \"sessions\" ? sessions?.length === 0 : activity.length === 0\n\n return (\n <div className=\"mx-auto flex max-w-4xl flex-col px-6 py-8\">\n <header className=\"mb-6 flex flex-wrap items-end gap-x-6 gap-y-4 border-b border-border pb-5\">\n <div className=\"min-w-0 flex-1 basis-full sm:basis-0\">\n <h1 className=\"text-[1.6rem] leading-tight font-semibold tracking-[-0.02em] text-txt\">Activity</h1>\n <p className=\"mt-2 text-[1.1rem] leading-snug font-semibold text-txt\">\n {sessions === null ? <span className=\"text-muted\">Loading…</span> : <Summary sessions={sessions} />}\n </p>\n <p className=\"mt-1 text-sm text-muted\">Everything agents and you changed, read from <code className=\"font-mono text-[0.9em]\">.vibedoc-activity.json</code>.</p>\n </div>\n {/* Segmented toggle with a sliding pill */}\n <div className=\"relative grid grid-cols-2 rounded-md border border-border p-0.5 text-xs\" role=\"group\" aria-label=\"View\">\n <span\n aria-hidden\n className={cn(\n \"absolute inset-y-0.5 left-0.5 w-[calc(50%-2px)] rounded-sm bg-surface2 transition-transform duration-(--duration-base) ease-out-soft\",\n view === \"events\" && \"translate-x-full\",\n )}\n />\n {([\"sessions\", \"events\"] as const).map(v => (\n <button\n key={v}\n onClick={() => setView(v)}\n aria-pressed={view === v}\n className={cn(\"relative rounded-sm px-3 py-1 transition-colors duration-(--duration-fast) focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/60\", view === v ? \"text-txt\" : \"text-muted hover:text-txt\")}\n >\n {v === \"sessions\" ? \"Sessions\" : \"All events\"}\n </button>\n ))}\n </div>\n </header>\n\n {failed && (\n <p className=\"mb-4 rounded-md border border-danger/30 bg-danger/5 px-3 py-2 text-xs text-danger animate-fade-in\">\n Couldn&apos;t load sessions. Showing the last data we had; it retries on the next update.\n </p>\n )}\n\n {view === \"sessions\" && sessions === null ? (\n <div className=\"flex flex-col gap-3\" aria-busy=\"true\" aria-label=\"Loading sessions\">\n {[0, 1, 2].map(i => (\n <div key={i} className=\"ml-[4.25rem] h-24 rounded-lg bg-surface animate-pulse\" style={{ animationDelay: `${i * 120}ms` }} />\n ))}\n </div>\n ) : empty ? (\n <div className=\"flex flex-col items-start gap-2 rounded-lg border border-dashed border-border2 p-6 animate-fade-in\">\n <ActivityIcon className=\"size-5 text-muted\" aria-hidden />\n <p className=\"text-sm text-txt\">No activity yet</p>\n <p className=\"max-w-lg text-xs leading-relaxed text-muted\">\n Moves on the board and every agent call through the MCP server show up here as they happen. Use Connect in the header to hook up Claude Code or Cursor.\n </p>\n </div>\n ) : view === \"sessions\" ? (\n <SessionTimeline key={focusSessionId ?? \"\"} focusSessionId={focusSessionId} sessions={sessions ?? []} events={events} onOpenTask={onOpenTask} onOpenDoc={onOpenDoc} />\n ) : (\n <ActivityFeed activity={activity} />\n )}\n </div>\n )\n}\n","import type { ActivityEvent } from \"@/types\"\nimport { ActivityEventRow } from \"./ActivityEventRow\"\nimport { DayLabel, dayLabel } from \"./SessionTimeline\"\n\n/** Every event, newest first, grouped by day on the same clock gutter as the sessions timeline. */\nexport function ActivityFeed({ activity }: { activity: ActivityEvent[] }) {\n return (\n <ol className=\"flex flex-col\">\n {activity.map((e, i) => {\n const label = dayLabel(e.timestamp)\n return (\n <li key={e.id}>\n {(i === 0 || dayLabel(activity[i - 1].timestamp) !== label) && <DayLabel label={label} />}\n <ActivityEventRow event={e} showActor />\n </li>\n )\n })}\n </ol>\n )\n}\n","\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport { Bot, User } from \"lucide-react\"\nimport type { ActivityEvent, Session } from \"@/types\"\nimport { cn } from \"@/lib/utils\"\nimport { isLive } from \"@/lib/sessions\"\nimport { SessionCard } from \"./SessionCard\"\nimport { clock } from \"./ActivityEventRow\"\n\nexport function dayLabel(ts: string): string {\n const d = new Date(ts)\n const today = new Date()\n const yesterday = new Date(today)\n yesterday.setDate(today.getDate() - 1)\n if (d.toDateString() === today.toDateString()) return \"Today\"\n if (d.toDateString() === yesterday.toDateString()) return \"Yesterday\"\n return d.toLocaleDateString(undefined, { weekday: \"short\", month: \"short\", day: \"numeric\" })\n}\n\n/** Sticky day heading shared by the sessions timeline and the event feed. */\nexport function DayLabel({ label }: { label: string }) {\n return (\n <h2 className=\"sticky top-0 z-10 -mx-1 mt-4 mb-1 flex items-center gap-3 bg-bg/90 px-1 py-2 backdrop-blur-sm first:mt-0\">\n <span className=\"text-[13px] font-semibold text-txt\">{label}</span>\n <span className=\"h-px flex-1 bg-border\" aria-hidden />\n </h2>\n )\n}\n\ntype ActorFilter = \"all\" | \"ai\" | \"human\"\n\ninterface SessionTimelineProps {\n sessions: Session[]\n events: Map<string, ActivityEvent>\n onOpenTask: (taskId: string) => void\n onOpenDoc: (path: string) => void\n focusSessionId?: string | null\n}\n\nexport function SessionTimeline({ sessions, events, onOpenTask, onOpenDoc, focusSessionId }: SessionTimelineProps) {\n const [actor, setActor] = useState<ActorFilter>(\"all\")\n // Ticking clock: expires \"working\" badges without new events\n const [now, setNow] = useState(() => Date.now())\n useEffect(() => {\n const t = setInterval(() => setNow(Date.now()), 30_000)\n return () => clearInterval(t)\n }, [])\n const counts = { all: sessions.length, ai: sessions.filter(s => s.actor === \"ai\").length, human: sessions.filter(s => s.actor === \"human\").length }\n const shown = actor === \"all\" ? sessions : sessions.filter(s => s.actor === actor)\n\n return (\n <div>\n <div className=\"mb-3 flex items-center gap-1 text-xs\" role=\"group\" aria-label=\"Filter by actor\">\n {([\"all\", \"ai\", \"human\"] as const).map(a => {\n const Icon = a === \"ai\" ? Bot : a === \"human\" ? User : null\n return (\n <button\n key={a}\n aria-pressed={actor === a}\n onClick={() => setActor(a)}\n className={cn(\n \"flex items-center gap-1.5 rounded-md px-2.5 py-1 transition-colors duration-(--duration-fast) focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/60\",\n actor === a ? \"bg-surface2 text-txt\" : \"text-muted hover:text-txt\",\n )}\n >\n {Icon && <Icon className=\"size-3.5\" aria-hidden />}\n {a === \"all\" ? \"All\" : a === \"ai\" ? \"Agent\" : \"Human\"}\n <span className=\"font-mono text-[11px] text-muted tabular-nums\">{counts[a]}</span>\n </button>\n )\n })}\n </div>\n\n {shown.length === 0 ? (\n <p className=\"py-10 text-center text-sm text-muted\">No {actor === \"ai\" ? \"agent\" : \"human\"} sessions yet.</p>\n ) : (\n <ol className=\"relative\">\n {/* Rail runs behind the dots, between the clock gutter and the cards */}\n <div className=\"absolute left-[3.5rem] top-10 bottom-2 w-px bg-border\" aria-hidden />\n {shown.map((s, i) => {\n const label = dayLabel(s.start)\n const showDay = i === 0 || dayLabel(shown[i - 1].start) !== label\n const live = isLive(s, now)\n // Matches SessionCard's one-line layout for sessions with nothing to link\n const quiet = s.tasks.length + s.docs.length + s.decisions.length === 0\n return (\n <li\n key={s.id}\n className=\"animate-fade-in\"\n style={{ animationDelay: `${Math.min(i, 8) * 45}ms`, animationFillMode: \"both\" }}\n >\n {showDay && <DayLabel label={label} />}\n <div className={cn(\"grid grid-cols-[2.75rem_1.5rem_minmax(0,1fr)] items-start\", quiet ? \"pb-1\" : \"py-2\")}>\n <time dateTime={s.start} className={cn(\"text-right font-mono text-[11px] tabular-nums\", quiet ? \"pt-2 text-muted\" : \"pt-4 text-txt\")} title={new Date(s.start).toLocaleString()}>\n {clock(s.start)}\n </time>\n <span className={cn(\"flex justify-center\", quiet ? \"pt-[0.8rem]\" : \"pt-[1.15rem]\")} aria-hidden>\n <span\n className={cn(\n \"relative z-[1] rounded-full ring-4 ring-bg\",\n quiet ? \"size-1.5 bg-border2\" : \"size-2.5\",\n !quiet && (s.actor === \"ai\" ? \"bg-accent\" : \"bg-muted\"),\n live && \"animate-pulse-dot\",\n )}\n />\n </span>\n <SessionCard\n session={s}\n // eventIds are chronological; the feed reads oldest → newest within a session\n events={s.eventIds.flatMap(id => events.get(id) ?? [])}\n onOpenTask={onOpenTask}\n onOpenDoc={onOpenDoc}\n focused={s.id === focusSessionId}\n live={live}\n />\n </div>\n </li>\n )\n })}\n </ol>\n )}\n </div>\n )\n}\n","\"use client\"\n\nimport { useEffect, useRef, useState } from \"react\"\nimport { Bot, ChevronRight, FileText, Scale, User } from \"lucide-react\"\nimport type { ActivityEvent, Session } from \"@/types\"\nimport { cn } from \"@/lib/utils\"\nimport { sessionDuration } from \"@/lib/sessions\"\nimport { STATUS_META, StatusIcon } from \"@/components/shared/StatusIcon\"\nimport { ActivityEventRow } from \"./ActivityEventRow\"\n\n// One mark per task, filled with the task's status hue (the One Status Language, as a bar)\nconst STATUS_BAR: Record<string, string> = {\n done: \"bg-teal\",\n \"in-progress\": \"bg-amber\",\n review: \"bg-accent\",\n blocked: \"bg-danger\",\n todo: \"bg-border2\",\n cancelled: \"bg-border2\",\n}\n\nconst chip =\n \"inline-flex max-w-full min-w-0 items-center gap-1.5 rounded-sm border border-border px-2 py-1 font-mono text-[11px] text-txt transition-colors duration-(--duration-fast) hover:border-border2 hover:bg-surface2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/60\"\n\ninterface SessionCardProps {\n session: Session\n events: ActivityEvent[]\n onOpenTask: (taskId: string) => void\n onOpenDoc: (path: string) => void\n focused?: boolean\n live?: boolean\n}\n\n/** Expandable body shared by cards and quiet rows: grid-rows 0fr↔1fr animates height without measuring. */\nfunction EventList({ open, events }: { open: boolean; events: ActivityEvent[] }) {\n return (\n <div className={cn(\"grid transition-[grid-template-rows,opacity] duration-(--duration-slow) ease-out-soft\", open ? \"grid-rows-[1fr] opacity-100\" : \"grid-rows-[0fr] opacity-0\")}>\n <div className=\"min-h-0 overflow-hidden\" inert={!open}>\n <div className=\"mt-3 border-t border-border pt-2\">\n {events.map(e => <ActivityEventRow key={e.id} event={e} />)}\n </div>\n </div>\n </div>\n )\n}\n\nfunction Chevron({ open }: { open: boolean }) {\n return <ChevronRight aria-hidden className={cn(\"size-3.5 shrink-0 text-muted transition-transform duration-(--duration-base) ease-out-soft\", open && \"rotate-90\")} />\n}\n\n/** \"1 event\" says nothing: a session that only connected reads as such. */\nconst quietHeadline = (s: Session) => (/^\\d+ events?$/.test(s.headline) ? \"Connected, nothing changed\" : s.headline)\n\nexport function SessionCard({ session, events, onOpenTask, onOpenDoc, focused = false, live = false }: SessionCardProps) {\n const [open, setOpen] = useState(focused)\n const ref = useRef<HTMLDivElement>(null)\n useEffect(() => {\n if (focused) ref.current?.scrollIntoView({ block: \"center\", behavior: \"smooth\" })\n }, [focused])\n\n const isAgent = session.actor === \"ai\"\n const Actor = isAgent ? Bot : User\n const done = session.tasks.filter(t => t.lastStatus === \"done\").length\n const hasLinks = session.tasks.length + session.docs.length + session.decisions.length > 0\n const count = `${session.eventCount} event${session.eventCount === 1 ? \"\" : \"s\"}`\n\n // Quiet sessions (only roadmap edits, reads, session starts) collapse to one line so real work stands out.\n if (!hasLinks) {\n return (\n <div ref={ref} className={cn(\"min-w-0 rounded-md px-3 py-1.5 transition-colors duration-(--duration-fast) hover:bg-surface/60\", focused && \"bg-surface animate-flash\")}>\n <button onClick={() => setOpen(o => !o)} aria-expanded={open} className=\"flex w-full min-w-0 items-center gap-2 text-left text-[13px] text-muted focus-visible:text-txt focus-visible:outline-none\">\n <Actor className=\"size-3.5 shrink-0\" aria-label={isAgent ? \"Agent\" : \"Human\"} />\n <span className=\"min-w-0 truncate\">{quietHeadline(session)}</span>\n <span className=\"ml-auto shrink-0 font-mono text-[11px]\">{sessionDuration(session)}<span className=\"hidden sm:inline\"> · {count}</span></span>\n <Chevron open={open} />\n </button>\n <EventList open={open} events={events} />\n </div>\n )\n }\n\n return (\n <div\n ref={ref}\n className={cn(\n \"min-w-0 rounded-lg border bg-surface transition-colors duration-(--duration-base) hover:border-border2\",\n live ? \"border-accent/40\" : \"border-border\",\n focused && \"border-accent/60 animate-flash\",\n )}\n >\n <div className=\"px-4 pt-3.5 pb-4\">\n <button onClick={() => setOpen(o => !o)} aria-expanded={open} className=\"group flex w-full min-w-0 items-center gap-2 text-left focus-visible:outline-none\">\n <Actor className=\"size-3.5 shrink-0 text-muted\" aria-hidden />\n <span className=\"text-xs text-muted\">{isAgent ? \"Agent\" : \"Human\"}</span>\n {live && (\n <span className=\"flex items-center gap-1 font-mono text-[10px] text-accent\">\n <span className=\"size-1.5 rounded-full bg-accent animate-pulse-dot\" />\n working\n </span>\n )}\n <span className=\"ml-auto shrink-0 font-mono text-[11px] text-muted\">{sessionDuration(session)} · {count}</span>\n <span className=\"flex items-center gap-1 text-[11px] text-muted group-hover:text-txt group-focus-visible:text-txt\">\n <Chevron open={open} />\n </span>\n </button>\n\n <p className=\"mt-1.5 text-[15px] leading-snug font-semibold text-txt\">{session.headline}</p>\n\n {session.tasks.length > 0 && (\n <div className=\"mt-3 flex items-center gap-3\">\n <div className=\"flex flex-1 gap-0.5\" role=\"img\" aria-label={`${done} of ${session.tasks.length} tasks done`}>\n {session.tasks.map(t => <span key={t.id} className={cn(\"h-1 flex-1 rounded-full\", STATUS_BAR[t.lastStatus] ?? \"bg-border2\")} />)}\n </div>\n <span className=\"font-mono text-[11px] text-muted tabular-nums\"><span className=\"text-txt\">{done}</span>/{session.tasks.length}</span>\n </div>\n )}\n\n <div className=\"mt-3 flex flex-wrap gap-1.5\">\n {session.tasks.map(t => (\n <button key={t.id} onClick={() => onOpenTask(t.id)} className={chip} title={`${t.id} → ${STATUS_META[t.lastStatus]?.label ?? t.lastStatus}`}>\n <StatusIcon status={t.lastStatus} className=\"size-3\" />\n {t.id}\n </button>\n ))}\n {session.docs.map(d => (\n <button key={d} onClick={() => onOpenDoc(d)} className={chip} title={d}>\n <FileText className=\"size-3 shrink-0 text-muted\" aria-hidden />\n <span className=\"truncate\">{d.split(\"/\").pop()}</span>\n </button>\n ))}\n {session.decisions.map(d => {\n const [id, ...rest] = d.split(\":\")\n return (\n <button key={d} onClick={() => onOpenDoc(id)} className={cn(chip, \"font-sans text-xs\")} title={d}>\n <Scale className=\"size-3 shrink-0 text-muted\" aria-hidden />\n <span className=\"shrink-0 font-mono text-[11px] whitespace-nowrap\">{id}</span>\n {rest.length > 0 && <span className=\"truncate text-muted\">{rest.join(\":\").trim()}</span>}\n </button>\n )\n })}\n </div>\n\n <EventList open={open} events={events} />\n </div>\n </div>\n )\n}\n"],"names":["STATUS_BAR","done","review","blocked","todo","cancelled","chip","EventList","open","events","className","inert","map","e","event","id","Chevron","quietHeadline","s","test","headline","SessionCard","session","onOpenTask","onOpenDoc","focused","live","setOpen","ref","current","scrollIntoView","block","behavior","isAgent","actor","Actor","tasks","filter","t","lastStatus","length","hasLinks","docs","decisions","count","eventCount","onClick","o","role","title","label","status","d","split","pop","rest","join","trim"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ module.exports=[90751,a=>{"use strict";var b=a.i(662145),c=a.i(174897),d=a.i(913975),e=a.i(544394),f=a.i(200382),g=a.i(685698),h=a.i(959792),i=a.i(319264),j=a.i(256857);let k={name:"bookmark",size:24,node:[["path",{d:"M17 3a2 2 0 0 1 2 2v15a1 1 0 0 1-1.496.868l-4.512-2.578a2 2 0 0 0-1.984 0l-4.512 2.578A1 1 0 0 1 5 20V5a2 2 0 0 1 2-2z",key:"oz39mx"}]]};k.node;let l=(0,j.default)(k),m={name:"chart-gantt",size:24,node:[["path",{d:"M10 6h8",key:"zvc2xc"}],["path",{d:"M12 16h6",key:"yi5mkt"}],["path",{d:"M3 3v16a2 2 0 0 0 2 2h16",key:"c24i48"}],["path",{d:"M8 11h7",key:"wz2hg0"}]]};m.node;let n=(0,j.default)(m);var o=a.i(350052),p=a.i(553415),q=a.i(661661);let r={name:"rotate-ccw",size:24,node:[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}]]};r.node;let s=(0,j.default)(r),t={name:"square-kanban",size:24,node:[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M8 7v7",key:"1x2jlm"}],["path",{d:"M12 7v4",key:"xawao1"}],["path",{d:"M16 7v9",key:"1hp2iy"}]],aliases:["kanban-square"]};t.node;let u=(0,j.default)(t),v={name:"table-2",size:24,node:[["path",{d:"M3 9h18",key:"1pudct"}],["path",{d:"M9 3v18",key:"fh3hqa"}],["rect",{x:"3",y:"3",width:"18",height:"18",rx:"2",key:"h1oib"}]]};v.node;let w=(0,j.default)(v);var x=a.i(28386),y=a.i(368114),z=a.i(335732);let A={board:u,table:w,epic:p.ListTree,timeline:n},B=["board","table","epic","timeline"],C="focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-accent",D=(0,y.cn)("relative inline-flex h-9 shrink-0 items-center gap-1.5 whitespace-nowrap border-b-2 border-transparent px-0.5 text-[13px] font-medium","transition-colors duration-(--duration-fast) ease-out-soft",C),E="rounded-sm border border-border2 bg-surface2 px-1 py-0.5 font-mono text-[10px] leading-none text-txt";function F({views:a,activeId:d,onSelect:e,onNew:g,onRename:h,onDelete:i,customizedIds:j,onRestore:k}){let m=[...a.filter(a=>B.includes(a.id)),...a.filter(a=>!B.includes(a.id))],[n,p]=(0,c.useState)(null),r=(0,c.useRef)(new Map),t=(0,c.useRef)(null);return(0,c.useEffect)(()=>{let a=t.current;if(!a)return;let b=r.current.get(a);b&&(b.focus(),t.current=null)}),(0,b.jsxs)("div",{role:"group","aria-label":"Views",className:"flex items-center gap-4 overflow-x-auto border-b border-border [scrollbar-width:none]",children:[m.map(a=>{let c=B.includes(a.id),f=c?A[a.kind]:l,g=a.id===d;return n===a.id?(0,b.jsx)(G,{initial:a.name,onDone:(b,c)=>{p(null),c&&(t.current=a.id),b&&b!==a.name&&h(a.id,b)}},a.id):(0,b.jsxs)("span",{className:"inline-flex shrink-0 items-center",children:[(0,b.jsxs)("button",{ref:b=>{b?r.current.set(a.id,b):r.current.delete(a.id)},type:"button","aria-pressed":g,title:c?void 0:`Saved view: ${a.name}`,onClick:()=>e(a.id),className:(0,y.cn)(D,g?"text-txt":"text-muted hover:text-txt"),children:[(0,b.jsx)(f,{"aria-hidden":!0,className:c?"size-[15px]":"size-3.5"}),a.name,g&&(0,b.jsx)("span",{"aria-hidden":!0,className:"absolute inset-x-0 -bottom-0.5 h-0.5 bg-accent [view-transition-name:board-view-tab]"})]}),g&&(!c||j.includes(a.id))&&(0,b.jsxs)(z.DropdownMenu,{children:[(0,b.jsx)(z.DropdownMenuTrigger,{"aria-label":`View options for ${a.name}`,className:(0,y.cn)("ml-0.5 inline-flex size-6 items-center justify-center rounded-sm text-muted hover:bg-surface2 hover:text-txt",C),children:(0,b.jsx)(o.ChevronDown,{"aria-hidden":!0,className:"size-3.5"})}),(0,b.jsx)(z.DropdownMenuContent,{align:"start",children:c?(0,b.jsxs)(z.DropdownMenuItem,{onSelect:()=>{t.current=a.id,k(a.id)},children:[(0,b.jsx)(s,{"aria-hidden":!0,className:"size-3.5"}),"Restore default"]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)(z.DropdownMenuItem,{onSelect:()=>p(a.id),children:[(0,b.jsx)(q.Pencil,{"aria-hidden":!0,className:"size-3.5"}),"Rename"]}),(0,b.jsxs)(z.DropdownMenuItem,{onSelect:()=>{i(a.id)&&(t.current=a.kind)},className:"text-danger focus:text-danger",children:[(0,b.jsx)(x.Trash2,{"aria-hidden":!0,className:"size-3.5"}),"Delete view"]})]})})]})]},a.id)}),(0,b.jsx)("button",{type:"button","aria-label":"New view",title:"New view",onClick:g,className:(0,y.cn)(D,"border-transparent text-muted hover:text-txt"),children:(0,b.jsx)(f.Plus,{"aria-hidden":!0,className:"size-[15px]"})}),(0,b.jsx)("span",{className:"grow"}),(0,b.jsxs)("span",{className:"hidden shrink-0 items-center gap-1.5 pb-1.5 text-[11px] text-muted sm:flex",children:[(0,b.jsx)("kbd",{className:E,children:"v"}),"next view",(0,b.jsx)("kbd",{className:(0,y.cn)(E,"ml-1.5"),children:"1"}),"–",(0,b.jsx)("kbd",{className:E,children:"4"})]})]})}function G({initial:a,onDone:d}){let[e,f]=(0,c.useState)(a),g=(0,c.useRef)(null),h=(0,c.useRef)(!1),i=(a,b=!1)=>{h.current||(h.current=!0,d(a.trim(),b))};return(0,c.useEffect)(()=>{let a=setTimeout(()=>g.current?.select(),0);return()=>clearTimeout(a)},[]),(0,b.jsx)("input",{ref:g,"aria-label":"View name",value:e,maxLength:60,onChange:a=>f(a.target.value),onBlur:()=>i(e),onKeyDown:b=>{"Enter"===b.key&&i(e,!0),"Escape"===b.key&&(b.stopPropagation(),i(a,!0))},className:"my-1 h-7 w-40 shrink-0 rounded-md border border-accent bg-bg px-2 text-[13px] text-txt outline-hidden"})}var H=a.i(725543),I=a.i(498053);let J={name:"arrow-up-down",size:24,node:[["path",{d:"m21 16-4 4-4-4",key:"f6ql7i"}],["path",{d:"M17 20V4",key:"1ejh1v"}],["path",{d:"m3 8 4-4 4 4",key:"11wl7u"}],["path",{d:"M7 4v16",key:"1glfcx"}]]};J.node;let K=(0,j.default)(J),L={name:"list-filter",size:24,node:[["path",{d:"M2 5h20",key:"1fs1ex"}],["path",{d:"M6 12h12",key:"8npq4p"}],["path",{d:"M9 19h6",key:"456am0"}]]};L.node;let M=(0,j.default)(L),N={name:"rows-3",size:24,node:[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M21 9H3",key:"1338ky"}],["path",{d:"M21 15H3",key:"9uk58r"}]],aliases:["panels-top-bottom"]};N.node;let O=(0,j.default)(N);var P=a.i(72551);let Q={name:"sliders-horizontal",size:24,node:[["path",{d:"M10 5H3",key:"1qgfaw"}],["path",{d:"M12 19H3",key:"yhmn1j"}],["path",{d:"M14 3v4",key:"1sua03"}],["path",{d:"M16 17v4",key:"1q0r14"}],["path",{d:"M21 12h-9",key:"1o4lsq"}],["path",{d:"M21 19h-5",key:"1rlt1p"}],["path",{d:"M21 5h-7",key:"1oszz2"}],["path",{d:"M8 10v4",key:"tgpxqk"}],["path",{d:"M8 12H3",key:"a7s4jb"}]]};Q.node;let R=(0,j.default)(Q);var S=a.i(54165),T=a.i(173628),U=a.i(443108);let V=[{prop:"status",label:"Status"},{prop:"epic",label:"Epic"},{prop:"size",label:"Size"},{prop:"due",label:"Due"},{prop:"deps",label:"Depends on"},{prop:"tests",label:"Tests"},{prop:"agent",label:"Agent"},{prop:"ready",label:"Ready"},{prop:"owner",label:"Owner"}],W=Object.fromEntries(V.map(a=>[a.prop,a.label])),X={status:{is:"is","is-not":"is not"},epic:{is:"is","is-not":"is not"},size:{is:"is","is-not":"is not"},due:{before:"is before",after:"is after","is-set":"is set","not-set":"is not set"},deps:{"is-set":"anything","not-set":"nothing"},tests:{"is-set":"reported","not-set":"not reported"},agent:{"is-set":"is active","not-set":"is not active"},ready:{"is-set":"yes","not-set":"no"},owner:{is:"is","is-not":"is not"}},Y=["status","epic","size","owner"],Z={human:"Human",ai:"AI agent",none:"No owner"},$=["XS","S","M","L","XL"],_=[{prop:"status",label:"Status"},{prop:"id",label:"ID"},{prop:"epic",label:"Epic"},{prop:"size",label:"Size"},{prop:"due",label:"Due"},{prop:"title",label:"Title"}],aa=[{value:"status",label:"Status"},{value:"epic",label:"Epic"},{value:"size",label:"Size"},{value:"owner",label:"Owner"},{value:"none",label:"None"}],ab=[{value:"epic",label:"Epic"},{value:"size",label:"Size"},{value:"none",label:"None"}],ac=[{key:"status",label:"Status"},{key:"epic",label:"Epic"},{key:"size",label:"Size"},{key:"due",label:"Due"},{key:"deps",label:"Depends on"},{key:"tests",label:"Tests"},{key:"agent",label:"Agent"},{key:"owner",label:"Owner"}];function ad(a,b){switch(a){case"status":return{prop:a,op:"is-not",value:["done"]};case"epic":return{prop:a,op:"is",value:[(b.find(a=>a.open)??b[0])?.id??"none"]};case"size":return{prop:a,op:"is",value:["M"]};case"due":let c;return{prop:a,op:"before",value:[(c=new Date,`${c.getFullYear()}-${String(c.getMonth()+1).padStart(2,"0")}-${String(c.getDate()).padStart(2,"0")}`)]};case"owner":return{prop:a,op:"is",value:["ai"]};default:return{prop:a,op:"is-set",value:[]}}}let ae="focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-1 focus-visible:ring-offset-bg",af=(0,y.cn)("inline-flex h-8 items-center gap-1.5 whitespace-nowrap rounded-md border border-transparent px-2.5 text-xs font-medium text-muted","transition-colors duration-(--duration-fast) ease-out-soft hover:bg-surface2 hover:text-txt",ae),ag="border-border2 bg-surface2 text-txt",ah=(0,y.cn)("h-7.5 min-w-0 rounded-md border border-border bg-bg px-2 text-[13px] text-txt",ae),ai="rounded-sm border border-border2 bg-surface2 px-1 py-0.5 font-mono text-[10px] leading-none text-txt",aj=(0,y.cn)("inline-flex size-7 shrink-0 items-center justify-center rounded-md text-muted hover:bg-surface2 hover:text-txt disabled:opacity-40 disabled:hover:bg-transparent",ae);function ak({open:a,onOpenChange:d,label:e,trigger:f,triggerClassName:g,panelClassName:h,anchorClassName:i,children:j}){let k=(0,c.useRef)(null),l=(0,c.useRef)(null),m=(0,c.useRef)(null),n=(0,c.useRef)(d),o=(0,c.useId)();return(0,c.useEffect)(()=>{n.current=d}),(0,c.useEffect)(()=>{if(!a)return;m.current?.querySelector("button, input, select")?.focus();let b=a=>{k.current?.contains(a.target)||n.current(!1)};return document.addEventListener("pointerdown",b),()=>document.removeEventListener("pointerdown",b)},[a]),(0,b.jsxs)("div",{ref:k,className:(0,y.cn)("max-sm:flex max-sm:flex-1",i??"sm:relative"),children:[(0,b.jsx)("button",{ref:l,type:"button","aria-expanded":a,"aria-haspopup":"dialog","aria-controls":a?o:void 0,onClick:()=>d(!a),className:g,children:f}),a&&(0,b.jsx)("div",{ref:m,id:o,role:"dialog","aria-label":e,onKeyDown:a=>{"Escape"===a.key&&(a.stopPropagation(),d(!1),l.current?.focus())},className:(0,y.cn)("absolute top-full z-30 mt-1 rounded-lg border border-border2 bg-surface p-3 text-txt shadow-lg","origin-top-right animate-in fade-in-0 zoom-in-[0.98] slide-in-from-top-1 duration-(--duration-fast) ease-out-soft",h),children:j})]})}function al({state:a,onChange:d,epics:e,dirty:g,activeIsBuiltIn:h,onSave:i,onSaveAs:j,onReset:k,searchInputId:l,filterOpen:m,onFilterOpenChange:n}){let[o,p]=(0,c.useState)(!1),q=b=>d({...a,...b}),[r,s]=(0,c.useState)(a.q),[t,u]=(0,c.useState)(a.q),[v,w]=(0,c.useState)(null);a.q!==t&&(u(a.q),a.q===v?w(null):null===v&&s(a.q));let x=b=>{s(b),w(b===a.q?null:b),q({q:b})},A="timeline"===a.kind,B="board"===a.kind,C=A?aa.filter(a=>"epic"===a.value||"none"===a.value):aa,D=aa.find(b=>b.value===a.group)?.label??"None",E=ab.find(b=>b.value===a.subGroup)?.label??"None",F="max-sm:h-9 max-sm:flex-1 max-sm:justify-center max-sm:border-border";return(0,b.jsxs)("div",{className:"flex flex-col gap-2.5",children:[(0,b.jsxs)("div",{className:"flex flex-col gap-2 sm:flex-row sm:items-center sm:gap-1",children:[(0,b.jsxs)("label",{className:"flex h-8 w-full items-center gap-2 rounded-md border border-border bg-bg px-2.5 text-[13px] text-muted focus-within:border-accent sm:w-65 max-sm:h-9",children:[(0,b.jsx)(P.Search,{"aria-hidden":!0,className:"size-3.5 shrink-0"}),(0,b.jsx)("span",{className:"sr-only",children:"Filter by title or ID"}),(0,b.jsx)("input",{id:l,type:"search",value:r,placeholder:"Filter by title or ID…",onChange:a=>x(a.target.value),onKeyDown:a=>{"Escape"===a.key&&(r?x(""):a.currentTarget.blur())},className:"min-w-0 grow bg-transparent text-txt outline-hidden placeholder:text-muted [&::-webkit-search-cancel-button]:hidden"}),(0,b.jsx)("kbd",{className:(0,y.cn)(ai,"max-sm:hidden"),children:"/"})]}),(0,b.jsx)("span",{className:"grow max-sm:hidden"}),(0,b.jsxs)("div",{className:"relative flex gap-1.5 max-sm:w-full sm:static sm:gap-1",children:[(0,b.jsx)(ak,{open:m,onOpenChange:n,label:"Filter",triggerClassName:(0,y.cn)(af,F,(m||a.filters.length>0)&&ag),panelClassName:"inset-x-0 sm:left-auto sm:right-0 sm:w-140",trigger:(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(M,{"aria-hidden":!0,className:"size-3.5"}),"Filter",a.filters.length>0&&(0,b.jsx)("span",{className:"font-mono text-txt",children:a.filters.length}),(0,b.jsx)("kbd",{className:(0,y.cn)(ai,"ml-0.5 max-sm:hidden"),children:"f"})]}),children:(0,b.jsx)(ap,{filters:a.filters,epics:e,onChange:a=>q({filters:a})})}),(0,b.jsx)(ak,{open:o,onOpenChange:p,label:"Sort",triggerClassName:(0,y.cn)(af,F,(o||a.sorts.length>0)&&ag),panelClassName:"inset-x-0 sm:left-auto sm:right-0 sm:w-95",trigger:(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(K,{"aria-hidden":!0,className:"size-3.5"}),"Sort",a.sorts.length>0&&(0,b.jsx)("span",{className:"font-mono text-txt",children:a.sorts.length})]}),children:(0,b.jsx)(as,{sorts:a.sorts,onChange:a=>q({sorts:a})})}),(0,b.jsxs)(z.DropdownMenu,{children:[(0,b.jsxs)(z.DropdownMenuTrigger,{className:(0,y.cn)(af,F,B&&"max-md:hidden"),children:[(0,b.jsx)(O,{"aria-hidden":!0,className:"size-3.5"}),(0,b.jsx)("span",{className:"max-sm:hidden",children:"Group"}),B?(0,b.jsxs)("span",{className:"text-txt",children:["Status","none"!==a.subGroup&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("span",{className:"px-1 text-muted",children:"›"}),E]})]}):(0,b.jsx)("span",{className:"text-txt",children:D})]}),(0,b.jsx)(z.DropdownMenuContent,{align:"end",children:B?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(z.DropdownMenuLabel,{className:"text-xs text-muted",children:"Swimlanes"}),(0,b.jsx)(z.DropdownMenuRadioGroup,{value:a.subGroup,onValueChange:a=>q({subGroup:a}),children:ab.map(a=>(0,b.jsx)(z.DropdownMenuRadioItem,{value:a.value,children:a.label},a.value))})]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(z.DropdownMenuLabel,{className:"text-xs text-muted",children:"Group by"}),(0,b.jsx)(z.DropdownMenuRadioGroup,{value:a.group,onValueChange:a=>q({group:a}),children:C.map(a=>(0,b.jsx)(z.DropdownMenuRadioItem,{value:a.value,children:a.label},a.value))})]})})]}),!A&&(0,b.jsxs)(z.DropdownMenu,{children:[(0,b.jsxs)(z.DropdownMenuTrigger,{className:(0,y.cn)(af,"max-sm:hidden"),children:[(0,b.jsx)(R,{"aria-hidden":!0,className:"size-3.5"}),"Properties"]}),(0,b.jsxs)(z.DropdownMenuContent,{align:"end",children:[(0,b.jsx)(z.DropdownMenuLabel,{className:"text-xs text-muted",children:"Show"}),ac.map(c=>(0,b.jsx)(z.DropdownMenuCheckboxItem,{checked:a.properties.includes(c.key),onSelect:a=>a.preventDefault(),onCheckedChange:b=>q({properties:ac.map(a=>a.key).filter(d=>d===c.key?!0===b:a.properties.includes(d))}),children:c.label},c.key))]})]})]})]}),(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[a.filters.map((c,d)=>(0,b.jsx)(an,{rule:c,onRemove:()=>q({filters:a.filters.filter((a,b)=>b!==d)})},d)),(0,b.jsxs)("button",{type:"button",onClick:()=>n(!0),className:(0,y.cn)(af,"h-6.5 px-2"),children:[(0,b.jsx)(f.Plus,{"aria-hidden":!0,className:"size-3.25"}),"Add filter"]}),(0,b.jsx)("span",{className:"grow"}),g&&(0,b.jsx)(ao,{activeIsBuiltIn:h,onSave:i,onSaveAs:j,onReset:k})]})]})}function am(a){return"is"===a.op&&a.value.length>1?"is any of":X[a.prop][a.op]??a.op}function an({rule:a,onRemove:c}){var d;let e="is-set"!==a.op&&"not-set"!==a.op,f=(d=(0,T.useStatusLabel)(),"status"===a.prop?{text:a.value.map(d).join(", "),mono:!1}:"epic"===a.prop?{text:a.value.map(a=>"none"===a?"No epic":a).join(", "),mono:!a.value.includes("none")}:"owner"===a.prop?{text:a.value.map(a=>Z[a]??a).join(", "),mono:!1}:{text:a.value.join(", "),mono:!0}),g=`${W[a.prop]} ${am(a)}${e?` ${f.text}`:""}`;return(0,b.jsxs)("span",{className:"inline-flex h-6.5 max-w-full items-center gap-1.5 rounded-sm border border-border2 bg-surface pl-2.25 pr-1 text-xs text-txt",children:[(0,b.jsxs)("span",{className:"truncate",children:[(0,b.jsx)("b",{className:"font-medium text-muted",children:W[a.prop]})," ",am(a),e&&(0,b.jsxs)(b.Fragment,{children:[" ",(0,b.jsx)("span",{className:(0,y.cn)("text-txt",f.mono&&"font-mono text-[11px]"),children:f.text||"—"})]})]}),(0,b.jsx)("button",{type:"button","aria-label":`Remove filter: ${g}`,onClick:c,className:(0,y.cn)("inline-flex rounded-xs p-0.75 text-muted hover:text-txt",ae),children:(0,b.jsx)(S.X,{"aria-hidden":!0,className:"size-3"})})]})}function ao({activeIsBuiltIn:a,onSave:d,onSaveAs:e,onReset:f}){let[g,h]=(0,c.useState)(!1),[i,j]=(0,c.useState)("");return g?(0,b.jsxs)("form",{className:"flex items-center gap-1.5",onSubmit:a=>{let b;a.preventDefault(),(b=i.trim())&&(e(b),h(!1),j(""))},children:[(0,b.jsx)("input",{autoFocus:!0,"aria-label":"New view name",placeholder:"View name",value:i,maxLength:60,onChange:a=>j(a.target.value),onKeyDown:a=>{"Escape"===a.key&&(a.stopPropagation(),h(!1))},className:"h-7 w-44 rounded-md border border-accent bg-bg px-2 text-[13px] text-txt outline-hidden placeholder:text-muted"}),(0,b.jsx)("button",{type:"submit",disabled:!i.trim(),className:(0,y.cn)(af,ag,"h-7 disabled:opacity-40"),children:"Save"}),(0,b.jsx)("button",{type:"button",onClick:()=>h(!1),className:(0,y.cn)(af,"h-7"),children:"Cancel"})]}):(0,b.jsxs)("div",{className:"flex items-center gap-1",children:[(0,b.jsx)("span",{className:"mr-1 text-xs text-muted",children:"Unsaved changes"}),(0,b.jsx)("button",{type:"button",onClick:f,className:(0,y.cn)(af,"text-txt"),children:"Reset"}),(0,b.jsx)("button",{type:"button",onClick:()=>h(!0),className:(0,y.cn)(af,"text-txt"),children:a?"Save as new view":"Save as new"}),(0,b.jsxs)("button",{type:"button",onClick:d,className:(0,y.cn)(af,ag),children:[(0,b.jsx)(l,{"aria-hidden":!0,className:"size-3.25"}),"Save view"]})]})}function ap({filters:a,epics:d,onChange:e}){let g=(b,c)=>e(a.map((a,d)=>d===b?c:a)),h=(0,c.useId)();return(0,b.jsxs)("div",{children:[(0,b.jsx)("p",{id:h,className:"mb-2.5 ml-0.5 text-xs font-semibold",children:"Show tasks where"}),0===a.length&&(0,b.jsx)("p",{className:"mb-1 ml-0.5 text-xs text-muted",children:"No filters yet. Every task shows except cancelled ones."}),(0,b.jsx)("ul",{"aria-labelledby":h,className:"flex flex-col gap-1.5",children:a.map((c,f)=>{let h=Object.entries(X[c.prop]),i=f+1;return(0,b.jsxs)("li",{className:"flex flex-wrap items-center gap-1.5 text-xs text-muted sm:grid sm:grid-cols-[48px_120px_100px_minmax(0,1fr)_28px]",children:[(0,b.jsx)("span",{className:"w-10 pl-1 sm:w-auto",children:0===f?"Where":"and"}),(0,b.jsx)("select",{"aria-label":`Rule ${i} property`,value:c.prop,onChange:a=>g(f,ad(a.target.value,d)),className:(0,y.cn)(ah,"w-32.5 sm:w-auto"),children:V.map(a=>(0,b.jsx)("option",{value:a.prop,children:a.label},a.prop))}),(0,b.jsx)("select",{"aria-label":`Rule ${i} condition`,value:c.op,onChange:a=>{let b=a.target.value,e="is-set"===b||"not-set"===b?[]:c.value.length?c.value:ad(c.prop,d).value;g(f,{...c,op:b,value:e})},className:(0,y.cn)(ah,"w-27.5 sm:w-auto"),children:h.map(([a,c])=>(0,b.jsx)("option",{value:a,children:c},a))}),(0,b.jsx)("span",{className:"min-w-0 grow basis-40 sm:basis-auto",children:(0,b.jsx)(aq,{rule:c,n:i,epics:d,onChange:a=>g(f,{...c,value:a})})}),(0,b.jsx)("button",{type:"button","aria-label":`Remove rule ${i}`,onClick:()=>e(a.filter((a,b)=>b!==f)),className:aj,children:(0,b.jsx)(S.X,{"aria-hidden":!0,className:"size-3.5"})})]},f)})}),(0,b.jsxs)("div",{className:"mt-2.5 flex flex-wrap items-center gap-1.5 border-t border-border pt-2.5",children:[(0,b.jsxs)("button",{type:"button",onClick:()=>e([...a,ad("status",d)]),className:af,children:[(0,b.jsx)(f.Plus,{"aria-hidden":!0,className:"size-3.5"}),"Add rule"]}),(0,b.jsx)("span",{className:"grow"}),(0,b.jsx)("span",{className:"text-[11px] text-muted max-sm:hidden",children:"Rules combine with and"})]})]})}function aq({rule:a,n:c,epics:d,onChange:e}){return"is-set"===a.op||"not-set"===a.op?null:"due"===a.prop?(0,b.jsx)("input",{type:"date","aria-label":`Rule ${c} date`,value:a.value[0]??"",onChange:a=>e(a.target.value?[a.target.value]:[]),className:(0,y.cn)(ah,"w-full scheme-dark")}):Y.includes(a.prop)?(0,b.jsx)(ar,{rule:a,n:c,epics:d,onChange:e}):null}function ar({rule:a,n:d,epics:e,onChange:f}){let[g,h]=(0,c.useState)(!1),i=(0,U.useStatusDefs)(),j=(0,T.useStatusLabel)(),k="status"===a.prop?i.map(a=>({value:a.id,node:(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(T.StatusIcon,{status:a.id}),a.label]})})):"epic"===a.prop?[{value:"none",node:(0,b.jsx)("span",{className:"text-muted",children:"No epic"})},...e.map(a=>({value:a.id,node:(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("span",{className:"font-mono text-[11px] text-muted",children:a.id}),(0,b.jsx)("span",{className:"truncate",children:a.title})]})}))]:"owner"===a.prop?Object.entries(Z).map(([a,c])=>({value:a,node:(0,b.jsx)("span",{children:c})})):$.map(a=>({value:a,node:(0,b.jsx)("span",{className:"font-mono",children:a})})),l=a.value[0],m=l?"status"===a.prop?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(T.StatusIcon,{status:l}),(0,b.jsx)("span",{className:"truncate",children:j(l)})]}):"owner"===a.prop?(0,b.jsx)("span",{className:"truncate",children:Z[l]??l}):"epic"===a.prop&&"none"!==l?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("span",{className:"font-mono text-[11px] text-muted",children:l}),(0,b.jsx)("span",{className:"truncate",children:e.find(a=>a.id===l)?.title??""})]}):(0,b.jsx)("span",{className:(0,y.cn)("truncate","size"===a.prop&&"font-mono"),children:"none"===l?"No epic":l}):(0,b.jsx)("span",{className:"text-muted",children:"Choose…"});return(0,b.jsx)(ak,{open:g,onOpenChange:h,label:`${W[a.prop]} values`,anchorClassName:"relative",triggerClassName:(0,y.cn)(ah,"flex w-full items-center gap-1.5 text-left"),panelClassName:"left-0 z-40 max-h-64 w-64 overflow-y-auto p-1",trigger:(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("span",{className:"sr-only",children:["Rule ",d," values: "]}),m,a.value.length>1&&(0,b.jsxs)("span",{className:"font-mono text-[11px] text-muted",children:["+",a.value.length-1]}),(0,b.jsx)("span",{className:"grow"}),(0,b.jsx)(o.ChevronDown,{"aria-hidden":!0,className:"size-3.5 shrink-0 text-muted"})]}),children:(0,b.jsx)("ul",{className:"flex flex-col",children:k.map(c=>(0,b.jsx)("li",{children:(0,b.jsxs)("label",{className:"flex cursor-pointer items-center gap-2 rounded-sm px-2 py-1.5 text-[13px] text-txt hover:bg-surface2",children:[(0,b.jsx)("input",{type:"checkbox",checked:a.value.includes(c.value),onChange:b=>f(b.target.checked?[...a.value,c.value]:a.value.filter(a=>a!==c.value)),className:"size-3.5 accent-accent"}),(0,b.jsx)("span",{className:"flex min-w-0 items-center gap-1.5",children:c.node})]})},c.value))})})}function as({sorts:a,onChange:c}){let d=(b,d)=>c(a.map((a,c)=>c===b?d:a)),e=(b,d)=>{let e=[...a];[e[b],e[b+d]]=[e[b+d],e[b]],c(e)},g=_.filter(b=>!a.some(a=>a.prop===b.prop));return(0,b.jsxs)("div",{children:[(0,b.jsx)("p",{className:"mb-2.5 ml-0.5 text-xs font-semibold",children:"Sort by"}),0===a.length&&(0,b.jsx)("p",{className:"mb-1 ml-0.5 text-xs text-muted",children:"Default order: by ID."}),(0,b.jsx)("ol",{className:"flex flex-col gap-1.5",children:a.map((f,g)=>{let h=g+1,i=_.find(a=>a.prop===f.prop)?.label??f.prop;return(0,b.jsxs)("li",{className:"flex items-center gap-1",children:[(0,b.jsx)("button",{type:"button","aria-label":`Move ${i} sort up`,disabled:0===g,onClick:()=>e(g,-1),className:aj,children:(0,b.jsx)(I.ArrowUp,{"aria-hidden":!0,className:"size-3.5"})}),(0,b.jsx)("button",{type:"button","aria-label":`Move ${i} sort down`,disabled:g===a.length-1,onClick:()=>e(g,1),className:aj,children:(0,b.jsx)(H.ArrowDown,{"aria-hidden":!0,className:"size-3.5"})}),(0,b.jsx)("select",{"aria-label":`Sort ${h} property`,value:f.prop,onChange:a=>d(g,{...f,prop:a.target.value}),className:(0,y.cn)(ah,"ml-0.5 grow"),children:_.filter(b=>b.prop===f.prop||!a.some(a=>a.prop===b.prop)).map(a=>(0,b.jsx)("option",{value:a.prop,children:a.label},a.prop))}),(0,b.jsxs)("select",{"aria-label":`Sort ${h} direction`,value:f.dir,onChange:a=>d(g,{...f,dir:a.target.value}),className:(0,y.cn)(ah,"w-37.5"),children:[(0,b.jsx)("option",{value:"asc",children:"status"===f.prop?"Workflow order":"Ascending"}),(0,b.jsx)("option",{value:"desc",children:"status"===f.prop?"Reverse workflow":"Descending"})]}),(0,b.jsx)("button",{type:"button","aria-label":`Remove ${i} sort`,onClick:()=>c(a.filter((a,b)=>b!==g)),className:aj,children:(0,b.jsx)(S.X,{"aria-hidden":!0,className:"size-3.5"})})]},f.prop)})}),(0,b.jsx)("div",{className:"mt-2.5 border-t border-border pt-2.5",children:(0,b.jsxs)("button",{type:"button",disabled:!g.length,onClick:()=>c([...a,{prop:g[0].prop,dir:"asc"}]),className:(0,y.cn)(af,"disabled:opacity-40"),children:[(0,b.jsx)(f.Plus,{"aria-hidden":!0,className:"size-3.5"}),"Add sort"]})}),(0,b.jsx)("p",{className:"mx-0.5 mt-2 text-[11px] leading-normal text-muted",children:"Workflow order: In progress → Review → Todo → Blocked → Done. Ties fall back to ID."})]})}var at=a.i(156298),au=a.i(147758),av=a.i(822404);let aw={name:"corner-down-right",size:24,node:[["path",{d:"m15 10 5 5-5 5",key:"qqa56n"}],["path",{d:"M4 4v7a4 4 0 0 0 4 4h12",key:"z08zvw"}]]};aw.node;let ax=(0,j.default)(aw);var ay=a.i(768450),az=a.i(270923),aA=a.i(763747);let aB={name:"panel-right-open",size:24,node:[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M15 3v18",key:"14nvp0"}],["path",{d:"m10 15-3-3 3-3",key:"1pgupc"}]]};aB.node;let aC=(0,j.default)(aB);var aD=a.i(258701),aE=a.i(813722),aF=a.i(508113),aG=a.i(269769),aH=a.i(815122),aI=a.i(542920);let aJ=["status","epic","size","due","deps","tests","agent","owner"];function aK({task:a,onOpen:d,properties:e=aJ,selected:f=!1,onSelect:g}){let[h,j]=(0,c.useState)(!1),k=e.includes("epic")&&a.phase?(0,i.epicOf)(a.phase):null,l="todo"===a.status&&a.raw?(0,aI.latestReview)(a.raw):null,m=e.includes("size")?(0,i.sizeOf)(a):null,n="done"===a.status||"cancelled"===a.status,o=e.includes("deps")?a.dependsOn.match(/\bT\d+\b/g)??[]:[],p=e.includes("tests")?a.manualTests:null,q=l?.outcome==="changes requested";return(0,b.jsxs)("div",{draggable:!0,role:"button",tabIndex:0,"aria-label":`${a.id} ${a.title}`,"aria-pressed":g?f:void 0,onClick:a=>{g&&(a.shiftKey||a.metaKey||a.ctrlKey)?g():d()},onKeyDown:a=>{("Enter"===a.key||" "===a.key)&&(a.preventDefault(),d())},onDragStart:b=>{b.dataTransfer.setData("taskId",a.id),b.dataTransfer.effectAllowed="move",j(!0)},onDragEnd:()=>j(!1),style:{viewTransitionName:`task-${a.file.replace(/[^a-zA-Z0-9_-]/g,"_")}`},className:(0,y.cn)("group cursor-pointer rounded-lg border border-border bg-surface px-3 py-2.5 text-left outline-hidden","transition-[border-color,background-color,opacity,box-shadow] duration-(--duration-fast)","hover:border-border2 hover:bg-surface2/50 focus-visible:border-accent/60 focus-visible:shadow-[0_0_0_3px_rgb(var(--rgb-accent)/0.15)]",h&&"cursor-grabbing opacity-50",f&&"border-accent bg-accent/5 hover:border-accent"),children:[(0,b.jsxs)("div",{className:"flex items-center gap-1.5 font-mono text-[11px] text-muted",children:[(0,b.jsx)("span",{children:a.id}),e.includes("agent")&&(0,b.jsx)(aH.AgentDot,{attach:{kind:"task",id:a.id}}),e.includes("owner")&&a.owner&&(0,b.jsx)(aF.TaskOwnerField,{task:a,children:(0,b.jsx)(aE.OwnerChip,{owner:a.owner,className:"text-[10px] [&_svg]:size-3"})}),(0,b.jsx)("span",{className:"flex-1"}),e.includes("due")&&a.due&&!n&&(0,b.jsx)(aF.TaskDueField,{task:a,children:(0,b.jsx)("span",{title:"Due",children:a.due.slice(5)})}),m&&(0,b.jsx)(aF.TaskSizeField,{task:a,children:(0,b.jsx)("span",{title:a.size,className:"rounded-sm bg-surface2 px-1 text-[10px]",children:m})}),(0,b.jsx)(aL,{task:a,onOpen:d})]}),(0,b.jsx)("p",{className:(0,y.cn)("mt-1 line-clamp-2 text-[13px] font-medium leading-snug",n?"text-muted":"text-txt"),children:a.title}),(k||q||o.length>0||p)&&(0,b.jsxs)("div",{className:"mt-2 flex flex-wrap items-center gap-x-2 gap-y-1.5",children:[k&&(0,b.jsxs)("span",{className:"inline-flex min-w-0 max-w-full items-center gap-1 text-[11px] text-muted",title:a.phase,children:[k.id&&(0,b.jsx)("span",{className:"font-mono text-[10px]",children:k.id}),(0,b.jsx)("span",{className:"truncate",children:k.title})]}),q&&(0,b.jsxs)("span",{title:l?.note,className:"inline-flex items-center gap-1 rounded-sm border border-amber/40 bg-amber/5 px-1.5 py-0.5 text-[10px] text-amber",children:[(0,b.jsx)(ay.CornerUpLeft,{className:"size-3","aria-hidden":!0})," changes requested"]}),o.length>0&&(0,b.jsxs)("span",{title:`Depends on ${o.join(", ")}`,className:"inline-flex items-center gap-1 font-mono text-[10px] text-muted",children:[(0,b.jsx)(ax,{className:"size-3","aria-label":"Depends on"}),o.join(", ")]}),p&&(0,b.jsxs)(av.default,{href:`/manual-tests#${a.id}`,draggable:!1,onClick:a=>a.stopPropagation(),title:`Manual tests: ${p.done} of ${p.total} ticked`,className:(0,y.cn)("inline-flex items-center gap-1 rounded-sm border px-1.5 py-0.5 font-mono text-[10px] transition-colors hover:border-accent/50",p.done===p.total?"border-teal/30 bg-teal/5 text-teal":"border-border text-muted"),children:[(0,b.jsx)(az.FlaskConical,{className:"size-3","aria-hidden":!0}),p.done,"/",p.total]})]})]})}function aL({task:a,onOpen:c}){let{rootParam:d}=(0,e.useApp)(),f=a=>a.stopPropagation();return(0,b.jsxs)(z.DropdownMenu,{children:[(0,b.jsx)(z.DropdownMenuTrigger,{asChild:!0,children:(0,b.jsx)("button",{type:"button",draggable:!1,"aria-label":`Actions for ${a.id}`,onClick:f,onKeyDown:f,className:"-my-1 -mr-1 grid size-5 place-items-center rounded-sm text-muted opacity-0 transition-opacity hover:bg-surface2 hover:text-txt focus-visible:opacity-100 group-hover:opacity-100 data-[state=open]:opacity-100",children:(0,b.jsx)(aA.MoreHorizontal,{className:"size-3.5"})})}),(0,b.jsxs)(z.DropdownMenuContent,{align:"end",className:"w-40",onClick:f,onKeyDown:f,children:[(0,b.jsxs)(z.DropdownMenuItem,{onSelect:c,children:[(0,b.jsx)(aC,{})," Open"]}),(0,b.jsx)(z.DropdownMenuSeparator,{}),(0,b.jsxs)(z.DropdownMenuItem,{onSelect:()=>{(0,aD.deleteTaskWithUndo)(a,d).catch(a=>(0,aG.toast)(a.message))},className:"text-danger focus:text-danger",children:[(0,b.jsx)(x.Trash2,{})," Delete"]})]})]})}let aM=["in-progress","review","todo","blocked","paused","done"],aN={todo:"bg-border2","in-progress":"bg-amber",review:"bg-accent",blocked:"bg-danger",paused:"bg-muted/60",done:"bg-teal",cancelled:"bg-border"},aO=a=>"done"===a.status||"cancelled"===a.status,aP=(a,b)=>b.id.localeCompare(a.id,void 0,{numeric:!0}),aQ=(a,b)=>a.filter(a=>(0,au.displayStatus)(a)===b||"done"===b&&"cancelled"===a.status);function aR({tasks:a,state:d,onOpenTask:e,onMoveTask:f,selected:g,onToggleSelect:h}){let[j,k]=(0,c.useState)(!1),l=(0,U.useStatusDefs)(),m=(0,T.useStatusLabel)(),n=l.filter(a=>"cancelled"!==a.id).map(a=>a.id),p=[...l.filter(a=>"cancelled"!==a.id)].sort((a,b)=>aM.indexOf(a.category)-aM.indexOf(b.category)).map(a=>a.id),[q,r]=(0,c.useState)(!1),[s,t]=(0,c.useState)({}),[u,v]=(0,c.useState)(!1),[w,x]=(0,c.useState)(!1);if(0===a.length)return(0,b.jsxs)("div",{className:"grid place-items-center rounded-lg border border-dashed border-border px-4 py-12 text-center",children:[(0,b.jsx)("p",{className:"text-sm font-medium text-txt",children:"No tasks match these filters."}),(0,b.jsx)("p",{className:"mt-1 text-xs text-muted",children:"Remove a filter or clear the search to see more."})]});let z="none"===d.subGroup?null:(0,i.groupTasks)(a,d.subGroup),A="epic"===d.subGroup?d.properties.filter(a=>"epic"!==a):d.properties,B=a=>(0,b.jsx)(aK,{task:a,properties:A,onOpen:()=>e(a),selected:g?.has(a.id),onSelect:h&&(()=>h([a.id]))},a.id),C=z?.filter(a=>!a.tasks.every(aO))??[],D=z?.filter(a=>a.tasks.every(aO))??[],E=u?0:Math.max(0,D.length-4),F=[...C,...D.slice(0,D.length-E)],G="epic"===d.subGroup?"epics":"sizes",H=j||D.some(a=>s[a.key]),I=()=>{H?(k(!1),t(a=>Object.fromEntries(Object.entries(a).filter(([a])=>!D.some(b=>b.key===a))))):k(!0)},J={gridTemplateColumns:n.map(a=>("done"!==a||H)&&("paused"!==a||q)?"minmax(0,1fr)":"140px").join(" ")},K=(a,c)=>n.map(d=>{let g=aQ(a,d);return(0,b.jsx)(aS,{status:d,onMoveTask:f,children:("done"!==d||H)&&("paused"!==d||q)?g.length?("done"===d?[...g].sort(aP):g).map(B):c&&!w?null:(0,b.jsx)("div",{className:"grid h-11 place-items-center rounded-lg border border-dashed border-border text-[11px] text-muted/70",children:c?"":"Drop a task here"}):(0,b.jsx)(aT,{tasks:g,noun:"done"===d?"done":"paused",compact:c,dragging:w,onOpenTask:e})},d)});return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("div",{className:"hidden md:block",onDragStartCapture:()=>x(!0),onDragEndCapture:()=>x(!1),children:[(0,b.jsx)("div",{className:(0,y.cn)("grid gap-3 border-b border-border",z&&"pl-7.5"),style:J,children:n.map(c=>{let d;return(0,b.jsx)(aS,{status:c,onMoveTask:f,header:!0,children:(0,b.jsxs)("div",{className:"flex min-w-0 items-center gap-1.5 px-0.5 pb-2 text-xs font-semibold text-txt",children:[(0,b.jsx)(T.StatusIcon,{status:c}),(0,b.jsx)("h2",{className:"truncate",children:m(c)}),(0,b.jsx)("span",{className:"font-mono font-normal text-muted tabular-nums",children:aQ(a,c).length}),("done"===c||"paused"===c)&&(d="done"===c?H:q,(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("span",{className:"flex-1"}),(0,b.jsx)("button",{type:"button",onClick:"done"===c?I:()=>r(a=>!a),"aria-expanded":d,"aria-label":`${d?"Collapse":"Expand"} ${m(c)}`,className:"-my-1 grid size-6 place-items-center rounded-md text-muted outline-hidden transition-colors duration-(--duration-fast) hover:bg-surface2 hover:text-txt focus-visible:ring-2 focus-visible:ring-accent/60",children:(0,b.jsx)(at.ChevronRight,{className:(0,y.cn)("size-3.5 transition-transform duration-(--duration-base) ease-out-soft",d&&"rotate-180"),"aria-hidden":!0})})]}))]})},c)})}),z?(0,b.jsxs)(b.Fragment,{children:[F.map(a=>{let c=a.tasks.every(aO),d=s[a.key]??!c,e=a.tasks.filter(aO).length;return(0,b.jsxs)("section",{"aria-label":a.epicId?`${a.epicId} ${a.label}`:a.label,children:[(0,b.jsxs)("button",{type:"button",onClick:()=>t(b=>({...b,[a.key]:!d})),"aria-expanded":d,className:"mt-1.5 flex h-8.5 w-full items-center gap-2.5 rounded-md px-1.5 text-left outline-hidden transition-colors duration-(--duration-fast) hover:bg-surface2 focus-visible:ring-2 focus-visible:ring-accent/60",children:[d?(0,b.jsx)(o.ChevronDown,{className:"size-3.5 shrink-0 text-muted","aria-hidden":!0}):(0,b.jsx)(at.ChevronRight,{className:"size-3.5 shrink-0 text-muted","aria-hidden":!0}),a.epicId&&(0,b.jsx)("span",{className:"font-mono text-[11px] text-muted",children:a.epicId}),(0,b.jsx)("span",{className:"min-w-0 truncate text-[13px] font-semibold text-txt",children:a.label}),(0,b.jsx)("span",{className:"flex w-30 shrink-0 gap-0.5","aria-hidden":!0,children:a.tasks.map(a=>(0,b.jsx)("span",{className:(0,y.cn)("h-1 flex-1 rounded-full",aN[a.status])},a.id))}),(0,b.jsxs)("span",{className:"font-mono text-[11px] text-muted tabular-nums","aria-label":`${e} of ${a.tasks.length} done`,children:[(0,b.jsx)("span",{className:"text-txt",children:e}),"/",a.tasks.length]}),c&&(0,b.jsx)("span",{className:"text-xs text-muted",children:"all done"})]}),(0,b.jsx)("div",{className:(0,y.cn)("grid transition-[grid-template-rows,opacity] duration-(--duration-base) ease-out-soft",d?"grid-rows-[1fr] opacity-100":"grid-rows-[0fr] opacity-0"),children:(0,b.jsx)("div",{className:"min-h-0 overflow-hidden",inert:!d,children:(0,b.jsx)("div",{className:"grid gap-3 pt-2 pb-1 pl-7.5",style:J,children:K(a.tasks,!0)})})})]},a.key)}),E>0&&(0,b.jsxs)("p",{className:"mt-2 ml-9 text-xs text-muted",children:["+ ",(0,b.jsx)("span",{className:"font-mono",children:E})," more ",G,", all done ·"," ",(0,b.jsx)("button",{type:"button",onClick:()=>v(!0),className:"rounded-sm text-txt underline decoration-accent underline-offset-2 outline-hidden hover:decoration-txt focus-visible:ring-2 focus-visible:ring-accent/60",children:"Show"})]})]}):(0,b.jsx)("div",{className:"grid gap-3 pt-3",style:J,children:K(a,!1)})]}),(0,b.jsxs)("div",{className:"md:hidden",children:[a.every(aO)&&(0,b.jsx)("p",{className:"mt-3.5 text-sm text-muted",children:"Nothing open. Every task here is done."}),p.map(c=>{let d=aQ(a,c);if(!d.length)return null;let e="done"===c&&!j||"paused"===c&&!q;return(0,b.jsxs)("section",{"aria-label":m(c),children:[(0,b.jsxs)("h2",{className:"mt-3.5 mb-2 flex items-center gap-1.5 text-xs font-semibold text-txt",children:[(0,b.jsx)(T.StatusIcon,{status:c}),m(c),(0,b.jsx)("span",{className:"font-mono font-normal text-muted tabular-nums",children:d.length}),(0,b.jsx)("span",{className:"h-px flex-1 bg-border"}),("done"===c||"paused"===c)&&(0,b.jsx)("button",{type:"button",onClick:()=>("done"===c?k:r)(a=>!a),"aria-expanded":!e,className:"min-h-11 rounded-md px-2 text-xs font-normal text-muted outline-hidden hover:text-txt focus-visible:ring-2 focus-visible:ring-accent/60",children:e?"Show":"Hide"})]}),!e&&(0,b.jsx)("div",{className:"flex flex-col gap-2",children:("done"===c?[...d].sort(aP):d).map(B)})]},c)})]})]})}function aS({status:a,onMoveTask:d,header:e=!1,children:f}){let[g,h]=(0,c.useState)(!1);return(0,b.jsx)("div",{"data-column":e?void 0:a,"data-column-header":e?a:void 0,className:(0,y.cn)("flex min-w-0 flex-col gap-2 rounded-lg",!e&&"min-h-11","transition-[background-color,box-shadow] duration-(--duration-fast)",g&&"bg-accent/5 shadow-[0_0_0_1px_rgb(var(--rgb-accent)/0.5)]"),onDragOver:a=>{a.preventDefault(),h(!0)},onDragLeave:a=>{a.currentTarget.contains(a.relatedTarget)||h(!1)},onDrop:b=>{b.preventDefault(),h(!1);let c=b.dataTransfer.getData("taskId");c&&d(c,a)},children:f})}function aT({tasks:a,noun:c,compact:d,dragging:e,onOpenTask:f}){if(!a.length)return d&&!e?null:(0,b.jsx)("div",{className:"grid h-11 place-items-center rounded-lg border border-dashed border-border text-[11px] text-muted/70",children:d?"":"Drop here"});let g=[...a].sort(aP).slice(0,5);return(0,b.jsxs)("div",{className:"flex flex-col gap-1 rounded-lg border border-dashed border-border2 px-2 py-1.5 text-[11px] text-muted",children:[(0,b.jsx)("span",{className:"flex flex-wrap gap-x-1.5 font-mono",children:g.map(a=>(0,b.jsx)("button",{type:"button",onClick:()=>f(a),title:a.title,className:"rounded-sm text-txt outline-hidden hover:text-accent focus-visible:ring-2 focus-visible:ring-accent/60",children:a.id},a.id))}),(0,b.jsxs)("span",{children:[(0,b.jsx)("span",{className:"font-mono",children:a.length})," ",c]})]})}var aU=a.i(795667),aV=a.i(452696);let aW=["status","epic","owner","size","due","deps","tests","agent"],aX={status:"Status",epic:"Epic",size:"Size",due:"Due",deps:"Depends on",tests:"Tests",agent:"Agent",owner:"Owner"},aY={status:"w-[120px]",epic:"w-[170px]",size:"w-[56px]",due:"w-[92px]",deps:"w-[140px]",tests:"w-[72px]",agent:"w-[88px]",owner:"w-[104px]"},aZ=new Set(["epic","size","deps","tests","owner"]),a$=new Set(["id","title","status","epic","size","due"]),a_={todo:"bg-border2","in-progress":"bg-amber",review:"bg-accent",blocked:"bg-danger",paused:"bg-muted/60",done:"bg-teal",cancelled:"bg-border"},a0="font-mono text-[11px] text-muted",a1="focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent";function a2({tasks:a,state:d,agentTasks:e,onOpenTask:f,onSort:g,selected:h=new Set,onToggleSelect:j}){let k=(0,U.useStatusDefs)(),l=aW.filter(a=>d.properties.includes(a)),m="none"===d.group?[{key:"all",label:"All tasks",epicId:null,tasks:a}]:(0,i.groupTasks)(a,d.group,k),[n,o]=(0,c.useState)({}),p=(0,aV.localToday)();if(0===a.length)return(0,b.jsxs)("div",{className:"rounded-lg border border-border px-4 py-12 text-center",children:[(0,b.jsx)("p",{className:"text-sm text-txt",children:"No tasks match these filters."}),(0,b.jsx)("p",{className:"mt-1 text-xs text-muted",children:"Remove a filter or clear the search to see more."})]});let q=3+l.length,r=a.every(a=>h.has(a.id)),s="size-3.5 cursor-pointer accent-[var(--color-accent)]",t=a=>aZ.has(a)?"hidden md:table-cell":"",u=(a,c,e="")=>{let f=d.sorts.findIndex(b=>b.prop===a),h=f>=0?d.sorts[f]:null;if(!a$.has(a))return(0,b.jsx)("th",{scope:"col",className:(0,y.cn)("px-2.5 text-left font-medium",e),children:c},a);let i=h?.dir==="desc"?H.ArrowDown:I.ArrowUp;return(0,b.jsx)("th",{scope:"col","aria-sort":0===f?h?.dir==="desc"?"descending":"ascending":"none",className:(0,y.cn)("px-1 text-left font-medium",e),children:(0,b.jsxs)("button",{type:"button",title:"Click to sort · Shift-click to add a sort",onClick:b=>{var c,e;let f,h;return g((c=d.sorts,e=b.shiftKey,f=c.findIndex(b=>b.prop===a),h=a=>({prop:a.prop,dir:"asc"===a.dir?"desc":"asc"}),e?f<0?[...c,{prop:a,dir:"asc"}]:c.map((a,b)=>b===f?h(a):a):1===c.length&&0===f?[h(c[0])]:[{prop:a,dir:"asc"}]))},className:(0,y.cn)("inline-flex h-7 items-center gap-1 rounded-sm px-1.5 transition-colors duration-(--duration-fast) ease-out-soft hover:bg-surface2 hover:text-txt",h&&"text-txt",a1),children:[c,h&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(i,{className:"size-3","aria-hidden":!0}),(0,b.jsx)("span",{className:"font-mono text-[10px] text-muted",children:f+1})]})]})},a)},v=a=>{let c="done"===a.status||"cancelled"===a.status;return(0,b.jsxs)("tr",{onClick:b=>{b.target.closest("button")||f(a)},className:(0,y.cn)("h-9 cursor-pointer border-b border-border text-[13px] transition-colors duration-(--duration-fast) ease-out-soft last:border-b-0 hover:bg-surface2",h.has(a.id)&&"bg-accent/5"),children:[(0,b.jsx)("td",{className:"pl-3",onClick:a=>a.stopPropagation(),children:(0,b.jsx)("input",{type:"checkbox","aria-label":`Select ${a.id}`,checked:h.has(a.id),onChange:()=>j?.([a.id]),className:s})}),(0,b.jsx)("td",{className:(0,y.cn)("px-2.5",a0),children:a.id}),(0,b.jsx)("td",{className:"min-w-0 px-1",children:(0,b.jsx)("button",{type:"button",onClick:()=>f(a),title:a.title,className:(0,y.cn)("block w-full truncate rounded-sm px-1.5 py-1 text-left font-medium",c?"text-muted":"text-txt",a1),children:a.title})}),l.map(c=>((a,c)=>{let d=(0,y.cn)("px-2.5",t(c));switch(c){case"status":return(0,b.jsx)("td",{className:d,children:(0,b.jsx)(aF.TaskStatusField,{task:a})},c);case"epic":{let e=(0,i.epicOf)(a.phase);return(0,b.jsx)("td",{className:d,children:e.id||e.title?(0,b.jsxs)("span",{className:"flex min-w-0 items-center gap-1.5 text-xs",children:[e.id&&(0,b.jsx)("span",{className:a0,children:e.id}),(0,b.jsx)("span",{className:"truncate text-muted",children:e.title})]}):(0,b.jsx)("span",{className:a0,children:"—"})},c)}case"size":return(0,b.jsx)("td",{className:(0,y.cn)(d,a0),children:(0,b.jsx)(aF.TaskSizeField,{task:a})},c);case"owner":return(0,b.jsx)("td",{className:d,children:(0,b.jsx)(aF.TaskOwnerField,{task:a})},c);case"due":{let e=!!a.due&&"done"!==a.status&&"cancelled"!==a.status&&a.due<p;return(0,b.jsx)("td",{className:(0,y.cn)(d,a0),children:(0,b.jsx)(aF.TaskDueField,{task:a,children:(0,b.jsx)("span",{className:(0,y.cn)("font-mono text-[11px]",e?"text-amber":a.due?"text-muted":"text-muted/70"),children:a.due??"—"})})},c)}case"deps":{let e=a.dependsOn.match(/T\d+/g);return(0,b.jsx)("td",{className:(0,y.cn)(d,a0,"truncate"),children:e?e.join(", "):"—"},c)}case"tests":return(0,b.jsx)("td",{className:(0,y.cn)(d,a0),children:a.manualTests?(0,b.jsxs)("span",{className:"inline-flex items-center gap-1",children:[(0,b.jsx)(az.FlaskConical,{className:"size-3","aria-hidden":!0}),a.manualTests.done,"/",a.manualTests.total]}):"—"},c);case"agent":return(0,b.jsx)("td",{className:d,children:e.has(a.id)?(0,b.jsxs)("span",{className:"inline-flex items-center gap-1 text-[11px] text-txt",children:[(0,b.jsx)(aU.Bot,{className:"size-3.5 text-accent","aria-hidden":!0}),"working"]}):(0,b.jsx)("span",{className:a0,children:"—"})},c)}})(a,c))]},a.id)};return(0,b.jsx)("div",{className:"overflow-x-auto rounded-lg border border-border",children:(0,b.jsxs)("table",{className:"w-full min-w-[580px] table-fixed border-collapse md:min-w-[760px]",children:[(0,b.jsxs)("colgroup",{children:[(0,b.jsx)("col",{className:"w-[34px]"}),(0,b.jsx)("col",{className:"w-[72px]"}),(0,b.jsx)("col",{className:"w-[200px] md:w-auto"}),l.map(a=>(0,b.jsx)("col",{className:(0,y.cn)(aY[a],aZ.has(a)&&"hidden md:table-column")},a))]}),(0,b.jsx)("thead",{children:(0,b.jsxs)("tr",{className:"h-[34px] border-b border-border2 bg-bg text-[11px] text-muted",children:[(0,b.jsx)("th",{scope:"col",className:"pl-3 text-left",children:(0,b.jsx)("input",{type:"checkbox","aria-label":"Select all shown tasks",checked:r,onChange:()=>j?.(a.map(a=>a.id),!r),className:s})}),u("id","ID"),u("title","Title"),l.map(a=>u(a,aX[a],t(a)))]})}),m.map(a=>{let c=a.tasks.filter(a=>"done"===a.status).length,e=a.tasks.length>0&&a.tasks.every(a=>"done"===a.status||"cancelled"===a.status),f="none"===d.group||(n[a.key]??!e);return(0,b.jsxs)("tbody",{children:["none"!==d.group&&(0,b.jsx)("tr",{className:"h-[38px] border-b border-border bg-surface",children:(0,b.jsx)("th",{scope:"rowgroup",colSpan:q,className:"p-0 text-left font-normal",children:(0,b.jsxs)("button",{type:"button","aria-expanded":f,onClick:()=>o(b=>({...b,[a.key]:!f})),className:(0,y.cn)("flex h-[38px] w-full items-center gap-2.5 px-2 text-left transition-colors duration-(--duration-fast) ease-out-soft hover:bg-surface2",a1),children:[(0,b.jsx)(at.ChevronRight,{className:(0,y.cn)("size-3.5 shrink-0 text-muted transition-transform duration-(--duration-fast) ease-out-soft",f&&"rotate-90"),"aria-hidden":!0}),a.epicId&&(0,b.jsx)("span",{className:a0,children:a.epicId}),(0,b.jsx)("span",{className:"min-w-0 truncate text-[13px] font-semibold text-txt",children:a.label}),(0,b.jsx)("span",{className:"flex w-[110px] shrink-0 gap-0.5","aria-hidden":!0,children:a.tasks.map(a=>(0,b.jsx)("span",{className:(0,y.cn)("h-1 flex-1 rounded-full",a_[a.status])},a.id))}),(0,b.jsxs)("span",{className:a0,children:[(0,b.jsx)("span",{className:"text-txt",children:c}),"/",a.tasks.length]})]})})}),f&&a.tasks.map(v)]},a.key)})]})})}let a3={name:"play",size:24,node:[["path",{d:"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z",key:"10ikf1"}]]};a3.node;let a4=(0,j.default)(a3),a5="focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent",a6={todo:"bg-border2","in-progress":"bg-amber",review:"bg-accent",blocked:"bg-danger",paused:"bg-muted/60",done:"bg-teal",cancelled:"bg-border2"},a7=a=>parseInt(a.replace(/\D/g,""),10)||0,a8=(a,b)=>a7(a.id)-a7(b.id),a9=a=>a.dependsOn.match(/T\d+/g)??[];function ba({tasks:a,allTasks:d,agentTasks:e,onOpenTask:f}){let[g,h]=(0,c.useState)(new Set),[j,k]=(0,c.useState)(!1),l=(0,c.useMemo)(()=>new Map(d.map(a=>[a.id,a])),[d]),m=(0,c.useMemo)(()=>(0,i.groupTasks)(a,"epic"),[a]),{firstReady:n,upNext:o}=(0,c.useMemo)(()=>{let a=new Set,b=[],c=[];for(let d of m){let e=[...d.tasks].sort(a8),f=e.filter(a=>(0,i.isReady)(a,l));for(let d of(f[0]&&a.add(f[0].id),b.push(...f),e)){if("todo"!==d.status&&"blocked"!==d.status)continue;let a=a9(d).filter(a=>l.get(a)?.status!=="done");1===a.length&&c.push({task:d,on:a[0]})}}return{firstReady:a,upNext:[...b.map(a=>({task:a,on:null})),...c].slice(0,5)}},[m,l]);if(0===a.length)return(0,b.jsxs)("div",{className:"px-8 py-16 text-center",children:[(0,b.jsx)("p",{className:"text-sm font-medium text-txt",children:"No tasks match these filters."}),(0,b.jsx)("p",{className:"mt-1 text-xs text-muted",children:"Clear a filter or the search to see more epics."})]});let p=a=>h(b=>{let c=new Set(b);return c.has(a)?c.delete(a):c.add(a),c}),q=0,r=[],s=m.map(a=>{let c=function(a){if(a.some(a=>"in-progress"===a.status||"review"===a.status))return"in-progress";let b=a.filter(a=>"done"!==a.status&&"cancelled"!==a.status);return b.length>0&&b.every(a=>"blocked"===a.status)?"blocked":a.length>0&&a.every(a=>"done"===a.status)?"done":"todo"}(a.tasks);return"done"!==c||g.has(a.key)?(0,b.jsx)(bd,{group:a,status:c,collapsible:"done"===c,onCollapse:()=>p(a.key),firstReady:n,agentTasks:e,onOpenTask:f},a.key):++q>3&&!j?(r.push(a),null):(0,b.jsx)(bc,{group:a,onExpand:()=>p(a.key)},a.key)});return(0,b.jsxs)("div",{className:"grid gap-6 px-4 pt-[18px] pb-8 sm:px-8 lg:grid-cols-[minmax(0,1fr)_280px]",children:[(0,b.jsxs)("div",{className:"flex min-w-0 flex-col gap-3.5",children:[s,r.length>0&&(0,b.jsxs)("p",{className:"mx-0.5 text-xs text-muted",children:["+ ",(0,b.jsx)("span",{className:"font-mono",children:r.slice(0,3).map(a=>a.epicId??a.label).join(", ")}),r.length>3&&(0,b.jsxs)(b.Fragment,{children:[" and ",(0,b.jsx)("span",{className:"font-mono",children:r.length-3})," more"]}),", all done ·"," ",(0,b.jsx)("button",{type:"button",onClick:()=>k(!0),className:(0,y.cn)("rounded-sm text-txt underline decoration-accent underline-offset-2 hover:decoration-txt",a5),children:"Show"})]})]}),(0,b.jsxs)("aside",{"aria-label":"Up next",className:"flex flex-col gap-2.5 lg:pt-1",children:[(0,b.jsx)("p",{className:"text-xs font-semibold text-txt",children:"Up next"}),0===o.length&&(0,b.jsx)("p",{className:"text-xs text-muted",children:"Nothing is ready right now."}),o.map(({task:a,on:c})=>(0,b.jsxs)("button",{type:"button",onClick:()=>f(a),className:(0,y.cn)("flex flex-col gap-1.5 rounded-lg border border-border bg-surface px-[11px] py-[9px] text-left transition-colors duration-(--duration-fast) ease-out-soft hover:border-border2",c&&"opacity-90",a5),children:[(0,b.jsxs)("span",{className:(0,y.cn)("flex items-center gap-1.5 text-xs",c?"text-muted":"text-txt"),children:[(0,b.jsx)(T.StatusIcon,{status:a.status}),(0,b.jsx)("span",{className:"font-mono text-[11px] text-muted",children:a.id}),c?(0,b.jsxs)(b.Fragment,{children:["Waiting on ",(0,b.jsx)("span",{className:"font-mono",children:c})]}):"Ready"]}),(0,b.jsx)("span",{className:"text-[13px] font-medium text-txt",children:a.title})]},a.id)),(0,b.jsxs)("p",{className:"mt-1.5 text-[11px] leading-normal text-muted",children:["Same order as ",(0,b.jsx)("span",{className:"font-mono",children:"vibedoc_next_task"}),": a task is ready when everything it depends on is done."]})]})]})}function bb({tasks:a}){let c=a.filter(a=>"done"===a.status).length;return(0,b.jsxs)("span",{className:"shrink-0 font-mono text-[11px] text-muted",children:[(0,b.jsx)("span",{className:"text-txt",children:c}),"/",a.length]})}function bc({group:a,onExpand:c}){return(0,b.jsxs)("button",{type:"button","aria-expanded":!1,onClick:c,className:(0,y.cn)("flex h-10 items-center gap-3 rounded-lg border border-border bg-surface px-4 text-left transition-colors duration-(--duration-fast) ease-out-soft hover:bg-surface2",a5),children:[(0,b.jsx)(at.ChevronRight,{className:"size-3.5 shrink-0 text-muted","aria-hidden":!0}),a.epicId&&(0,b.jsx)("span",{className:"font-mono text-[11px] text-muted",children:a.epicId}),(0,b.jsx)("span",{className:"min-w-0 truncate text-sm font-medium text-muted",children:a.label}),(0,b.jsx)("span",{className:"flex-1"}),(0,b.jsx)(T.StatusIcon,{status:"done"}),(0,b.jsx)(bb,{tasks:a.tasks})]})}function bd({group:a,status:d,collapsible:e,onCollapse:f,firstReady:g,agentTasks:h,onOpenTask:j}){let k=(0,c.useMemo)(()=>(0,i.depOutline)(a.tasks),[a.tasks]),l=T.STATUS_META[d],m=[...a.tasks].sort(a8);return(0,b.jsxs)("section",{className:"flex flex-col gap-2.5 rounded-lg border border-border bg-surface px-3.5 pt-3.5 pb-2.5",children:[(0,b.jsxs)("div",{className:"flex flex-wrap items-baseline gap-x-3 gap-y-1 px-0.5",children:[a.epicId&&(0,b.jsx)("span",{className:"font-mono text-[11px] text-muted",children:a.epicId}),(0,b.jsx)("h2",{className:"m-0 min-w-0 text-[1.1rem] font-semibold text-txt",children:a.label}),(0,b.jsxs)("span",{className:(0,y.cn)("inline-flex items-center gap-1.5 self-center text-xs",l.text),children:[(0,b.jsx)(T.StatusIcon,{status:d}),l.label]}),(0,b.jsx)("span",{className:"flex-1"}),(0,b.jsx)(bb,{tasks:a.tasks}),e&&(0,b.jsx)("button",{type:"button","aria-expanded":!0,onClick:f,className:(0,y.cn)("self-center rounded-sm text-xs text-muted hover:text-txt",a5),children:"Collapse"})]}),(0,b.jsx)("div",{className:"flex gap-[3px] px-0.5","aria-hidden":!0,children:m.map(a=>(0,b.jsx)("span",{className:(0,y.cn)("h-[5px] flex-1 rounded-full",a6[a.status])},a.id))}),(0,b.jsx)("ul",{className:"flex flex-col",children:k.map(({task:a,depth:c,alsoAfter:d})=>{let e="done"===a.status,f=(0,i.sizeOf)(a);return(0,b.jsx)("li",{children:(0,b.jsxs)("button",{type:"button",onClick:()=>j(a),style:{paddingLeft:16+26*c},className:(0,y.cn)("relative flex h-[38px] w-full items-center gap-2.5 rounded-md pr-3 text-left transition-colors duration-(--duration-fast) ease-out-soft hover:bg-surface2",a5),children:[c>0&&(0,b.jsx)("span",{"aria-hidden":!0,style:{left:2+26*c},className:"absolute top-0 bottom-1/2 w-2.5 rounded-bl-md border-b border-l border-border2"}),(0,b.jsx)(T.StatusIcon,{status:a.status}),(0,b.jsx)("span",{className:"font-mono text-[11px] text-muted",children:a.id}),(0,b.jsx)("span",{className:(0,y.cn)("min-w-0 truncate text-[13.5px] font-medium",e?"text-muted":"text-txt"),children:a.title}),d.length>0&&(0,b.jsxs)("span",{className:"hidden shrink-0 font-mono text-[10px] text-muted sm:inline",children:["also after ",d.join(", ")]}),g.has(a.id)&&(0,b.jsxs)("span",{className:"inline-flex h-5 shrink-0 items-center gap-1 rounded-sm border border-accent px-[7px] text-[11px] text-txt",children:[(0,b.jsx)(a4,{className:"size-2.5 text-accent","aria-hidden":!0}),"Ready · next for the agent"]}),h.has(a.id)&&(0,b.jsxs)("span",{className:"inline-flex shrink-0 items-center gap-1 text-[11px] text-txt",children:[(0,b.jsx)(aU.Bot,{className:"size-3 text-accent","aria-hidden":!0}),"working"]}),(0,b.jsx)("span",{className:"flex-1"}),f&&(0,b.jsx)("span",{className:"font-mono text-[10px] text-muted",children:f})]})},a.id)})})]})}let be=[{value:"active",label:"Active time"},{value:"day",label:"Day"},{value:"week",label:"Week"}],bf=a=>new Date(a).toLocaleTimeString("en-GB",{hour:"2-digit",minute:"2-digit",hour12:!1}),bg=a=>new Date(a).toLocaleDateString("en-US",{month:"short",day:"numeric"}),bh=a=>{let b=new Date(a);return b.setHours(0,0,0,0),b.getTime()};function bi(a){let b=Math.round(a/6e4);if(b<60)return`${b}m`;let c=Math.floor(b/60);return c>=24?`${Math.round(b/60)}h`:b%60?`${c}h ${b%60}m`:`${c}h`}function bj(a,b){for(let c of a)if(b>=c.startMs&&b<=c.endMs){let a=c.endMs-c.startMs||1;return c.x+(b-c.startMs)/a*c.width}return null}function bk({tasks:a,state:d,agentTasks:e,onOpenTask:f,events:g,loading:h,onScale:j}){let k=function(a=3e4){let[b,d]=(0,c.useState)(()=>Date.now());return(0,c.useEffect)(()=>{let b=setInterval(()=>d(Date.now()),a);return()=>clearInterval(b)},[a]),b}(),l=d.scale,m=(0,c.useMemo)(()=>(0,i.timelineBars)(a,g,k),[a,g,k]),n=(0,c.useMemo)(()=>(function(a,b,c){if(!a.length)return[];if("active"===b){let b=0;return(0,i.foldAxis)(a,18e5).map((a,c)=>{c>0&&(b+=56);let d=Math.max(170,(a.endMs-a.startMs)/6e4*2.2),e={...a,x:b,width:d};return b+=d,e})}let d=Math.min(...a.map(a=>a.startMs)),e=Math.max(...a.map(a=>a.endMs),a.some(a=>a.open)?c:0),f=bh(d),g=bh(e)+864e5;return[{startMs:f,endMs:g,x:0,width:(g-f)*("day"===b?11111111111111112e-21:1388888888888889e-21)}]})(m,l,k),[m,l,k]),o=(0,c.useMemo)(()=>(function(a,b){let c=[];for(let d of a){let a=d.endMs-d.startMs,e="week"===b?864e5:"day"===b?216e5:a<=108e5?18e5:a<=288e5?36e5:108e5,f="active"===b?Math.ceil(d.startMs/e)*e:d.startMs;for(let a=f;a<=d.endMs;a+=e){let e=bj([d],a);null!=e&&c.push({x:e,label:"week"===b?bg(a):"day"===b?"00:00"===bf(a)?bg(a):bf(a):null})}}return c})(n,l),[n,l]),p=(0,c.useMemo)(()=>{let b=new Map(m.map(a=>[a.taskId,a]));return(0,i.groupTasks)(a,d.group).map(a=>{let c=a.tasks.filter(a=>b.has(a.id)).map(a=>({task:a,bar:b.get(a.id)})).sort((a,b)=>a.bar.startMs-b.bar.startMs),d=a.tasks.filter(a=>!b.has(a.id)&&"done"!==a.status&&"cancelled"!==a.status),e=(0,i.depOutline)(d).map(a=>a.task),f=!e.length&&a.tasks.every(a=>"done"===a.status||"cancelled"===a.status);return{group:a,worked:c,planned:e,compact:f}}).filter(a=>a.worked.length||a.planned.length)},[a,m,d.group]),q=n.length?n[n.length-1].x+n[n.length-1].width:0,r=q+200,s=bj(n,k),t=n.length?n[n.length-1].x:null,u=(0,c.useRef)(null),v=(0,c.useRef)(null);(0,c.useEffect)(()=>{let a=u.current;if(!a||null==t||v.current===l)return;v.current=l;let b=a.querySelector("[data-gutter]")?.offsetWidth??0;a.scrollLeft=null!=s?s-(a.clientWidth-b)/2:Math.min(a.scrollWidth-a.clientWidth,t-16)},[s,l,t]);let w=(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,b.jsx)("span",{className:"text-xs text-muted max-sm:hidden",children:"Scale"}),(0,b.jsx)("div",{role:"group","aria-label":"Timeline scale",className:"flex rounded-md border border-border p-0.5",children:be.map(a=>(0,b.jsx)("button",{type:"button","aria-pressed":l===a.value,onClick:()=>j(a.value),className:(0,y.cn)("h-6 rounded-[5px] border border-transparent px-2.5 text-xs font-medium text-muted outline-none transition-colors duration-(--duration-fast) ease-out-soft","hover:bg-surface2 hover:text-txt focus-visible:ring-2 focus-visible:ring-accent",l===a.value&&"border-border2 bg-surface2 text-txt"),children:a.label},a.value))}),"active"===l&&(0,b.jsx)("span",{className:"ml-2 text-xs text-muted max-sm:hidden",children:"Idle gaps folded"})]});if(!a.length)return(0,b.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,b.jsx)("div",{className:"flex justify-end",children:w}),(0,b.jsxs)("div",{className:"rounded-lg border border-dashed border-border px-6 py-10 text-center",children:[(0,b.jsx)("p",{className:"text-sm text-txt",children:"No tasks match these filters."}),(0,b.jsx)("p",{className:"mt-1 text-xs text-muted",children:"Clear a filter or the search to see more of the timeline."})]})]});if(h&&!g.length)return(0,b.jsxs)("div",{className:"flex flex-col gap-4","aria-busy":"true","aria-label":"Loading timeline",children:[(0,b.jsx)("div",{className:"flex justify-end",children:w}),[0,1,2].map(a=>(0,b.jsxs)("div",{className:"flex gap-4 border-b border-border pb-4",children:[(0,b.jsx)("div",{className:"h-9 w-[200px] animate-pulse rounded bg-surface2"}),(0,b.jsxs)("div",{className:"flex flex-1 flex-col gap-1.5 pt-1",children:[(0,b.jsx)("div",{className:"h-3.5 w-1/3 animate-pulse rounded-sm bg-surface2",style:{marginLeft:`${10+15*a}%`}}),(0,b.jsx)("div",{className:"h-3.5 w-1/5 animate-pulse rounded-sm bg-surface2",style:{marginLeft:`${30+10*a}%`}})]})]},a))]});let x=a.some(a=>a.due);return(0,b.jsxs)("div",{className:"flex min-w-0 flex-col gap-3",children:[(0,b.jsx)("div",{className:"flex justify-end",children:w}),!m.length&&(0,b.jsx)("p",{className:"text-sm text-muted",children:"No task moves in the activity log yet — bars appear once tasks move to In progress."}),(0,b.jsx)("div",{ref:u,className:"min-w-0 overflow-x-auto overscroll-x-contain",children:(0,b.jsxs)("div",{className:(0,y.cn)("relative","[--gw:110px] sm:[--gw:220px]"),style:{width:`calc(var(--gw) + ${r}px)`},children:[(0,b.jsxs)("div",{className:"flex",style:{height:36},children:[(0,b.jsx)("div",{"data-gutter":!0,className:"sticky left-0 z-20 w-(--gw) shrink-0 bg-bg"}),(0,b.jsxs)("div",{className:"relative",style:{width:r},children:[n.map((a,c)=>(0,b.jsxs)("div",{children:["active"===l&&(0,b.jsx)("div",{className:"absolute bottom-0 truncate border-b border-border2 font-mono text-[11px] text-txt",style:{left:a.x,width:a.width,height:28},children:bg(a.startMs)===bg(a.endMs)?`${bg(a.startMs)} \xb7 ${bf(a.startMs)}–${bf(a.endMs)}`:`${bg(a.startMs)} ${bf(a.startMs)} – ${bg(a.endMs)} ${bf(a.endMs)}`}),"active"===l&&c>0&&(0,b.jsx)("span",{className:"absolute bottom-0 flex justify-center font-mono text-[10px] whitespace-nowrap text-muted",style:{left:a.x-56,width:56,height:28},title:`Idle gap of ${bi(a.startMs-n[c-1].endMs)} folded`,children:bi(a.startMs-n[c-1].endMs)})]},a.startMs)),"active"!==l&&n.length>0&&(0,b.jsx)("div",{className:"absolute bottom-0 border-b border-border2",style:{left:0,width:q,height:28},children:o.map(a=>a.label&&(0,b.jsx)("span",{className:"absolute top-0 pl-1 font-mono text-[11px] whitespace-nowrap text-txt",style:{left:a.x},children:a.label},a.x))}),null!=s&&(0,b.jsx)("span",{className:"absolute top-0 z-10 -translate-x-1/2 rounded bg-accent px-1.5 py-0.5 font-mono text-[10px] text-accent-fg",style:{left:s},children:bf(k)})]})]}),p.map(({group:a,worked:c,planned:d,compact:g},h)=>{let i=Math.max(52,(g?1:c.length+d.length)*20+20),j=(c.reduce((a,b)=>{let c=bj(n,b.bar.endMs);return null==c?a:Math.max(a??0,c)},null)??s??0)+8;return(0,b.jsxs)("section",{className:"flex border-b border-border","aria-label":a.epicId?`${a.epicId} ${a.label}`:a.label,children:[(0,b.jsxs)("div",{className:"sticky left-0 z-20 flex w-(--gw) shrink-0 flex-col gap-0.5 bg-bg py-2.5 pr-2 sm:pr-4",children:[a.epicId&&(0,b.jsx)("span",{className:"font-mono text-[11px] text-muted",children:a.epicId}),(0,b.jsx)("span",{className:"line-clamp-2 text-[13px] leading-tight font-semibold text-txt sm:line-clamp-none",title:a.label,children:a.label})]}),(0,b.jsxs)("div",{className:"relative",style:{width:r,height:i},children:[o.map(a=>(0,b.jsx)("span",{"aria-hidden":!0,className:"absolute inset-y-0 w-px bg-border opacity-60",style:{left:a.x}},a.x)),"active"===l&&n.slice(1).map(a=>(0,b.jsx)("span",{"aria-hidden":!0,className:"absolute inset-y-0 border-l border-dashed border-border2",style:{left:a.x-28}},a.startMs)),null!=s&&(0,b.jsx)("span",{"aria-hidden":!0,className:"absolute inset-y-0 z-10 w-px bg-accent",style:{left:s}}),c.map(({task:a,bar:c},d)=>{var i;let j,k=bj(n,c.startMs)??0,l=Math.max(4,(bj(n,c.endMs)??k)-k),m=10+(g?0:d)*20,o=e.has(a.id),p=c.open&&"in-progress"===c.status,q=p?`${a.id} \xb7 in progress since ${bf(c.startMs)}`:c.open?`${a.id} \xb7 ${T.STATUS_META[c.status].label.toLowerCase()}, first moved ${bg(c.startMs)} ${bf(c.startMs)}`:`${a.id} \xb7 worked ${bg(c.startMs)} ${bf(c.startMs)}–${bf(c.endMs)}`,r=(i=a.due,(j=i?.match(/^(\d{4})-(\d{2})-(\d{2})$/))?new Date(Number(j[1]),Number(j[2])-1,Number(j[3])).getTime():null),s=null==r?null:bj(n,r);return(0,b.jsxs)("div",{children:[(0,b.jsx)("button",{type:"button",title:`${q} — ${a.title}`,"aria-label":`${q} — ${a.title}`,onClick:()=>f(a),className:(0,y.cn)("absolute h-3.5 origin-left animate-grow-x rounded-[3px] outline-none transition-opacity duration-(--duration-fast) ease-out-soft hover:opacity-80","focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-1 focus-visible:ring-offset-bg",p?"bg-amber":"done"===c.status?"bg-teal":"bg-border2"),style:{left:k,width:l,top:m+3,animationDelay:`${Math.min(40*h,240)}ms`}}),!g&&(0,b.jsxs)("span",{className:(0,y.cn)("pointer-events-none absolute font-mono text-[10px] leading-[14px] whitespace-nowrap",p?"text-txt":"text-muted"),style:{left:k+l+6,top:m+3},children:[a.id,p&&(o?" · agent working":" · in progress")]}),null!=s&&(0,b.jsx)(bl,{x:s,top:m+3,due:a.due})]},a.id)}),d.map((a,d)=>{let e=10+(c.length+d)*20;return(0,b.jsxs)("button",{type:"button",onClick:()=>f(a),title:`${a.id} \xb7 planned — ${a.title}`,"aria-label":`${a.id} \xb7 planned — ${a.title}`,className:"group absolute flex items-center gap-1.5 rounded-sm outline-none focus-visible:ring-2 focus-visible:ring-accent",style:{left:j,top:e+3},children:[(0,b.jsx)("span",{"aria-hidden":!0,className:"h-3.5 w-6 rounded-[3px] border border-dashed border-muted transition-colors duration-(--duration-fast) group-hover:border-txt"}),(0,b.jsxs)("span",{className:"font-mono text-[10px] leading-[14px] whitespace-nowrap text-txt",children:[a.id," · planned"]})]},a.id)})]})]},a.key)})]})}),(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-x-4 gap-y-2 text-[11px] text-muted",children:[(0,b.jsxs)("span",{className:"flex items-center gap-1.5",children:[(0,b.jsx)("span",{"aria-hidden":!0,className:"h-2 w-[18px] rounded-sm bg-teal"}),"Worked: first move to In progress → Done (activity log)"]}),(0,b.jsxs)("span",{className:"flex items-center gap-1.5",children:[(0,b.jsx)("span",{"aria-hidden":!0,className:"h-2 w-[18px] rounded-sm bg-amber"}),"In progress now"]}),(0,b.jsxs)("span",{className:"flex items-center gap-1.5",children:[(0,b.jsx)("span",{"aria-hidden":!0,className:"h-2 w-[18px] rounded-sm border border-dashed border-muted"}),"Planned: queued in dependency order"]}),(0,b.jsxs)("span",{className:"flex items-center gap-1.5",children:[(0,b.jsx)("span",{"aria-hidden":!0,className:"size-2.5 rotate-45 border border-txt"}),x?"Due date":"Due date (none set in these tasks)"]})]})]})}function bl({x:a,top:c,due:d}){return(0,b.jsx)("span",{role:"img","aria-label":`Due ${d}`,title:`Due ${d}`,className:"absolute size-2.5 -translate-x-1/2 rotate-45 border border-txt bg-bg",style:{left:a,top:c+2}})}let bm={name:"chevron-up",size:24,node:[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]]};bm.node;let bn=(0,j.default)(bm);var bo=a.i(717143),bp=a.i(890728);async function bq(a,b){let c=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(b)}),d=await c.json().catch(()=>null);if(!c.ok)throw Error(d?.error??`Request failed (${c.status})`);return d}let br="inline-flex h-8 items-center gap-1.5 rounded-md px-2.5 text-xs text-txt hover:bg-surface transition-colors";function bs({ids:a,onClear:d}){let{rootParam:f}=(0,e.useApp)(),[g,h]=(0,c.useState)([]),[i,j]=(0,c.useState)(!1),[k,l]=(0,c.useState)(!1),m=(0,U.useStatusDefs)();async function n(b,c){j(!0);try{let e=await bq(`/api/tasks/bulk${f}`,{ids:a,action:b});d(),c?.(e)}catch(a){(0,aG.toast)(a.message)}finally{j(!1)}}(0,c.useEffect)(()=>{fetch(`/api/roadmap${f}`).then(a=>a.ok?a.json():null).then(a=>h((a?.items??[]).filter(a=>null!==a.parent&&"done"!==a.status))).catch(()=>h([]))},[f]);let o=()=>n({delete:!0},({deleted:a})=>{(0,aG.undoToast)(`Deleted ${a.length} task${1===a.length?"":"s"}`,async()=>{for(let{task:b,links:c}of[...a].reverse())await bq(`/api/tasks/restore${f}`,{file:b.file,raw:b.raw,links:c})})});return(0,bp.useItemCommands)(`${a.length} selected task${1===a.length?"":"s"}`,[{action:"status",label:"Change status…",run:()=>l(!0)},{action:"remove",label:`Delete ${a.length} task${1===a.length?"":"s"}`,run:o}]),(0,b.jsxs)("div",{role:"toolbar","aria-label":"Bulk actions",className:"fixed bottom-6 left-1/2 z-50 flex -translate-x-1/2 animate-slide-in items-center gap-1 rounded-lg border border-border bg-surface2 p-1 pl-3 shadow-xl",children:[(0,b.jsxs)("span",{className:"mr-1 font-mono text-xs tabular-nums text-txt",children:[a.length," selected"]}),(0,b.jsxs)(z.DropdownMenu,{open:k,onOpenChange:l,children:[(0,b.jsx)(z.DropdownMenuTrigger,{asChild:!0,children:(0,b.jsxs)("button",{type:"button",disabled:i,className:br,children:["Status ",(0,b.jsx)(bn,{className:"size-3.5 text-muted"})]})}),(0,b.jsx)(z.DropdownMenuContent,{side:"top",className:"w-44",children:m.map(a=>(0,b.jsxs)(z.DropdownMenuItem,{onSelect:()=>n({status:a.id}),children:[(0,b.jsx)(T.StatusIcon,{status:a.id})," ",a.label]},a.id))})]}),(0,b.jsxs)(z.DropdownMenu,{children:[(0,b.jsx)(z.DropdownMenuTrigger,{asChild:!0,children:(0,b.jsxs)("button",{type:"button",disabled:i,className:br,children:[(0,b.jsx)(bo.FolderInput,{className:"size-3.5 text-muted"})," Epic ",(0,b.jsx)(bn,{className:"size-3.5 text-muted"})]})}),(0,b.jsxs)(z.DropdownMenuContent,{side:"top",className:"max-h-72 w-64 overflow-y-auto",children:[g.map(a=>(0,b.jsxs)(z.DropdownMenuItem,{onSelect:()=>n({epic:a.id}),children:[(0,b.jsx)("span",{className:"font-mono text-[11px] text-muted",children:a.id})," ",(0,b.jsx)("span",{className:"truncate",children:a.title})]},a.id)),g.length>0&&(0,b.jsx)(z.DropdownMenuSeparator,{}),(0,b.jsx)(z.DropdownMenuItem,{onSelect:()=>n({epic:null}),children:"No epic"})]})]}),(0,b.jsxs)("button",{type:"button",disabled:i,onClick:o,className:`${br} text-danger hover:text-danger`,children:[(0,b.jsx)(x.Trash2,{className:"size-3.5"})," Delete"]}),(0,b.jsx)("button",{type:"button","aria-label":"Clear selection",onClick:d,className:"grid size-8 place-items-center rounded-md text-muted hover:bg-surface hover:text-txt",children:(0,b.jsx)(S.X,{className:"size-4"})})]})}let bt=i.DEFAULT_VIEWS.map(a=>a.id),bu=["view","g","sg","s","f","q","p","sc"];function bv(a){let b=i.DEFAULT_VIEWS.find(b=>b.id===a.id);return!!b&&(a.name!==b.name||(0,i.isDirty)((({id:a,name:b,...c})=>c)(a),b))}function bw({tasks:a,onMoveTask:j,onOpenTask:k,onNewTask:l}){let{rootParam:m}=(0,e.useApp)(),{agents:n}=(0,g.useChats)(),o=(0,d.useSearchParams)(),[p,q]=(0,c.useState)(i.DEFAULT_VIEWS),[r,s]=(0,c.useState)(!1),[t,u]=(0,c.useState)([]),[v,w]=(0,c.useState)(!1),[x,y]=(0,c.useState)(new Set),z=(0,c.useCallback)(()=>{fetch(`/api/views${m}`).then(a=>a.ok?a.json():Promise.reject(Error(`HTTP ${a.status}`))).then(a=>{var b;let c;return q((c=new Map((b=a.views??[]).map(a=>[a.id,a])),[...i.DEFAULT_VIEWS.map(a=>c.get(a.id)??a),...b.filter(a=>!bt.includes(a.id))]))}).catch(a=>console.warn("[vibedoc] could not load views:",a))},[m]);(0,c.useEffect)(()=>{z();let a=a=>{a.detail?.type==="views_updated"&&z()};return window.addEventListener("vibedoc:sse",a),()=>window.removeEventListener("vibedoc:sse",a)},[z]);let A=(0,c.useCallback)(a=>{q(a),fetch(`/api/views${m}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({views:a.filter(a=>!bt.includes(a.id)||bv(a))})}).then(a=>{if(!a.ok)throw Error(`HTTP ${a.status}`)}).catch(a=>{console.warn("[vibedoc] could not save views:",a),z()})},[m,z]),B=o.get("v"),C=bu.some(a=>o.has(a)),D=o.toString(),E=(0,c.useMemo)(()=>(0,i.fromParams)(new URLSearchParams(D)),[D]),G=p.find(a=>a.id===B)??p.find(a=>a.id===E.kind)??p[0],H=(0,c.useMemo)(()=>C?E:(({id:a,name:b,...c})=>c)(G),[C,E,G]),I=(0,i.isDirty)(H,G),J=(0,c.useCallback)((a,b)=>{let c=new URLSearchParams(window.location.search);for(let a of[...bu,"v"])c.delete(a);if(c.set("v",a),b){let a=(0,i.toParams)(b);[...a.keys()].length||a.set("view",b.kind),a.forEach((a,b)=>c.set(b,a))}window.history.replaceState(null,"",`${window.location.pathname}?${c}`)},[]),K=a=>J(G.id,a),L=(0,c.useCallback)(a=>{s(!1);let b=p.find(b=>b.id===a)?.kind,c=document.querySelector("[data-board-view]");b&&c&&"startViewTransition"in document?document.startViewTransition(()=>new Promise(d=>{let e=()=>{f.disconnect(),clearTimeout(g),d()},f=new MutationObserver(()=>{c.dataset.boardView===b&&e()}),g=setTimeout(e,300);f.observe(c,{attributes:!0,attributeFilter:["data-board-view"]}),J(a,null),c.dataset.boardView===b&&e()})):J(a,null)},[J,p]),M=a=>{let b,c=(b=a,`${b.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,30)||"view"}-${Math.random().toString(36).slice(2,6)}`);A([...p,{...H,q:"",id:c,name:a}]),J(c,null)},N=(0,c.useMemo)(()=>new Set(Object.keys(n).filter(a=>a.startsWith("task:")).map(a=>a.slice(5))),[n]),O=(0,c.useMemo)(()=>(0,i.applyView)(a,H,{agentTasks:N}),[a,H,N]),P=(0,c.useMemo)(()=>{let b=new Map;for(let c of a){let a=(0,i.epicOf)(c.phase);if(!a.id)continue;let d=b.get(a.id)??{id:a.id,title:a.title,open:!1};d.title||(d.title=a.title),"done"!==c.status&&"cancelled"!==c.status&&(d.open=!0),b.set(a.id,d)}return[...b.values()].sort((a,b)=>a.id.localeCompare(b.id,void 0,{numeric:!0}))},[a]),Q="timeline"===H.kind;(0,c.useEffect)(()=>{if(!Q)return;let a=!0,b=()=>{w(!0),fetch(`/api/activity${m}&limit=2000`).then(a=>a.ok?a.json():Promise.reject(Error(`HTTP ${a.status}`))).then(b=>{a&&u(Array.isArray(b)?b:[])}).catch(a=>console.warn("[vibedoc] could not load activity:",a)).finally(()=>{a&&w(!1)})},c=a=>{let c=a.detail?.type;"chat_saved"!==c&&"views_updated"!==c&&b()};return b(),window.addEventListener("vibedoc:sse",c),()=>{a=!1,window.removeEventListener("vibedoc:sse",c)}},[Q,m]);let R=p.map(a=>a.id).join(","),S=G.id;(0,c.useEffect)(()=>{function a(a){if(!(0,h.shouldHandleShortcut)(a)||document.querySelector("[role=dialog]"))return;let b=Number(a.key),c=R.split(",");if("v"===a.key)L(c[(c.indexOf(S)+1)%c.length]);else if(b>=1&&b<=4)L(bt[b-1]);else if("f"===a.key)s(!0);else{if("n"!==a.key)return;l()}a.preventDefault()}return window.addEventListener("keydown",a),()=>window.removeEventListener("keydown",a)},[R,S,L,l]);let T=(0,c.useMemo)(()=>new Set(O.map(a=>a.id).filter(a=>x.has(a))),[O,x]),U=(0,c.useCallback)((a,b)=>y(c=>{let d=new Set(c);for(let c of a)b??!d.has(c)?d.add(c):d.delete(c);return d}),[]),V=(0,c.useCallback)(()=>y(new Set),[]);(0,c.useEffect)(()=>{if(0===T.size)return;let a=a=>{"Escape"!==a.key||document.querySelector("[role=dialog],[role=menu]")||V()};return window.addEventListener("keydown",a),()=>window.removeEventListener("keydown",a)},[T.size,V]);let W=(...b)=>a.filter(a=>b.includes(a.status)).length,X={tasks:O,allTasks:a,state:H,agentTasks:N,onOpenTask:k,selected:T,onToggleSelect:U};return(0,b.jsxs)("div",{className:"flex min-w-0 flex-col",children:[(0,b.jsxs)("header",{className:"flex items-end gap-6 px-4 pt-8 sm:px-8",children:[(0,b.jsxs)("div",{className:"min-w-0 grow",children:[(0,b.jsx)("h1",{className:"text-[1.6rem] leading-tight font-semibold tracking-[-0.02em] text-txt",children:"Board"}),(0,b.jsxs)("p",{className:"mt-2 text-[1.1rem] leading-snug font-semibold text-txt",children:[(0,b.jsx)("span",{className:"font-mono tabular-nums",children:W("todo","in-progress","review","blocked")})," open ·"," ",(0,b.jsx)("span",{className:"font-mono tabular-nums",children:W("in-progress")})," in progress"," ",(0,b.jsxs)("span",{className:"font-normal text-muted",children:["· ",(0,b.jsx)("span",{className:"font-mono tabular-nums",children:W("done")})," done"]})]})]}),(0,b.jsxs)("button",{type:"button",onClick:l,className:"inline-flex h-8.5 shrink-0 items-center gap-1.5 whitespace-nowrap rounded-md bg-accent px-3 text-[13px] font-medium text-accent-fg transition-colors duration-(--duration-fast) ease-out-soft hover:bg-accent/90 focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-bg",children:[(0,b.jsx)(f.Plus,{"aria-hidden":!0,className:"size-[15px]"}),"New task",(0,b.jsx)("kbd",{className:"rounded-sm border border-accent-fg/25 bg-accent-fg/15 px-1 py-0.5 font-mono text-[10px] leading-none max-sm:hidden",children:"n"})]})]}),(0,b.jsx)("div",{className:"mt-[18px] px-4 sm:px-8",children:(0,b.jsx)(F,{views:p,activeId:S,onSelect:L,onNew:()=>M("New view"),onRename:(a,b)=>A(p.map(c=>c.id===a?{...c,name:b}:c)),onDelete:a=>{let b=p.find(b=>b.id===a);return!!b&&!!window.confirm(`Delete the view "${b.name}"? Tasks are not affected.`)&&(A(p.filter(b=>b.id!==a)),G.id===a&&J(b.kind,null),!0)},customizedIds:p.filter(bv).map(a=>a.id),onRestore:a=>{let b=i.DEFAULT_VIEWS.find(b=>b.id===a);b&&(A(p.map(c=>c.id===a?b:c)),J(a,null))}})}),(0,b.jsx)("div",{className:"px-4 pt-3 sm:px-8",children:(0,b.jsx)(al,{state:H,onChange:K,epics:P,dirty:I,activeIsBuiltIn:bt.includes(S),onSave:()=>A(p.map(a=>a.id===G.id?{...H,q:"",id:a.id,name:a.name}:a)),onSaveAs:M,onReset:()=>L(S),searchInputId:"board-search",filterOpen:r,onFilterOpenChange:s})}),(0,b.jsx)("div",{"data-board-view":H.kind,className:"[view-transition-name:board-view-body]",children:"epic"===H.kind?(0,b.jsx)(ba,{...X}):(0,b.jsxs)("div",{className:"min-w-0 px-4 pt-[18px] pb-8 sm:px-8",children:["board"===H.kind&&(0,b.jsx)(aR,{...X,onMoveTask:j}),"table"===H.kind&&(0,b.jsx)(a2,{...X,onSort:a=>K({...H,sorts:a})}),Q&&(0,b.jsx)(bk,{...X,events:t,loading:v,onScale:a=>K({...H,scale:a})})]})}),T.size>0&&(0,b.jsx)(bs,{ids:[...T],onClear:V})]})}var bx=a.i(536236),by=a.i(923053),bz=a.i(108280);let bA=[{value:"XS (< 1 hr)",label:"XS — under 1 hr"},{value:"S (1-2 hrs)",label:"S — 1–2 hrs"},{value:"M (3-4 hrs)",label:"M — 3–4 hrs"},{value:"L (5-8 hrs)",label:"L — 5–8 hrs"},{value:"XL (> 1 day)",label:"XL — over a day"}];function bB({open:a,onOpenChange:d,rootParam:e,onTaskCreated:g}){let[h,i]=(0,c.useState)(""),[j,k]=(0,c.useState)(""),[l,m]=(0,c.useState)(""),[n,o]=(0,c.useState)(""),[p,q]=(0,c.useState)(""),[r,s]=(0,c.useState)(""),[t,u]=(0,c.useState)(!1);async function v(a){if(a.preventDefault(),!h.trim())return void s("Title is required");u(!0),s("");try{let a=await fetch(`/api/tasks/create${e}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({title:h.trim(),phase:j.trim()||void 0,size:l||void 0,description:n.trim()||void 0,dependsOn:p.trim()||void 0})});if(!a.ok){let b=await a.json();s(b.error??"Failed to create task"),u(!1);return}u(!1),g(),d(!1)}catch{s("Network error — please try again"),u(!1)}}return(0,c.useEffect)(()=>{a&&(i(""),k(""),m(""),o(""),q(""),s(""),u(!1))},[a]),(0,b.jsx)(by.Root,{open:a,onOpenChange:d,children:(0,b.jsxs)(by.Portal,{children:[(0,b.jsx)(by.Overlay,{className:"fixed inset-0 z-50 bg-black/60"}),(0,b.jsxs)(by.Content,{className:"fixed z-50 top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-full max-w-lg bg-surface border border-border rounded-xl shadow-2xl",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between px-5 py-4 border-b border-border",children:[(0,b.jsx)(by.Title,{className:"font-semibold text-txt",children:"New Task"}),(0,b.jsx)(by.Close,{className:"text-muted hover:text-txt transition-colors",children:(0,b.jsx)(S.X,{className:"w-4 h-4"})})]}),(0,b.jsxs)("form",{onSubmit:v,className:"p-5 space-y-4",children:[(0,b.jsxs)("div",{className:"space-y-1.5",children:[(0,b.jsxs)("label",{className:"block text-xs font-medium text-muted uppercase tracking-wide",children:["Title ",(0,b.jsx)("span",{className:"text-danger",children:"*"})]}),(0,b.jsx)("input",{autoFocus:!0,type:"text",value:h,onChange:a=>i(a.target.value),placeholder:"e.g. Add drag-and-drop to kanban",className:"w-full px-3 py-2 bg-surface2 border border-border rounded-lg text-sm text-txt placeholder:text-muted focus:outline-hidden focus:border-accent transition-colors"})]}),(0,b.jsxs)("div",{className:"grid grid-cols-2 gap-3",children:[(0,b.jsxs)("div",{className:"space-y-1.5",children:[(0,b.jsx)("label",{className:"block text-xs font-medium text-muted uppercase tracking-wide",children:"Phase"}),(0,b.jsx)("input",{type:"text",value:j,onChange:a=>k(a.target.value),placeholder:"e.g. 1 — Core",className:"w-full px-3 py-2 bg-surface2 border border-border rounded-lg text-sm text-txt placeholder:text-muted focus:outline-hidden focus:border-accent transition-colors"})]}),(0,b.jsxs)("div",{className:"space-y-1.5",children:[(0,b.jsx)("label",{className:"block text-xs font-medium text-muted uppercase tracking-wide",children:"Size"}),(0,b.jsxs)("select",{value:l,onChange:a=>m(a.target.value),className:"w-full px-3 py-2 bg-surface2 border border-border rounded-lg text-sm text-txt focus:outline-hidden focus:border-accent transition-colors",children:[(0,b.jsx)("option",{value:"",children:"—"}),bA.map(a=>(0,b.jsx)("option",{value:a.value,children:a.label},a.value))]})]})]}),(0,b.jsxs)("div",{className:"space-y-1.5",children:[(0,b.jsx)("label",{className:"block text-xs font-medium text-muted uppercase tracking-wide",children:"Depends on"}),(0,b.jsx)("input",{type:"text",value:p,onChange:a=>q(a.target.value),placeholder:"e.g. T001, T003",className:"w-full px-3 py-2 bg-surface2 border border-border rounded-lg text-sm text-txt placeholder:text-muted focus:outline-hidden focus:border-accent transition-colors"})]}),(0,b.jsxs)("div",{className:"space-y-1.5",children:[(0,b.jsx)("label",{className:"block text-xs font-medium text-muted uppercase tracking-wide",children:"Description"}),(0,b.jsx)("textarea",{value:n,onChange:a=>o(a.target.value),placeholder:"What needs to be built?",rows:3,className:"w-full px-3 py-2 bg-surface2 border border-border rounded-lg text-sm text-txt placeholder:text-muted focus:outline-hidden focus:border-accent transition-colors resize-none"})]}),r&&(0,b.jsx)("p",{className:"text-sm text-danger",children:r}),(0,b.jsxs)("div",{className:"flex items-center justify-end gap-2 pt-1",children:[(0,b.jsx)(by.Close,{type:"button",className:"px-4 py-2 text-sm text-muted hover:text-txt transition-colors",children:"Cancel"}),(0,b.jsxs)("button",{type:"submit",disabled:t||!h.trim(),className:(0,y.cn)("flex items-center gap-2 px-4 py-2 rounded-lg text-sm font-medium transition-colors","bg-accent text-accent-fg hover:bg-accent/90 disabled:opacity-50 disabled:cursor-not-allowed"),children:[t?(0,b.jsx)(bz.Loader2,{className:"w-4 h-4 animate-spin"}):(0,b.jsx)(f.Plus,{className:"w-4 h-4"}),t?"Creating…":"Create Task"]})]})]})]})]})})}function bC(){let{board:a,moveTask:f,refresh:g,rootParam:h}=(0,e.useApp)(),i=(0,d.useRouter)(),[j,k]=(0,c.useState)(null),l=(0,d.useSearchParams)().get("task"),[m,n]=(0,c.useState)(null);a&&l!==m&&(n(l),l&&Object.values(a).flat().some(a=>a.id===l)&&k(l));let[o,p]=(0,c.useState)(!1),q=(0,c.useMemo)(()=>a?Object.values(a).flat():[],[a]),r=q.find(a=>a.id===j)??null;return a?(0,b.jsxs)("div",{className:"relative min-w-0 flex-1",children:[(0,b.jsx)(bw,{tasks:q,onMoveTask:f,onOpenTask:a=>k(a.id),onNewTask:()=>p(!0)}),(0,b.jsx)(bx.TaskDetailPanel,{task:r,onClose:()=>{let a;k(null),l&&((a=new URLSearchParams(window.location.search)).delete("task"),i.replace(a.size?`/board?${a}`:"/board",{scroll:!1}))},onMove:f}),(0,b.jsx)(bB,{open:o,onOpenChange:p,rootParam:h,onTaskCreated:g})]}):null}a.s(["default",0,function(){return(0,b.jsx)(c.Suspense,{children:(0,b.jsx)(bC,{})})}],90751)}];
2
+
3
+ //# sourceMappingURL=src_app_%28app%29_board_page_tsx_0gpfc77._.js.map