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.
- package/.next/BUILD_ID +1 -1
- package/.next/app-path-routes-manifest.json +11 -0
- package/.next/build-manifest.json +3 -3
- package/.next/prerender-manifest.json +69 -13
- package/.next/routes-manifest.json +66 -0
- package/.next/server/app/(app)/activity/page.js.nft.json +1 -1
- package/.next/server/app/(app)/activity/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/board/page.js.nft.json +1 -1
- package/.next/server/app/(app)/board/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/chat/page/app-paths-manifest.json +3 -0
- package/.next/server/app/(app)/chat/page/build-manifest.json +20 -0
- package/.next/server/app/(app)/chat/page/next-font-manifest.json +11 -0
- package/.next/server/app/(app)/chat/page/react-loadable-manifest.json +1 -0
- package/.next/server/app/(app)/chat/page/server-reference-manifest.json +4 -0
- package/.next/server/app/(app)/chat/page.js +15 -0
- package/.next/server/app/(app)/chat/page.js.map +5 -0
- package/.next/server/app/(app)/chat/page.js.nft.json +1 -0
- package/.next/server/app/(app)/chat/page_client-reference-manifest.js +3 -0
- package/.next/server/app/(app)/docs/page.js.nft.json +1 -1
- package/.next/server/app/(app)/docs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/explorer/page.js.nft.json +1 -1
- package/.next/server/app/(app)/explorer/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/manual-tests/page/app-paths-manifest.json +3 -0
- package/.next/server/app/(app)/manual-tests/page/build-manifest.json +20 -0
- package/.next/server/app/(app)/manual-tests/page/next-font-manifest.json +11 -0
- package/.next/server/app/(app)/manual-tests/page/react-loadable-manifest.json +1 -0
- package/.next/server/app/(app)/manual-tests/page/server-reference-manifest.json +4 -0
- package/.next/server/app/(app)/manual-tests/page.js +15 -0
- package/.next/server/app/(app)/manual-tests/page.js.map +5 -0
- package/.next/server/app/(app)/manual-tests/page.js.nft.json +1 -0
- package/.next/server/app/(app)/manual-tests/page_client-reference-manifest.js +3 -0
- package/.next/server/app/(app)/memory/page.js.nft.json +1 -1
- package/.next/server/app/(app)/memory/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/roadmap/page.js.nft.json +1 -1
- package/.next/server/app/(app)/roadmap/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/settings/page.js.nft.json +1 -1
- package/.next/server/app/(app)/settings/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/setup/page.js.nft.json +1 -1
- package/.next/server/app/(app)/setup/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +3 -2
- package/.next/server/app/_not-found.segments/_full.segment.rsc +3 -2
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +3 -2
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +3 -2
- package/.next/server/app/activity.html +1 -1
- package/.next/server/app/activity.rsc +14 -13
- package/.next/server/app/activity.segments/!KGFwcCk/activity/__PAGE__.segment.rsc +10 -10
- package/.next/server/app/activity.segments/_full.segment.rsc +14 -13
- package/.next/server/app/activity.segments/_tree.segment.rsc +3 -2
- package/.next/server/app/api/activity/route.js +2 -2
- package/.next/server/app/api/activity/route.js.nft.json +1 -1
- package/.next/server/app/api/backlinks/route.js +2 -2
- package/.next/server/app/api/backlinks/route.js.nft.json +1 -1
- package/.next/server/app/api/chat/route.js +1 -1
- package/.next/server/app/api/chat/route.js.nft.json +1 -1
- package/.next/server/app/api/context/route.js +2 -2
- package/.next/server/app/api/context/route.js.nft.json +1 -1
- package/.next/server/app/api/conversations/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/conversations/route/build-manifest.json +12 -0
- package/.next/server/app/api/conversations/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/conversations/route.js +9 -0
- package/.next/server/app/api/conversations/route.js.map +5 -0
- package/.next/server/app/api/conversations/route.js.nft.json +1 -0
- package/.next/server/app/api/conversations/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/decisions/route.js +2 -2
- package/.next/server/app/api/decisions/route.js.nft.json +1 -1
- package/.next/server/app/api/docs/route.js +1 -1
- package/.next/server/app/api/docs/route.js.nft.json +1 -1
- package/.next/server/app/api/explorer/route.js +2 -2
- package/.next/server/app/api/explorer/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/route.js +1 -1
- package/.next/server/app/api/mcp/route.js.nft.json +1 -1
- package/.next/server/app/api/memory/route.js +2 -2
- package/.next/server/app/api/memory/route.js.nft.json +1 -1
- package/.next/server/app/api/plan/apply/route.js +3 -3
- package/.next/server/app/api/plan/apply/route.js.nft.json +1 -1
- package/.next/server/app/api/projects/route.js +2 -2
- package/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/.next/server/app/api/registry/route.js +2 -2
- package/.next/server/app/api/registry/route.js.nft.json +1 -1
- package/.next/server/app/api/roadmap/create/route.js +3 -3
- package/.next/server/app/api/roadmap/create/route.js.nft.json +1 -1
- package/.next/server/app/api/roadmap/delete/route.js +3 -3
- package/.next/server/app/api/roadmap/delete/route.js.nft.json +1 -1
- package/.next/server/app/api/roadmap/generate/route.js +3 -3
- package/.next/server/app/api/roadmap/generate/route.js.nft.json +1 -1
- package/.next/server/app/api/roadmap/layout/route.js +3 -3
- package/.next/server/app/api/roadmap/layout/route.js.nft.json +1 -1
- package/.next/server/app/api/roadmap/restore/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/roadmap/restore/route/build-manifest.json +12 -0
- package/.next/server/app/api/roadmap/restore/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/roadmap/restore/route.js +9 -0
- package/.next/server/app/api/roadmap/restore/route.js.map +5 -0
- package/.next/server/app/api/roadmap/restore/route.js.nft.json +1 -0
- package/.next/server/app/api/roadmap/restore/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/roadmap/route.js +3 -3
- package/.next/server/app/api/roadmap/route.js.nft.json +1 -1
- package/.next/server/app/api/roadmap/update/route.js +3 -3
- package/.next/server/app/api/roadmap/update/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/route.js +2 -2
- package/.next/server/app/api/sessions/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/route.js +3 -3
- package/.next/server/app/api/settings/route.js.nft.json +1 -1
- package/.next/server/app/api/setup/generate/route.js +1 -1
- package/.next/server/app/api/setup/generate/route.js.nft.json +1 -1
- package/.next/server/app/api/setup/write/route.js +2 -2
- package/.next/server/app/api/setup/write/route.js.nft.json +1 -1
- package/.next/server/app/api/summary/route.js +2 -2
- package/.next/server/app/api/summary/route.js.nft.json +1 -1
- package/.next/server/app/api/tasks/bulk/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/tasks/bulk/route/build-manifest.json +12 -0
- package/.next/server/app/api/tasks/bulk/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/tasks/bulk/route.js +9 -0
- package/.next/server/app/api/tasks/bulk/route.js.map +5 -0
- package/.next/server/app/api/tasks/bulk/route.js.nft.json +1 -0
- package/.next/server/app/api/tasks/bulk/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/tasks/create/route.js +2 -2
- package/.next/server/app/api/tasks/create/route.js.nft.json +1 -1
- package/.next/server/app/api/tasks/delete/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/tasks/delete/route/build-manifest.json +12 -0
- package/.next/server/app/api/tasks/delete/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/tasks/delete/route.js +9 -0
- package/.next/server/app/api/tasks/delete/route.js.map +5 -0
- package/.next/server/app/api/tasks/delete/route.js.nft.json +1 -0
- package/.next/server/app/api/tasks/delete/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/tasks/manual-tests/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/tasks/manual-tests/route/build-manifest.json +12 -0
- package/.next/server/app/api/tasks/manual-tests/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/tasks/manual-tests/route.js +8 -0
- package/.next/server/app/api/tasks/manual-tests/route.js.map +5 -0
- package/.next/server/app/api/tasks/manual-tests/route.js.nft.json +1 -0
- package/.next/server/app/api/tasks/manual-tests/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/tasks/restore/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/tasks/restore/route/build-manifest.json +12 -0
- package/.next/server/app/api/tasks/restore/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/tasks/restore/route.js +9 -0
- package/.next/server/app/api/tasks/restore/route.js.map +5 -0
- package/.next/server/app/api/tasks/restore/route.js.nft.json +1 -0
- package/.next/server/app/api/tasks/restore/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/tasks/review/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/tasks/review/route/build-manifest.json +12 -0
- package/.next/server/app/api/tasks/review/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/tasks/review/route.js +9 -0
- package/.next/server/app/api/tasks/review/route.js.map +5 -0
- package/.next/server/app/api/tasks/review/route.js.nft.json +1 -0
- package/.next/server/app/api/tasks/review/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/tasks/route.js +2 -2
- package/.next/server/app/api/tasks/route.js.nft.json +1 -1
- package/.next/server/app/api/tasks/update/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/tasks/update/route/build-manifest.json +12 -0
- package/.next/server/app/api/tasks/update/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/tasks/update/route.js +9 -0
- package/.next/server/app/api/tasks/update/route.js.map +5 -0
- package/.next/server/app/api/tasks/update/route.js.nft.json +1 -0
- package/.next/server/app/api/tasks/update/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/views/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/views/route/build-manifest.json +12 -0
- package/.next/server/app/api/views/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/views/route.js +9 -0
- package/.next/server/app/api/views/route.js.map +5 -0
- package/.next/server/app/api/views/route.js.nft.json +1 -0
- package/.next/server/app/api/views/route_client-reference-manifest.js +3 -0
- package/.next/server/app/board.html +1 -1
- package/.next/server/app/board.rsc +14 -13
- package/.next/server/app/board.segments/!KGFwcCk/board/__PAGE__.segment.rsc +10 -10
- package/.next/server/app/board.segments/_full.segment.rsc +14 -13
- package/.next/server/app/board.segments/_tree.segment.rsc +3 -2
- package/.next/server/app/chat.html +1 -0
- package/.next/server/app/chat.meta +31 -0
- package/.next/server/app/chat.rsc +31 -0
- package/.next/server/app/chat.segments/!KGFwcCk/chat/__PAGE__.segment.rsc +34 -0
- package/.next/server/app/chat.segments/_full.segment.rsc +31 -0
- package/.next/server/app/chat.segments/_tree.segment.rsc +5 -0
- package/.next/server/app/docs.html +1 -1
- package/.next/server/app/docs.rsc +24 -27
- package/.next/server/app/docs.segments/!KGFwcCk/docs/__PAGE__.segment.rsc +7 -6
- package/.next/server/app/docs.segments/_full.segment.rsc +24 -27
- package/.next/server/app/docs.segments/_tree.segment.rsc +3 -2
- package/.next/server/app/explorer.html +1 -1
- package/.next/server/app/explorer.rsc +14 -13
- package/.next/server/app/explorer.segments/!KGFwcCk/explorer/__PAGE__.segment.rsc +6 -5
- package/.next/server/app/explorer.segments/_full.segment.rsc +14 -13
- package/.next/server/app/explorer.segments/_tree.segment.rsc +3 -2
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +3 -2
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +3 -2
- package/.next/server/app/index.segments/_full.segment.rsc +3 -2
- package/.next/server/app/index.segments/_tree.segment.rsc +3 -2
- package/.next/server/app/manual-tests.html +1 -0
- package/.next/server/app/manual-tests.meta +31 -0
- package/.next/server/app/manual-tests.rsc +31 -0
- package/.next/server/app/manual-tests.segments/!KGFwcCk/manual-tests/__PAGE__.segment.rsc +33 -0
- package/.next/server/app/manual-tests.segments/_full.segment.rsc +31 -0
- package/.next/server/app/manual-tests.segments/_tree.segment.rsc +5 -0
- package/.next/server/app/memory.html +1 -1
- package/.next/server/app/memory.rsc +14 -13
- package/.next/server/app/memory.segments/!KGFwcCk/memory/__PAGE__.segment.rsc +6 -5
- package/.next/server/app/memory.segments/_full.segment.rsc +14 -13
- package/.next/server/app/memory.segments/_tree.segment.rsc +3 -2
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/roadmap.html +1 -1
- package/.next/server/app/roadmap.rsc +24 -26
- package/.next/server/app/roadmap.segments/!KGFwcCk/roadmap/__PAGE__.segment.rsc +10 -11
- package/.next/server/app/roadmap.segments/_full.segment.rsc +24 -26
- package/.next/server/app/roadmap.segments/_tree.segment.rsc +3 -2
- package/.next/server/app/settings.html +1 -1
- package/.next/server/app/settings.rsc +14 -13
- package/.next/server/app/settings.segments/!KGFwcCk/settings/__PAGE__.segment.rsc +10 -10
- package/.next/server/app/settings.segments/_full.segment.rsc +14 -13
- package/.next/server/app/settings.segments/_tree.segment.rsc +3 -2
- package/.next/server/app/setup.html +1 -1
- package/.next/server/app/setup.rsc +14 -13
- package/.next/server/app/setup.segments/!KGFwcCk/setup/__PAGE__.segment.rsc +6 -5
- package/.next/server/app/setup.segments/_full.segment.rsc +14 -13
- package/.next/server/app/setup.segments/_tree.segment.rsc +3 -2
- package/.next/server/app-paths-manifest.json +11 -0
- package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0-5bkpj._.js → 11mp_@anthropic-ai_sdk_00p3fu1._.js} +1 -1
- package/.next/server/chunks/{11mp_@anthropic-ai_sdk_01l5h3i._.js → 11mp_@anthropic-ai_sdk_01amtux._.js} +1 -1
- package/.next/server/chunks/{11mp_@anthropic-ai_sdk_00psb_y._.js → 11mp_@anthropic-ai_sdk_01jjl08._.js} +1 -1
- package/.next/server/chunks/{11mp_@anthropic-ai_sdk_072r2bd._.js → 11mp_@anthropic-ai_sdk_071zfm8._.js} +1 -1
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_07v3boe._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_09iva72._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0bom1b1._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0dvji7p._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0dzo8jn._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0hvqsqq._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0i7i-jw._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0k0iop5._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0l3-6aq._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0oegm3y._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0p5cyes._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0qw8i6_._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0yk-a7v._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_11fsqvb._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_143_7ez._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_14a4-64._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_17d_oma._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_18qwuyb._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_19au8y6._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1ak_hy5._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1cqa0nq._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1i-x_q0._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1i-x_q0._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1jmtliz._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1jmtliz._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1jouwlj._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1jouwlj._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1r_q5um._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1r_q5um._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1t959xd._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1t959xd._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1vkprw9._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1vkprw9._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1y95ax9._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1y95ax9._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1y9misr._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1y9misr._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_21b8wwy._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_21b8wwy._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_08ecfgc._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_09--sd6._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0e3mwc6._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0go4301._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0iq9dmt._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0n9ijke._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0szcyrx._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0xy2s3x._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0yaujn7._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0z9ly74._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1hmq3al._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1tqk4bp._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1x-hr6f._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1zsdhg0._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_20t__fe._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__1u_q61h._.js → [root-of-the-server]__0-pmfg2._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__02co2yq._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__02co2yq._.js.map +1 -0
- package/.next/server/chunks/{[root-of-the-server]__1y3u5ud._.js → [root-of-the-server]__04tibmn._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__17xb02p._.js → [root-of-the-server]__05g5cgo._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__0aynzrb._.js → [root-of-the-server]__0b5pwze._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__142icjb._.js → [root-of-the-server]__0druay_._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__106gpvh._.js → [root-of-the-server]__0p6ja6l._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__0q3-t8a._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0q3-t8a._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0vcsqzd._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0vcsqzd._.js.map +1 -0
- package/.next/server/chunks/{[root-of-the-server]__0nfvvy9._.js → [root-of-the-server]__1-e3i_5._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__1-ic3af._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1-ic3af._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__11a4ptn._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__11a4ptn._.js.map +1 -0
- package/.next/server/chunks/{[root-of-the-server]__0e59y5j._.js → [root-of-the-server]__11c8641._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__11c8641._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__12nzy_6._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__12nzy_6._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__15ck1wv._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__15ck1wv._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__1613hjb._.js +30 -19
- package/.next/server/chunks/[root-of-the-server]__1613hjb._.js.map +1 -1
- package/.next/server/chunks/{[root-of-the-server]__06zf_sh._.js → [root-of-the-server]__197vw9g._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__1j0rrps._.js → [root-of-the-server]__19k8t87._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__0eqd-tw._.js → [root-of-the-server]__1ezzeji._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__1jxu2x9._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1jxu2x9._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__1mrmaf9._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__17p0rkn._.js → [root-of-the-server]__1n68akx._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__1n68akx._.js.map +1 -0
- package/.next/server/chunks/{[root-of-the-server]__11s76m8._.js → [root-of-the-server]__1npya5q._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__1npya5q._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__1qusy4g._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1qusy4g._.js.map +1 -0
- package/.next/server/chunks/{[root-of-the-server]__1q4ahvz._.js → [root-of-the-server]__1umrorf._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__093hlkh._.js → [root-of-the-server]__1vh9g2o._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__1y-tt29._.js → [root-of-the-server]__1vq38ov._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__1xb0fmp._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__1xb0fmp._.js.map +1 -1
- package/.next/server/chunks/_04byth9._.js +24 -19
- package/.next/server/chunks/_04byth9._.js.map +1 -1
- package/.next/server/chunks/_1au4syj._.js +1 -1
- package/.next/server/chunks/_1au4syj._.js.map +1 -1
- package/.next/server/chunks/_1b5fqxy._.js.map +1 -1
- package/.next/server/chunks/_1ivswa9._.js +3 -0
- package/.next/server/chunks/_1ivswa9._.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_conversations_route_actions_1-pu7gs.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_conversations_route_actions_1-pu7gs.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_roadmap_restore_route_actions_0skshp1.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_roadmap_restore_route_actions_0skshp1.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_tasks_bulk_route_actions_1k75mlb.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_tasks_bulk_route_actions_1k75mlb.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_tasks_delete_route_actions_1k1g6mw.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_tasks_delete_route_actions_1k1g6mw.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_tasks_manual-tests_route_actions_1rpog0y.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_tasks_manual-tests_route_actions_1rpog0y.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_tasks_restore_route_actions_1ecsti8.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_tasks_restore_route_actions_1ecsti8.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_tasks_review_route_actions_1dly07f.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_tasks_review_route_actions_1dly07f.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_tasks_update_route_actions_0z-ho6g.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_tasks_update_route_actions_0z-ho6g.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_views_route_actions_10-2c0e.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_views_route_actions_10-2c0e.js.map +1 -0
- package/.next/server/chunks/ssr/{_0qyglif._.js → 0_g__next_dist_000c5_m._.js} +2 -4
- package/.next/server/chunks/ssr/0_g__next_dist_000c5_m._.js.map +1 -0
- 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
- package/.next/server/chunks/ssr/0_nd_mermaid_dist_mermaid_core_mjs_027n2yl._.js.map +1 -0
- package/.next/server/chunks/ssr/{1u84_katex_dist_katex_mjs_0mwkb-i._.js → 1u84_katex_dist_katex_mjs_1kb5xea._.js} +1 -1
- package/.next/server/chunks/ssr/1u84_katex_dist_katex_mjs_1kb5xea._.js.map +1 -0
- package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_05ggp3i._.js +1 -1
- package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_05ggp3i._.js.map +1 -1
- package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_0wurouw._.js +3 -0
- package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_0wurouw._.js.map +1 -0
- package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_14hl50o._.js +3 -0
- package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_14hl50o._.js.map +1 -0
- package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_folder-open_mjs_117ipzw._.js +3 -0
- package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_folder-open_mjs_117ipzw._.js.map +1 -0
- package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_triangle-alert_mjs_0ei-mpz._.js +3 -0
- package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_triangle-alert_mjs_0ei-mpz._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0hcextx._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0hcextx._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0xt_0w2._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__11lfnu0._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__11lfnu0._.js.map +1 -0
- package/.next/server/chunks/ssr/_04xff_2._.js +1 -1
- package/.next/server/chunks/ssr/_04xff_2._.js.map +1 -1
- package/.next/server/chunks/ssr/_071j6mr._.js +4 -0
- package/.next/server/chunks/ssr/_071j6mr._.js.map +1 -0
- package/.next/server/chunks/ssr/_09b02z-._.js +3 -0
- package/.next/server/chunks/ssr/_09b02z-._.js.map +1 -0
- package/.next/server/chunks/ssr/_0d0f1s1._.js +3 -0
- package/.next/server/chunks/ssr/_0d0f1s1._.js.map +1 -0
- package/.next/server/chunks/ssr/_0idb-vo._.js +151 -0
- package/.next/server/chunks/ssr/_0idb-vo._.js.map +1 -0
- package/.next/server/chunks/ssr/_0lnt_va._.js +4 -0
- package/.next/server/chunks/ssr/_0lnt_va._.js.map +1 -0
- package/.next/server/chunks/ssr/_0qlymco._.js +3 -0
- package/.next/server/chunks/ssr/_0qlymco._.js.map +1 -0
- package/.next/server/chunks/ssr/_0qp3gu7._.js +3 -0
- package/.next/server/chunks/ssr/_0qp3gu7._.js.map +1 -0
- package/.next/server/chunks/ssr/_0sg1oeq._.js +3 -0
- package/.next/server/chunks/ssr/_0sg1oeq._.js.map +1 -0
- package/.next/server/chunks/ssr/_14emfpq._.js +3 -0
- package/.next/server/chunks/ssr/_14emfpq._.js.map +1 -0
- package/.next/server/chunks/ssr/_1ftruw6._.js +4 -0
- package/.next/server/chunks/ssr/_1ftruw6._.js.map +1 -0
- package/.next/server/chunks/ssr/_1gxjjvh._.js +1 -1
- package/.next/server/chunks/ssr/_1gxjjvh._.js.map +1 -1
- package/.next/server/chunks/ssr/_1ncdakv._.js +4 -0
- package/.next/server/chunks/ssr/_1ncdakv._.js.map +1 -0
- package/.next/server/chunks/ssr/_1t76zdx._.js +3 -0
- package/.next/server/chunks/ssr/_1t76zdx._.js.map +1 -0
- package/.next/server/chunks/ssr/_1x7ggg5._.js +4 -0
- package/.next/server/chunks/ssr/_1x7ggg5._.js.map +1 -0
- package/.next/server/chunks/ssr/_next-internal_server_app_(app)_chat_page_actions_0g4tbzt.js +3 -0
- package/.next/server/chunks/ssr/_next-internal_server_app_(app)_chat_page_actions_0g4tbzt.js.map +1 -0
- package/.next/server/chunks/ssr/_next-internal_server_app_(app)_manual-tests_page_actions_1g5zjb7.js +3 -0
- package/.next/server/chunks/ssr/_next-internal_server_app_(app)_manual-tests_page_actions_1g5zjb7.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules__pnpm_0w9uewb._.js → node_modules__pnpm_01bjcv9._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_0p10j87._.js → node_modules__pnpm_03qrzdb._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_1a3fo7j._.js → node_modules__pnpm_06d-fdo._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules__pnpm_1o30a9w._.js → node_modules__pnpm_0ctisl0._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_17o8zbz._.js → node_modules__pnpm_0fwp8jm._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_19ys1iv._.js → node_modules__pnpm_0kpu0-2._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_1r4w_7k._.js → node_modules__pnpm_0vry74x._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules__pnpm_11lluiq._.js → node_modules__pnpm_0ycbjbd._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules__pnpm_1_34wt2._.js → node_modules__pnpm_1-76qxg._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_0ma8hho._.js → node_modules__pnpm_1-r94f7._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_0--x5-5._.js → node_modules__pnpm_14piqi4._.js} +1 -1
- package/.next/server/chunks/ssr/node_modules__pnpm_14piqi4._.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules__pnpm_04xoqd9._.js → node_modules__pnpm_16u1vfb._.js} +2 -2
- package/.next/server/chunks/ssr/node_modules__pnpm_16u1vfb._.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules__pnpm_19ejwjv._.js → node_modules__pnpm_17i6z2d._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_0cj37c-._.js → node_modules__pnpm_189m48n._.js} +1 -1
- package/.next/server/chunks/ssr/node_modules__pnpm_189m48n._.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules__pnpm_18pu1wl._.js → node_modules__pnpm_192f222._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_1zsbfem._.js → node_modules__pnpm_1a48_nl._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_00i3mh2._.js → node_modules__pnpm_1aa37e1._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_0kna82c._.js → node_modules__pnpm_1f440kx._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_1-poetj._.js → node_modules__pnpm_1fn3ejy._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_0yixxj2._.js → node_modules__pnpm_1min2jl._.js} +1 -1
- package/.next/server/chunks/ssr/node_modules__pnpm_1q89l7p._.js +3 -0
- package/.next/server/chunks/ssr/node_modules__pnpm_1q89l7p._.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules__pnpm_1l-posw._.js → node_modules__pnpm_1q_hhr3._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules__pnpm_0fk-8nl._.js → node_modules__pnpm_1qmkxyo._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_1xolwvc._.js → node_modules__pnpm_1qp_jvj._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules__pnpm_07j8gcu._.js → node_modules__pnpm_1ssjj4u._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_042y3e-._.js → node_modules__pnpm_1txccoj._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_0nbxdp_._.js → node_modules__pnpm_1uwkcin._.js} +1 -1
- package/.next/server/chunks/ssr/node_modules__pnpm_1xeothw._.js +3 -0
- package/.next/server/chunks/ssr/node_modules__pnpm_1xeothw._.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules__pnpm_00wjhj4._.js → node_modules__pnpm_1ygal0c._.js} +1 -1
- package/.next/server/chunks/ssr/src_app_(app)_activity_page_tsx_13jd6bn._.js +1 -1
- package/.next/server/chunks/ssr/src_app_(app)_activity_page_tsx_13jd6bn._.js.map +1 -1
- package/.next/server/chunks/ssr/src_app_(app)_board_page_tsx_0gpfc77._.js +3 -0
- package/.next/server/chunks/ssr/src_app_(app)_board_page_tsx_0gpfc77._.js.map +1 -0
- package/.next/server/chunks/ssr/src_app_(app)_chat_page_tsx_0c3e4l4._.js +3 -0
- package/.next/server/chunks/ssr/src_app_(app)_chat_page_tsx_0c3e4l4._.js.map +1 -0
- package/.next/server/chunks/ssr/src_app_(app)_layout_tsx_1yu5hom._.js +3 -0
- package/.next/server/chunks/ssr/src_app_(app)_layout_tsx_1yu5hom._.js.map +1 -0
- package/.next/server/chunks/ssr/src_app_(app)_manual-tests_page_tsx_01tnunf._.js +3 -0
- package/.next/server/chunks/ssr/src_app_(app)_manual-tests_page_tsx_01tnunf._.js.map +1 -0
- package/.next/server/chunks/ssr/src_app_(app)_roadmap_page_tsx_0vcq3jr._.js +5 -0
- package/.next/server/chunks/ssr/src_app_(app)_roadmap_page_tsx_0vcq3jr._.js.map +1 -0
- package/.next/server/chunks/ssr/src_app_(app)_settings_page_tsx_0zevtee._.js +2 -2
- package/.next/server/chunks/ssr/src_app_(app)_settings_page_tsx_0zevtee._.js.map +1 -1
- package/.next/server/chunks/ssr/src_app_(app)_setup_page_tsx_1yids_n._.js +1 -1
- package/.next/server/chunks/ssr/src_app_(app)_setup_page_tsx_1yids_n._.js.map +1 -1
- package/.next/server/chunks/ssr/src_components_chat_ChatView_tsx_0h5j-e2._.js +3 -0
- package/.next/server/chunks/ssr/src_components_chat_ChatView_tsx_0h5j-e2._.js.map +1 -0
- package/.next/server/chunks/ssr/src_context_ChatContext_tsx_0lowp8p._.js +5 -0
- package/.next/server/chunks/ssr/src_context_ChatContext_tsx_0lowp8p._.js.map +1 -0
- package/.next/server/chunks/ssr/{_1wf14_u._.js → src_lib_templates_index_ts_1s61uk7._.js} +2 -2
- package/.next/server/chunks/ssr/{_1wf14_u._.js.map → src_lib_templates_index_ts_1s61uk7._.js.map} +1 -1
- package/.next/server/middleware-build-manifest.js +3 -3
- package/.next/server/next-font-manifest.js +1 -1
- package/.next/server/next-font-manifest.json +8 -0
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/prefetch-hints.json +38 -0
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/02cj5_i9np4sg.js +3 -0
- package/.next/static/chunks/02i5hsdat1nuq.css +9 -0
- package/.next/static/chunks/0mgifb98wbesa.js +1 -0
- package/.next/static/chunks/0p1-hkgnm2ll2.js +1 -0
- package/.next/static/chunks/0pgu5q5vodev6.js +1 -0
- package/.next/static/chunks/0rqzvayflendx.js +2 -0
- package/.next/static/chunks/0vcfs7dii85tw.js +21 -0
- package/.next/static/chunks/13l4l-boqg8fx.js +1 -0
- package/.next/static/chunks/14hxe1qiaram9.js +1 -0
- package/.next/static/chunks/150y5rwg6gwvx.css +1 -0
- package/.next/static/chunks/16k196zyl-n9q.js +1 -0
- package/.next/static/chunks/18b5l8p0vd9f8.js +1 -0
- package/.next/static/chunks/1c_8t2kecjnua.js +1 -0
- package/.next/static/chunks/1fd43t9y42wd3.js +1 -0
- package/.next/static/chunks/1q50zh5z-fq2k.js +2 -0
- package/.next/static/chunks/1tu8lforstp1o.js +1 -0
- package/.next/static/chunks/23-xknrz6o748.js +1 -0
- package/.next/static/chunks/2_xpm7qhr69n8.js +2 -0
- package/.next/static/chunks/2ls_yp4-qgb42.js +1 -0
- package/.next/static/chunks/2zz0ip2l_29c3.js +3 -0
- package/.next/static/chunks/3ly7b47esdb7j.js +1 -0
- package/.next/static/chunks/3ruw8lu2_re-h.js +1 -0
- package/.next/static/chunks/3vf5nnd4xjo5_.js +1 -0
- package/.next/static/chunks/{0eggcu0ovk8sd.js → 40jaenrnspnlh.js} +26 -26
- package/.next/static/chunks/41oxcdcw-pcwt.js +1 -0
- package/README.md +3 -2
- package/package.json +1 -1
- package/skills/work-epic/SKILL.md +22 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0am8bw2._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0enefn6._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0k3n_5f._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0lcfjm4._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0lfx9av._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0qau3qw._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0r1pmvm._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_11t-z2t._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_15hyn79._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1_qk07x._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1b2929e._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1e72c89._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1eq7asn._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1fhdojs._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1lh_vwq._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1ludf-o._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1m3luz3._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1x1iz3d._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1xsmwlh._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_202spah._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_215hw9u._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0n-i0pd._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_13pos4j._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_17b4pqr._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1bkcmom._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1hlj_3l._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1ip-sor._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1pex5o1._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1s8lc8_._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1o4a-4j._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1o4a-4j._.js.map +0 -1
- package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_08ca0b4._.js +0 -3
- package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_08ca0b4._.js.map +0 -1
- package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_0c1k9is._.js +0 -3
- package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_0c1k9is._.js.map +0 -1
- package/.next/server/chunks/ssr/_0qyglif._.js.map +0 -1
- package/.next/server/chunks/ssr/_0skuoxv._.js +0 -6
- package/.next/server/chunks/ssr/_0skuoxv._.js.map +0 -1
- package/.next/server/chunks/ssr/_14i_6yb._.js +0 -3
- package/.next/server/chunks/ssr/_14i_6yb._.js.map +0 -1
- package/.next/server/chunks/ssr/_1c95ems._.js +0 -151
- package/.next/server/chunks/ssr/_1c95ems._.js.map +0 -1
- package/.next/server/chunks/ssr/_1cbhuz4._.js +0 -3
- package/.next/server/chunks/ssr/_1cbhuz4._.js.map +0 -1
- package/.next/server/chunks/ssr/_1ewk_mn._.js +0 -3
- package/.next/server/chunks/ssr/_1ewk_mn._.js.map +0 -1
- package/.next/server/chunks/ssr/_1y-ofyw._.js +0 -3
- package/.next/server/chunks/ssr/_1y-ofyw._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules__pnpm_0bmkw6o._.js +0 -3
- package/.next/server/chunks/ssr/node_modules__pnpm_0bmkw6o._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules__pnpm_1imm4ut._.js +0 -3
- package/.next/server/chunks/ssr/node_modules__pnpm_1imm4ut._.js.map +0 -1
- package/.next/server/chunks/ssr/src_components_008q3v8._.js +0 -3
- package/.next/server/chunks/ssr/src_components_008q3v8._.js.map +0 -1
- package/.next/server/chunks/ssr/src_components_14pwej-._.js +0 -3
- package/.next/server/chunks/ssr/src_components_14pwej-._.js.map +0 -1
- package/.next/server/chunks/ssr/src_components_ui_scroll-area_tsx_0i-n_27._.js +0 -3
- package/.next/server/chunks/ssr/src_components_ui_scroll-area_tsx_0i-n_27._.js.map +0 -1
- package/.next/static/chunks/0-vk2d2nnzav2.js +0 -3
- package/.next/static/chunks/0-z7kyblalrea.js +0 -1
- package/.next/static/chunks/02sab26ica2x3.js +0 -1
- package/.next/static/chunks/0iva6rdtfqpbz.js +0 -1
- package/.next/static/chunks/0k2qhx29amdgs.js +0 -1
- package/.next/static/chunks/0qm101bdsxdyh.css +0 -10
- package/.next/static/chunks/0wg9n5zb8mo2p.js +0 -1
- package/.next/static/chunks/0z_y7el6m76yk.js +0 -1
- package/.next/static/chunks/1-ekntoveuxzd.js +0 -4
- package/.next/static/chunks/10neasnz6hhq1.js +0 -1
- package/.next/static/chunks/1r7z33e9jk3vp.js +0 -1
- package/.next/static/chunks/22dw7r8x0h2sx.js +0 -1
- package/.next/static/chunks/26ee8jsbellqk.js +0 -21
- package/.next/static/chunks/3kkg030rcpz7l.js +0 -1
- package/.next/static/chunks/3pf_4ye6ju8gt.js +0 -1
- package/.next/static/chunks/3smp1lj103j-l.js +0 -1
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0-5bkpj._.js.map → 11mp_@anthropic-ai_sdk_00p3fu1._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_00psb_y._.js.map → 11mp_@anthropic-ai_sdk_01amtux._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_01l5h3i._.js.map → 11mp_@anthropic-ai_sdk_01jjl08._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_072r2bd._.js.map → 11mp_@anthropic-ai_sdk_071zfm8._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0am8bw2._.js.map → 11mp_@anthropic-ai_sdk_07v3boe._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0enefn6._.js.map → 11mp_@anthropic-ai_sdk_09iva72._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0k3n_5f._.js.map → 11mp_@anthropic-ai_sdk_0bom1b1._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0lcfjm4._.js.map → 11mp_@anthropic-ai_sdk_0dvji7p._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0lfx9av._.js.map → 11mp_@anthropic-ai_sdk_0dzo8jn._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0qau3qw._.js.map → 11mp_@anthropic-ai_sdk_0hvqsqq._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0r1pmvm._.js.map → 11mp_@anthropic-ai_sdk_0i7i-jw._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_11t-z2t._.js.map → 11mp_@anthropic-ai_sdk_0k0iop5._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_15hyn79._.js.map → 11mp_@anthropic-ai_sdk_0l3-6aq._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1_qk07x._.js.map → 11mp_@anthropic-ai_sdk_0oegm3y._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1b2929e._.js.map → 11mp_@anthropic-ai_sdk_0p5cyes._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1e72c89._.js.map → 11mp_@anthropic-ai_sdk_0qw8i6_._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1eq7asn._.js.map → 11mp_@anthropic-ai_sdk_0yk-a7v._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1fhdojs._.js.map → 11mp_@anthropic-ai_sdk_11fsqvb._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1lh_vwq._.js.map → 11mp_@anthropic-ai_sdk_143_7ez._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1ludf-o._.js.map → 11mp_@anthropic-ai_sdk_14a4-64._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1m3luz3._.js.map → 11mp_@anthropic-ai_sdk_17d_oma._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1x1iz3d._.js.map → 11mp_@anthropic-ai_sdk_18qwuyb._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1xsmwlh._.js.map → 11mp_@anthropic-ai_sdk_19au8y6._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_202spah._.js.map → 11mp_@anthropic-ai_sdk_1ak_hy5._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_215hw9u._.js.map → 11mp_@anthropic-ai_sdk_1cqa0nq._.js.map} +0 -0
- /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
- /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
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_17b4pqr._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0e3mwc6._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1bkcmom._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0go4301._.js.map} +0 -0
- /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
- /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
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1pex5o1._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0szcyrx._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1s8lc8_._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0xy2s3x._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__0e59y5j._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0yaujn7._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__11s76m8._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0z9ly74._.js.map} +0 -0
- /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
- /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
- /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
- /package/.next/server/chunks/{ssr/node_modules__pnpm_04xoqd9._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1zsdhg0._.js.map} +0 -0
- /package/.next/server/chunks/{ssr/node_modules__pnpm_0cj37c-._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_20t__fe._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__1u_q61h._.js.map → [root-of-the-server]__0-pmfg2._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__1y3u5ud._.js.map → [root-of-the-server]__04tibmn._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__17xb02p._.js.map → [root-of-the-server]__05g5cgo._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__0aynzrb._.js.map → [root-of-the-server]__0b5pwze._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__142icjb._.js.map → [root-of-the-server]__0druay_._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__106gpvh._.js.map → [root-of-the-server]__0p6ja6l._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__0nfvvy9._.js.map → [root-of-the-server]__1-e3i_5._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__06zf_sh._.js.map → [root-of-the-server]__197vw9g._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__1j0rrps._.js.map → [root-of-the-server]__19k8t87._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__0eqd-tw._.js.map → [root-of-the-server]__1ezzeji._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__17p0rkn._.js.map → [root-of-the-server]__1mrmaf9._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__1q4ahvz._.js.map → [root-of-the-server]__1umrorf._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__093hlkh._.js.map → [root-of-the-server]__1vh9g2o._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__1y-tt29._.js.map → [root-of-the-server]__1vq38ov._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_0w9uewb._.js.map → node_modules__pnpm_01bjcv9._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_0p10j87._.js.map → node_modules__pnpm_03qrzdb._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_1a3fo7j._.js.map → node_modules__pnpm_06d-fdo._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_1o30a9w._.js.map → node_modules__pnpm_0ctisl0._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_17o8zbz._.js.map → node_modules__pnpm_0fwp8jm._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_19ys1iv._.js.map → node_modules__pnpm_0kpu0-2._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_1r4w_7k._.js.map → node_modules__pnpm_0vry74x._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_11lluiq._.js.map → node_modules__pnpm_0ycbjbd._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_1_34wt2._.js.map → node_modules__pnpm_1-76qxg._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_0ma8hho._.js.map → node_modules__pnpm_1-r94f7._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_19ejwjv._.js.map → node_modules__pnpm_17i6z2d._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_18pu1wl._.js.map → node_modules__pnpm_192f222._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_1zsbfem._.js.map → node_modules__pnpm_1a48_nl._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_00i3mh2._.js.map → node_modules__pnpm_1aa37e1._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_0kna82c._.js.map → node_modules__pnpm_1f440kx._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_1-poetj._.js.map → node_modules__pnpm_1fn3ejy._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_0yixxj2._.js.map → node_modules__pnpm_1min2jl._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_1l-posw._.js.map → node_modules__pnpm_1q_hhr3._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_0fk-8nl._.js.map → node_modules__pnpm_1qmkxyo._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_1xolwvc._.js.map → node_modules__pnpm_1qp_jvj._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_07j8gcu._.js.map → node_modules__pnpm_1ssjj4u._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_042y3e-._.js.map → node_modules__pnpm_1txccoj._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_0nbxdp_._.js.map → node_modules__pnpm_1uwkcin._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_00wjhj4._.js.map → node_modules__pnpm_1ygal0c._.js.map} +0 -0
- /package/.next/static/{gJtrYenzL6_deB-6pdvIL → fGPda81_8-K4GmaNUE6KA}/_buildManifest.js +0 -0
- /package/.next/static/{gJtrYenzL6_deB-6pdvIL → fGPda81_8-K4GmaNUE6KA}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{gJtrYenzL6_deB-6pdvIL → fGPda81_8-K4GmaNUE6KA}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
module.exports=[690793,a=>{"use strict";var b=a.i(662145),c=a.i(174897),d=a.i(365465),e=a.i(152716),f=a.i(340933),g=a.i(795667),h=a.i(926128),i=a.i(553415),j=a.i(200382),k=a.i(551729),l=a.i(913975),m=a.i(544394),n=a.i(21215),o=a.i(699570);let p=a=>"done"===a||"cancelled"===a;function q(a,b){let c=new Map(b.map(a=>[a.id,a])),d=a.tasks.map(a=>c.get(a)).filter(a=>!!a),e=a=>[...new Set((a.dependsOn.match(/\bT\d+\b/gi)??[]).map(a=>a.toUpperCase()))].filter(a=>{let b=c.get(a);return!b||!p(b.status)});for(let a of d)if("todo"===a.status&&!e(a).length)return{kind:"ready",taskId:a.id};if(d.every(a=>p(a.status)))return{kind:"finished"};let f=new Set(a.tasks),g=new Map,h=a=>{if(g.has(a))return g.get(a)??!1;g.set(a,!1);let b=c.get(a),d=!!b&&"blocked"!==b.status&&"paused"!==b.status&&"review"!==b.status&&("todo"!==b.status||f.has(a)&&e(b).every(h));return g.set(a,d),d},i=[];for(let b of a.tasks){let a=c.get(b);if(a){if("in-progress"===a.status)i.push({taskId:b,reason:`${b} is in progress (claimed)`});else if("blocked"===a.status)i.push({taskId:b,reason:`${b} is blocked`});else if("paused"===a.status)i.push({taskId:b,reason:`${b} is paused — needs a human to resume it`});else if("review"===a.status)i.push({taskId:b,reason:`${b} in review — needs a human`});else if("todo"===a.status){let d=e(a).map(a=>`${a} (${c.get(a)?.status??"missing"})`);i.push({taskId:b,reason:`${b} waits on ${d.join(", ")}`})}}else i.push({taskId:b,reason:`${b} has no task file`})}return{kind:"waiting",waiting:i,needsHuman:i.every(a=>!h(a.taskId))}}var r=a.i(452696),s=a.i(368114),t=a.i(525395),u=a.i(618940),v=a.i(815122),w=a.i(581040);function x({items:a,today:d,onSelect:e,onItemContextMenu:f,progressById:g}){let h=new Map(a.filter(a=>null===a.parent).sort((a,b)=>a.order-b.order).map((a,b)=>[a.id,b+1])),i=(0,c.useMemo)(()=>(0,w.buildTimeline)(a,d),[a,d]),j=(0,c.useRef)(null);(0,c.useEffect)(()=>{let a=j.current;a&&(a.scrollLeft=Math.max(0,i.todayX-(a.clientWidth-200)/3))},[i.todayX]);let k=i.lanes.some(a=>a.markers.length>0);return(0,b.jsxs)("div",{className:"flex flex-1 min-h-0 flex-col",children:[(0,b.jsx)("div",{ref:j,className:"relative flex-1 min-h-0 overflow-auto",children:(0,b.jsxs)("div",{className:"relative",style:{width:200+i.width,minHeight:"100%"},children:[(0,b.jsxs)("div",{className:"pointer-events-none absolute inset-y-0",style:{left:200,width:i.width},children:[i.months.map(a=>(0,b.jsx)("div",{className:"absolute inset-y-0 border-l border-border",style:{left:a.x}},a.x)),(0,b.jsx)("div",{className:"absolute inset-y-0 left-0 bg-surface/50",style:{width:i.todayX}}),(0,b.jsx)("div",{className:"absolute inset-y-0 w-px bg-accent shadow-[0_0_12px_rgb(var(--rgb-accent)/0.8)]",style:{left:i.todayX},children:(0,b.jsx)("span",{className:"absolute -translate-x-1/2 rounded-full bg-accent px-2 py-0.5 font-mono text-[10px] uppercase tracking-wider text-accent-fg",style:{top:42},children:"Today"})})]}),(0,b.jsxs)("div",{className:"sticky top-0 z-20 flex border-b border-border bg-bg",style:{height:36},children:[(0,b.jsx)("div",{className:"sticky left-0 z-10 shrink-0 bg-bg",style:{width:200}}),(0,b.jsx)("div",{className:"relative",children:i.months.map(a=>(0,b.jsx)("span",{className:"absolute top-3 whitespace-nowrap pl-2 font-mono text-[10px] uppercase tracking-widest text-muted",style:{left:a.x},children:a.label},a.x))})]}),i.lanes.map(a=>(0,b.jsxs)("div",{className:"relative flex border-b border-border",children:[(0,b.jsx)(y,{item:a.item,chapter:h.get(a.item.id),progress:g[a.item.id],onSelect:e,onContextMenu:f}),(0,b.jsx)("div",{className:"relative",style:{width:i.width,height:a.rows*w.LANE_ROW_H+12},children:a.markers.map(a=>(0,b.jsxs)("button",{type:"button",onClick:()=>e(a.item.id),onContextMenu:b=>f?.(a.item.id,b),title:`${a.item.id} \xb7 ${a.item.title} \xb7 due ${a.item.due}${"overdue"===a.state?" (overdue)":""}`,className:"group absolute flex items-center gap-1.5",style:{left:a.x-10,top:6+a.row*w.LANE_ROW_H},children:[a.horizon?(0,b.jsx)("span",{className:(0,s.cn)("h-4 w-4 rotate-45 border-2 border-accent","done"===a.item.status?"bg-accent":"bg-bg","overdue"===a.state&&"border-danger")}):(0,b.jsx)("span",{className:(0,s.cn)("rounded-full","overdue"===a.state&&"ring-2 ring-danger ring-offset-1 ring-offset-bg"),children:(0,b.jsx)(u.StatusDot,{status:a.item.status})}),(0,b.jsxs)("span",{className:(0,s.cn)("flex max-w-[150px] flex-col rounded-md border px-2 py-0.5 text-left transition-colors","in-progress"===a.item.status?"border-accent/50 bg-surface shadow-[0_6px_18px_-10px_rgb(var(--rgb-accent)/0.7)]":"done"===a.item.status?"border-border bg-surface/60":"border-dashed border-border2 bg-bg","group-hover:border-accent"),children:[(0,b.jsxs)("span",{className:"flex items-center gap-1",children:[(0,b.jsx)("span",{className:(0,s.cn)("truncate text-xs","done"===a.item.status?"text-muted":"text-txt",a.horizon&&"font-semibold"),children:a.item.title}),(0,b.jsx)(v.AgentDot,{attach:{kind:"epic",id:a.item.id}})]}),(0,b.jsx)("span",{className:(0,s.cn)("font-mono text-[10px]","overdue"===a.state?"text-danger":"soon"===a.state?"text-amber":"text-muted"),children:(0,w.formatDay)(a.item.due)})]})]},a.item.id))})]},a.item.id)),!k&&(0,b.jsx)("p",{className:"px-6 py-8 text-sm text-muted",style:{marginLeft:200},children:"No due dates yet — open an item and set a Due date."})]})}),i.undated.length>0&&(0,b.jsxs)("div",{className:"max-h-28 shrink-0 overflow-y-auto border-t border-border bg-surface px-4 py-2",children:[(0,b.jsxs)("p",{className:"mb-2 font-mono text-[10px] uppercase tracking-widest text-muted",children:["No due date · ",i.undated.length]}),(0,b.jsx)("div",{className:"flex flex-wrap gap-1.5",children:i.undated.map(a=>(0,b.jsxs)("button",{type:"button",onClick:()=>e(a.id),onContextMenu:b=>f?.(a.id,b),className:"flex items-center gap-1 rounded-md border border-border px-1.5 py-0.5 text-xs text-muted hover:border-accent hover:text-txt",children:[(0,b.jsx)(u.StatusDot,{status:a.status}),a.title,(0,b.jsx)(v.AgentDot,{attach:{kind:"epic",id:a.id}})]},a.id))})]})]})}function y({item:a,chapter:c,progress:d,onSelect:e,onContextMenu:f}){return(0,b.jsxs)("button",{type:"button",onClick:()=>e(a.id),onContextMenu:b=>f?.(a.id,b),className:"sticky left-0 z-10 flex shrink-0 items-center gap-3 border-r border-border bg-surface px-3 text-left hover:bg-surface2",style:{width:200},children:[(0,b.jsx)("span",{className:(0,s.cn)("font-mono text-lg font-semibold tabular-nums","in-progress"===a.status?"text-accent":"done"===a.status?"text-teal":"text-muted"),children:c?String(c).padStart(2,"0"):"··"}),(0,b.jsxs)("span",{className:"flex min-w-0 flex-1 flex-col gap-1",children:[(0,b.jsx)("span",{className:"line-clamp-2 text-[11px] font-semibold uppercase leading-snug tracking-wider text-txt",children:a.title}),d&&(0,b.jsx)("span",{className:"h-1 overflow-hidden rounded-full bg-border",children:(0,b.jsx)("span",{className:"block h-full rounded-full bg-teal",style:{width:`${d.done/d.total*100}%`}})})]})]})}var z=a.i(453161),A=a.i(156298),B=a.i(441852),C=a.i(661661),D=a.i(757061),E=a.i(866718),F=a.i(149350),G=a.i(107742),H=a.i(685698),I=a.i(60084),J=a.i(717143),K=a.i(763747),L=a.i(28386),M=a.i(335732),N=a.i(890728);let O=["planned","in-progress","paused","done"];function P({item:a,items:c,actions:d}){let e=null===a.parent,f=c.filter(b=>null===b.parent&&b.id!==a.parent).sort((a,b)=>a.order-b.order),g=c.filter(b=>b.parent===a.id).length;return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)(M.DropdownMenuItem,{onSelect:()=>d.edit(a.id),children:[(0,b.jsx)(C.Pencil,{})," Edit",(0,b.jsx)(M.DropdownMenuShortcut,{children:(0,N.itemKeyLabel)("edit")})]}),(0,b.jsxs)(M.DropdownMenuSub,{children:[(0,b.jsxs)(M.DropdownMenuSubTrigger,{children:[(0,b.jsx)(u.StatusDot,{status:a.status})," Status",(0,b.jsx)(M.DropdownMenuShortcut,{children:(0,N.itemKeyLabel)("status")})]}),(0,b.jsx)(M.DropdownMenuSubContent,{children:O.map(c=>(0,b.jsxs)(M.DropdownMenuItem,{disabled:c===a.status,onSelect:()=>d.setStatus(a.id,c),children:[(0,b.jsx)(u.StatusDot,{status:c})," ",u.STATUS_LABEL[c]]},c))})]}),!e&&f.length>0&&(0,b.jsxs)(M.DropdownMenuSub,{children:[(0,b.jsxs)(M.DropdownMenuSubTrigger,{children:[(0,b.jsx)(J.FolderInput,{})," Move to horizon"]}),(0,b.jsx)(M.DropdownMenuSubContent,{className:"max-h-72 overflow-y-auto",children:f.map(c=>(0,b.jsxs)(M.DropdownMenuItem,{onSelect:()=>d.move(a.id,c.id),children:[(0,b.jsx)("span",{className:"font-mono text-[11px] text-muted",children:c.id})," ",c.title]},c.id))})]}),e&&(0,b.jsxs)(M.DropdownMenuItem,{onSelect:()=>d.addEpic(a.id),children:[(0,b.jsx)(j.Plus,{})," Add epic"]}),(0,b.jsxs)(M.DropdownMenuItem,{onSelect:()=>d.duplicate(a.id),children:[(0,b.jsx)(I.Copy,{})," Duplicate",(0,b.jsx)(M.DropdownMenuShortcut,{children:(0,N.itemKeyLabel)("duplicate")})]}),(0,b.jsx)(M.DropdownMenuSeparator,{}),!e&&(0,b.jsxs)(M.DropdownMenuItem,{onSelect:()=>d.chat(a.id),children:[(0,b.jsx)(B.MessageSquare,{})," Chat about it",(0,b.jsx)(M.DropdownMenuShortcut,{children:(0,N.itemKeyLabel)("chat")})]}),(0,b.jsxs)(M.DropdownMenuItem,{onSelect:()=>d.openFile(a.file),children:[(0,b.jsx)(h.FileText,{})," Open file"]}),(0,b.jsx)(M.DropdownMenuSeparator,{}),g>0?(0,b.jsxs)(M.DropdownMenuItem,{disabled:!0,className:"flex-col items-start gap-0",children:[(0,b.jsxs)("span",{className:"flex items-center gap-2",children:[(0,b.jsx)(L.Trash2,{})," Delete"]}),(0,b.jsxs)("span",{className:"pl-6 text-[11px]",children:["Move or delete its ",g," epic",1===g?"":"s"," first"]})]}):(0,b.jsxs)(M.DropdownMenuItem,{onSelect:()=>d.remove(a.id),className:"text-danger focus:text-danger",children:[(0,b.jsx)(L.Trash2,{})," Delete",(0,b.jsx)(M.DropdownMenuShortcut,{children:(0,N.itemKeyLabel)("remove")})]})]})}function Q({item:a,items:c,actions:d,className:e,open:f,onOpenChange:g}){return(0,b.jsxs)(M.DropdownMenu,{open:f,onOpenChange:g,children:[(0,b.jsx)(M.DropdownMenuTrigger,{asChild:!0,children:(0,b.jsx)("button",{type:"button","aria-label":`Actions for ${a.id}`,className:(0,s.cn)("grid size-7 place-items-center rounded-md text-muted hover:bg-surface2 hover:text-txt",e),children:(0,b.jsx)(K.MoreHorizontal,{className:"size-4"})})}),(0,b.jsx)(M.DropdownMenuContent,{align:"end",className:"w-52",children:(0,b.jsx)(P,{item:a,items:c,actions:d})})]})}function R({at:a,items:c,actions:d,onClose:e}){let f=a&&c.find(b=>b.id===a.id);return a&&f?(0,b.jsxs)(M.DropdownMenu,{open:!0,onOpenChange:a=>{a||e()},children:[(0,b.jsx)(M.DropdownMenuTrigger,{asChild:!0,children:(0,b.jsx)("span",{"aria-hidden":!0,className:"pointer-events-none fixed size-0",style:{left:a.x,top:a.y}})}),(0,b.jsx)(M.DropdownMenuContent,{align:"start",className:"w-52",children:(0,b.jsx)(P,{item:f,items:c,actions:d})})]},`${a.id}:${a.x}:${a.y}`):null}var S=a.i(813722),T=a.i(192698),U=a.i(787714),V=a.i(269769);let W=["planned","in-progress","paused","done"],X="w-full rounded-md border border-border bg-bg px-3 py-2 text-sm text-txt focus:outline-hidden focus:ring-1 focus:ring-accent disabled:opacity-50",Y="text-xs font-medium text-muted",Z="font-mono text-[10px] uppercase tracking-widest text-muted";function $({item:a,onClose:c,...d}){return(0,b.jsx)(D.Sheet,{open:!!a,onOpenChange:a=>{a||c()},children:(0,b.jsx)(D.SheetContent,{className:"w-[480px] sm:max-w-[480px] gap-0 bg-surface border-border text-txt flex flex-col overflow-y-auto p-0",children:a&&(0,b.jsx)(_,{item:a,onClose:c,...d},a.id)})})}function _(a){return a.editing?(0,b.jsx)(ab,{...a,onCancel:()=>a.onEditingChange(!1)}):(0,b.jsx)(aa,{...a,onEdit:()=>a.onEditingChange(!0)})}function aa({item:a,items:d,onClose:e,onAddFeature:f,onEditRaw:i,onSelect:k,tasksById:l,progressById:m,onEdit:n,actions:p,onSave:q}){let w=null===a.parent,x=d.find(b=>b.id===a.parent),y=d.filter(b=>b.parent===a.id).sort((a,b)=>a.order-b.order),z=m[a.id],E=(0,r.localToday)(),{chats:I,showAbout:J}=(0,H.useChats)(),K=w?void 0:(0,G.chatFor)(I,{kind:"epic",id:a.id}),L=!w&&0===a.tasks.length&&!K,[M,O]=(0,c.useState)(!1),P=b=>{q(a.id,b).then(a=>{a&&(0,V.toast)(a)})};return(0,N.useItemCommands)(`${a.id} \xb7 ${a.title}`,[{action:"edit",label:"Edit",run:n},{action:"status",label:"Change status…",run:()=>O(!0)},{action:"duplicate",label:"Duplicate",run:()=>p.duplicate(a.id)},...w?[]:[{action:"chat",label:"Chat about it",run:()=>p.chat(a.id)}],...y.length?[]:[{action:"remove",label:"Delete",run:()=>p.remove(a.id)}]]),(0,b.jsxs)("div",{className:"flex min-h-full flex-col",children:[(0,b.jsx)(T.ItemPanelHeader,{className:(0,s.cn)("px-6","in-progress"===a.status&&"bg-[linear-gradient(180deg,rgb(var(--rgb-accent)/0.08),transparent)]"),kicker:(0,b.jsx)(D.SheetDescription,{asChild:!0,children:(0,b.jsxs)("div",{className:"flex min-w-0 items-center gap-1",children:[x&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("button",{type:"button",onClick:()=>k(x.id),className:"truncate hover:text-txt",children:x.title}),(0,b.jsx)(A.ChevronRight,{className:"h-3 w-3 shrink-0"})]}),(0,b.jsxs)("span",{className:"shrink-0",children:[a.id," · ",w?"horizon":"epic"]}),(0,b.jsx)(v.AgentMark,{attach:{kind:"epic",id:a.id}})]})}),title:(0,b.jsx)(D.SheetTitle,{className:"text-xl font-semibold leading-tight text-txt",children:a.title}),menu:(0,b.jsx)(Q,{item:a,items:d,actions:p,open:M,onOpenChange:O}),properties:[{label:"Status",value:(0,b.jsx)(U.InlineSelect,{label:`Status of ${a.id}`,value:a.status,onChange:b=>p.setStatus(a.id,b),options:W.map(a=>({value:a,label:u.STATUS_LABEL[a],node:(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(u.StatusDot,{status:a}),u.STATUS_LABEL[a]]})})),children:(0,b.jsx)(u.StatusPill,{status:a.status})})},{label:"Owner",value:(0,b.jsx)(U.InlineSelect,{label:`Owner of ${a.id}`,value:a.owner??"",onChange:a=>P({owner:a||null}),options:[{value:"human",label:"Human",node:(0,b.jsx)(S.OwnerChip,{owner:"human",className:"text-xs"})},...[...new Set(["ai:claude",...a.owner?.startsWith("ai:")?[a.owner]:[]])].map(a=>({value:a,label:a,node:(0,b.jsx)(S.OwnerChip,{owner:a,className:"text-xs"})})),{value:"",label:"No owner",node:(0,b.jsx)("span",{className:"text-muted",children:"No owner"})}],children:a.owner?(0,b.jsx)(S.OwnerChip,{owner:a.owner,className:"text-xs"}):(0,b.jsx)("span",{className:"text-muted",children:"—"})})},{label:"Due",value:(0,b.jsx)(U.InlineDate,{label:`Due date of ${a.id}`,value:a.due,onChange:a=>P({due:a}),children:a.due?(0,b.jsx)(u.DueChip,{due:a.due,state:(0,r.dueState)(a.due,a.status,E)}):(0,b.jsx)("span",{className:"text-muted",children:"—"})})},{label:w?"Epics":"Tasks",value:(0,b.jsx)("span",{className:"font-mono",children:w?y.length:a.tasks.length})}],children:z&&(0,b.jsxs)("div",{className:"mt-2 flex items-end gap-4",children:[(0,b.jsxs)("p",{className:"font-mono text-3xl font-semibold leading-none tabular-nums text-txt",children:[Math.round(z.done/z.total*100),(0,b.jsx)("span",{className:"text-base text-muted",children:"%"})]}),(0,b.jsxs)("div",{className:"flex-1 pb-1",children:[(0,b.jsxs)("p",{className:"mb-1.5 font-mono text-[10px] text-muted",children:[z.done," of ",z.total,w?"":" tasks"," done"]}),w?(0,b.jsx)("div",{className:"h-1.5 overflow-hidden rounded-full bg-border",children:(0,b.jsx)("div",{className:"h-full rounded-full bg-teal",style:{width:`${z.done/z.total*100}%`}})}):(0,b.jsx)(u.SegmentedProgress,{statuses:a.tasks.map(a=>l[a]?.status).filter(a=>!!a&&"cancelled"!==a)})]})]})}),(0,b.jsxs)("div",{className:"flex flex-1 flex-col gap-6 px-6 py-5",children:[!w&&a.tasks.length>0&&(0,b.jsx)(ac,{item:a,tasksById:l,onOpen:i}),w&&(0,b.jsxs)("section",{className:"flex flex-col gap-2",children:[(0,b.jsxs)("p",{className:Z,children:["Epics · ",y.length]}),0===y.length&&(0,b.jsx)("p",{className:"text-sm text-muted",children:"No epics yet."}),(0,b.jsx)("ul",{className:"-mx-2 flex flex-col",children:y.map(a=>{let c=m[a.id];return(0,b.jsx)("li",{children:(0,b.jsxs)("button",{type:"button",onClick:()=>k(a.id),className:"flex w-full items-center gap-3 rounded-md px-2 py-2 text-left hover:bg-surface2",children:[(0,b.jsx)(u.StatusDot,{status:a.status}),(0,b.jsx)("span",{className:"shrink-0 font-mono text-[11px] text-muted",children:a.id}),(0,b.jsx)("span",{className:(0,s.cn)("min-w-0 flex-1 truncate text-sm","done"===a.status?"text-muted":"text-txt"),children:a.title}),c&&(0,b.jsxs)("span",{className:"shrink-0 font-mono text-[10px] text-muted",children:[c.done,"/",c.total]})]})},a.id)})})]}),(0,b.jsxs)("section",{className:"flex flex-col gap-2",children:[(0,b.jsx)("p",{className:Z,children:"Brief"}),a.body.trim()?(0,b.jsx)(F.MarkdownRenderer,{content:a.body,className:"text-sm"}):(0,b.jsx)("p",{className:"text-sm text-muted",children:"No description. Edit to add the outcome, scope and “done when”."})]})]}),(0,b.jsxs)("footer",{className:"sticky bottom-0 flex flex-wrap items-center gap-2 border-t border-border bg-surface px-6 py-3",children:[L&&(0,b.jsxs)(o.Button,{size:"sm",onClick:()=>{e(),(0,t.askAgent)(`Break down epic ${a.id} into tasks.`)},className:"bg-accent text-accent-fg hover:bg-accent/90",children:[(0,b.jsx)(g.Bot,{})," Break down with agent"]}),!w&&(0,b.jsxs)(o.Button,{size:"sm",variant:L?"outline":"default",onClick:()=>{e(),J({kind:"epic",id:a.id})},className:(0,s.cn)(!L&&"bg-accent text-accent-fg hover:bg-accent/90"),children:[(0,b.jsx)(B.MessageSquare,{})," ",K?"Open chat":"Chat"]}),w&&(0,b.jsxs)(o.Button,{size:"sm",onClick:()=>f(a.id),className:"bg-accent text-accent-fg hover:bg-accent/90",children:[(0,b.jsx)(j.Plus,{})," Add epic"]}),(0,b.jsxs)(o.Button,{size:"sm",variant:"outline",onClick:n,children:[(0,b.jsx)(C.Pencil,{})," Edit"]}),(0,b.jsxs)(o.Button,{size:"sm",variant:"ghost",onClick:()=>i(a.file),className:"ml-auto text-muted hover:text-txt",children:[(0,b.jsx)(h.FileText,{})," Open file"]})]})]})}function ab({item:a,items:d,onClose:e,onSave:f,onDelete:g,onCancel:h}){let[i]=(0,c.useState)(a),[j,k]=(0,c.useState)(a.title),[l,m]=(0,c.useState)(a.status),[n,p]=(0,c.useState)(a.parent??""),[q,r]=(0,c.useState)(String(a.order)),[s,t]=(0,c.useState)(a.tasks.join(", ")),[u,v]=(0,c.useState)(a.due??""),[w,x]=(0,c.useState)(a.body),[y,z]=(0,c.useState)(null),[A,B]=(0,c.useState)(!1),C=d.some(b=>b.parent===a.id),F=d.filter(b=>null===b.parent&&b.id!==a.id),G=null===a.parent,H=null!==a.parent&&!F.some(b=>b.id===a.parent);async function I(a){B(!0),z(null);let b=await a();return B(!1),b&&z(b),!b}async function J(){let b={},c=j.trim()||i.title;if(c!==i.title&&(b.title=c),l!==i.status&&(b.status=l),(n||null)!==i.parent&&(b.parent=n||null),q.trim()!==String(i.order)){let a=Number(q);if(""===q.trim()||!Number.isFinite(a))return void z("Order must be a number");b.order=a}let d=s.split(",").map(a=>a.trim()).filter(Boolean);(d.join(",")!==i.tasks.join(",")&&(b.tasks=d),(u||null)!==i.due&&(b.due=u||null),w!==i.body&&(b.body=w),0===Object.keys(b).length)?h():await I(()=>f(a.id,b))&&e()}async function K(){await I(()=>g(a.id))&&e()}return(0,b.jsxs)("div",{className:"flex min-h-full flex-col",children:[(0,b.jsxs)("div",{className:"border-b border-border px-6 pb-4 pt-6 pr-12",children:[(0,b.jsxs)(D.SheetDescription,{className:"font-mono text-[11px] text-muted",children:["Editing ",a.id," · ",G?"horizon":"epic"]}),(0,b.jsx)(D.SheetTitle,{className:"mt-1 text-base text-txt",children:a.title})]}),(0,b.jsxs)("div",{className:"flex flex-1 flex-col gap-4 px-6 py-5",children:[(0,b.jsxs)("label",{className:"flex flex-col gap-1",children:[(0,b.jsx)("span",{className:Y,children:"Title"}),(0,b.jsx)(E.Input,{value:j,onChange:a=>k(a.target.value),className:"bg-bg border-border text-txt"})]}),(0,b.jsxs)("div",{className:"grid grid-cols-3 gap-3",children:[(0,b.jsxs)("label",{className:"flex flex-col gap-1",children:[(0,b.jsx)("span",{className:Y,children:"Status"}),(0,b.jsx)("select",{value:l,onChange:a=>m(a.target.value),className:X,children:W.map(a=>(0,b.jsx)("option",{value:a,children:a},a))})]}),(0,b.jsxs)("label",{className:"flex flex-col gap-1",children:[(0,b.jsx)("span",{className:Y,children:"Parent"}),(0,b.jsxs)("select",{value:n,onChange:a=>p(a.target.value),disabled:C,title:C?"Items with children must stay on the spine":void 0,className:X,children:[(0,b.jsx)("option",{value:"",children:"— (horizon)"}),H&&(0,b.jsxs)("option",{value:a.parent??"",children:[a.parent," · missing"]}),F.map(a=>(0,b.jsxs)("option",{value:a.id,children:[a.id," · ",a.title]},a.id))]})]}),(0,b.jsxs)("label",{className:"flex flex-col gap-1",children:[(0,b.jsx)("span",{className:Y,children:"Order"}),(0,b.jsx)(E.Input,{type:"number",step:10,value:q,onChange:a=>r(a.target.value),title:G?"Position on the spine":"Position within the branch",className:"bg-bg border-border text-txt"})]})]}),(0,b.jsxs)("label",{className:"flex flex-col gap-1",children:[(0,b.jsx)("span",{className:Y,children:"Due"}),(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)(E.Input,{type:"date",value:u,onChange:a=>v(a.target.value),className:"bg-bg border-border text-txt scheme-light dark:scheme-dark"}),u&&(0,b.jsx)("button",{type:"button",onClick:()=>v(""),className:"text-xs text-muted hover:text-txt",children:"Clear"})]})]}),(0,b.jsxs)("label",{className:"flex flex-col gap-1",children:[(0,b.jsx)("span",{className:Y,children:"Tasks"}),(0,b.jsx)(E.Input,{value:s,onChange:a=>t(a.target.value),placeholder:"T001, T012",className:"bg-bg border-border text-txt font-mono"})]}),(0,b.jsxs)("label",{className:"flex flex-col gap-1",children:[(0,b.jsx)("span",{className:Y,children:"Body (markdown)"}),(0,b.jsx)("textarea",{value:w,onChange:a=>x(a.target.value),rows:12,className:`${X} font-mono resize-y`})]}),y&&(0,b.jsx)("p",{className:"text-xs text-danger",children:y})]}),(0,b.jsxs)("footer",{className:"sticky bottom-0 flex items-center gap-2 border-t border-border bg-surface px-6 py-3",children:[(0,b.jsx)(o.Button,{size:"sm",onClick:J,disabled:A,className:"bg-accent text-accent-fg hover:bg-accent/90",children:"Save"}),(0,b.jsx)(o.Button,{size:"sm",variant:"ghost",onClick:h,disabled:A,className:"text-txt",children:"Cancel"}),(0,b.jsx)(o.Button,{size:"sm",variant:"ghost",onClick:K,disabled:A,className:"ml-auto text-danger hover:text-danger",children:"Delete"})]})]})}function ac({item:a,tasksById:c,onOpen:d}){let e=(0,r.localToday)(),f=q(a,Object.values(c)),g="ready"===f.kind?f.taskId:null,h="waiting"===f.kind?[...f.waiting].sort((a,b)=>Number(c[b.taskId]?.status==="todo")-Number(c[a.taskId]?.status==="todo")).map(a=>a.reason):[];return(0,b.jsxs)("section",{className:"flex flex-col gap-2",children:[(0,b.jsxs)("p",{className:Z,children:["Tasks · ",a.tasks.length]}),(0,b.jsx)("ul",{className:"-mx-2 flex flex-col",children:a.tasks.map(a=>{let f=c[a];if(!f)return(0,b.jsxs)("li",{className:"px-2 py-2 font-mono text-xs text-danger",children:[a," · missing task file"]},a);let h=f.id===g;return(0,b.jsxs)("li",{className:(0,s.cn)("group flex items-center rounded-md hover:bg-surface2",h&&"bg-accent/10 hover:bg-accent/15"),children:[(0,b.jsxs)("button",{type:"button",onClick:()=>d(f.file),className:"flex min-w-0 flex-1 items-center gap-3 px-2 py-2 text-left",children:[(0,b.jsx)("span",{title:f.status,className:(0,s.cn)("h-2 w-2 shrink-0 rounded-full",u.TASK_STATUS_BG[f.status])}),(0,b.jsx)("span",{className:"shrink-0 font-mono text-[11px] text-muted",children:f.id}),(0,b.jsx)("span",{className:(0,s.cn)("min-w-0 flex-1 truncate text-sm","cancelled"===f.status?"text-muted line-through":"done"===f.status?"text-muted":"text-txt"),children:f.title}),(0,b.jsx)(u.DueChip,{due:f.due,state:(0,r.dueState)(f.due,"done"===f.status?"done":"planned",e)}),h?(0,b.jsx)("span",{className:"shrink-0 font-mono text-[10px] uppercase tracking-wider text-accent",children:"Next up"}):f.size&&"—"!==f.size&&(0,b.jsx)("span",{className:"shrink-0 font-mono text-[10px] text-muted",children:f.size.split(" ")[0]}),(0,b.jsx)(v.AgentDot,{attach:{kind:"task",id:f.id}})]}),(0,b.jsx)(ad,{taskId:f.id})]},a)})}),h.length>0&&(0,b.jsxs)("p",{className:"truncate text-xs text-muted",title:h.join("\n"),children:[h[0],h.length>1&&` (+${h.length-1} more)`]})]})}function ad({taskId:a}){let{chats:c,showAbout:d}=(0,H.useChats)(),e=!!(0,G.chatFor)(c,{kind:"task",id:a});return(0,b.jsx)("button",{type:"button",onClick:()=>d({kind:"task",id:a}),"aria-label":`${e?"Open chat":"Chat"} about ${a}`,title:e?`Open the chat about ${a}`:`Chat about ${a}`,className:(0,s.cn)("mr-1 grid size-7 shrink-0 place-items-center rounded-md text-muted transition-[opacity,color] duration-(--duration-fast) hover:bg-surface hover:text-accent focus-visible:opacity-100",e?"text-accent opacity-100":"opacity-0 group-hover:opacity-100"),children:(0,b.jsx)(B.MessageSquare,{className:"size-3.5"})})}var ae=a.i(814574);function af({open:a,heading:d,onOpenChange:e,onSubmit:f}){let[g,h]=(0,c.useState)(""),[i,j]=(0,c.useState)(null),[k,l]=(0,c.useState)(!1);function m(a){a||(h(""),j(null)),e(a)}async function n(a){if(a.preventDefault(),!g.trim())return;l(!0);let b=await f(g.trim());l(!1),b?j(b):m(!1)}return(0,b.jsx)(ae.Dialog,{open:a,onOpenChange:m,children:(0,b.jsxs)(ae.DialogContent,{className:"max-w-sm bg-surface border-border text-txt",children:[(0,b.jsx)(ae.DialogTitle,{className:"text-sm font-semibold text-txt",children:d}),(0,b.jsxs)("form",{onSubmit:n,className:"flex flex-col gap-3",children:[(0,b.jsx)(E.Input,{autoFocus:!0,value:g,onChange:a=>h(a.target.value),placeholder:"Title",className:"bg-bg border-border text-txt"}),i&&(0,b.jsx)("p",{className:"text-xs text-danger",children:i}),(0,b.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,b.jsx)(o.Button,{type:"button",variant:"ghost",size:"sm",onClick:()=>m(!1),children:"Cancel"}),(0,b.jsx)(o.Button,{type:"submit",size:"sm",disabled:k||!g.trim(),className:"bg-accent text-accent-fg hover:bg-accent/90",children:"Create"})]})]})]})})}function ag({open:a,onOpenChange:d}){let[e,f]=(0,c.useState)("");return(0,b.jsx)(ae.Dialog,{open:a,onOpenChange:d,children:(0,b.jsxs)(ae.DialogContent,{className:"max-w-lg bg-surface border-border text-txt",children:[(0,b.jsx)(ae.DialogTitle,{className:"text-sm font-semibold text-txt",children:"Plan from spec"}),(0,b.jsxs)("form",{onSubmit:function(a){a.preventDefault(),e.trim()&&(d(!1),(0,t.askAgent)(`Break down this spec into tasks:
|
|
2
|
+
|
|
3
|
+
${e.trim()}`))},className:"flex flex-col gap-3",children:[(0,b.jsx)("textarea",{autoFocus:!0,value:e,onChange:a=>f(a.target.value),placeholder:"Paste a feature spec…",rows:12,className:"w-full resize-y rounded-md border border-border bg-bg px-3 py-2 text-sm text-txt placeholder:text-muted focus:outline-none focus:ring-1 focus:ring-accent"}),(0,b.jsx)("p",{className:"text-xs text-muted",children:"The agent asks where the tasks go (a new epic, an existing epic, or no epic) and shows a plan before writing anything."}),(0,b.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,b.jsx)(o.Button,{type:"button",variant:"ghost",size:"sm",onClick:()=>{f(""),d(!1)},children:"Cancel"}),(0,b.jsx)(o.Button,{type:"submit",size:"sm",disabled:!e.trim(),className:"bg-accent text-accent-fg hover:bg-accent/90",children:"Break down"})]})]})]})})}function ah({open:a,onOpenChange:c,items:d}){return(0,b.jsx)(ae.Dialog,{open:a,onOpenChange:c,children:(0,b.jsxs)(ae.DialogContent,{className:"max-w-lg bg-surface border-border text-txt",children:[(0,b.jsx)(ae.DialogTitle,{className:"text-sm font-semibold text-txt",children:"Break down epics"}),(0,b.jsx)(ai,{items:d,onDone:()=>c(!1)})]})})}function ai({items:a,onDone:d}){let e,f=(e=(a,b)=>a.order-b.order,a.filter(a=>null===a.parent).sort(e).map(b=>({horizon:b,epics:a.filter(a=>a.parent===b.id&&"done"!==a.status).sort((a,b)=>Number(a.tasks.length>0)-Number(b.tasks.length>0)||e(a,b))})).filter(a=>a.epics.length>0)),[g,h]=(0,c.useState)(()=>new Set(f.flatMap(a=>a.epics.filter(a=>0===a.tasks.length).map(a=>a.id)))),i=(0,H.useChats)().runningCount,j=Math.max(0,G.MAX_RUNNING_CHATS-i),k=g.size>j;return(0,b.jsxs)("form",{onSubmit:function(a){if(a.preventDefault(),g.size&&!k)for(let a of(d(),f))for(let b of a.epics)g.has(b.id)&&(0,t.askAgent)(`Break down epic ${b.id} into tasks.`,{newChat:!0})},className:"flex flex-col gap-3",children:[(0,b.jsx)("div",{className:"max-h-[50vh] overflow-y-auto rounded-md border border-border",children:f.map(a=>(0,b.jsxs)("div",{children:[(0,b.jsxs)("div",{className:"sticky top-0 bg-surface2 px-3 py-1 text-[10px] font-mono uppercase tracking-widest text-muted",children:[a.horizon.id," · ",a.horizon.title]}),(0,b.jsx)("ul",{children:a.epics.map(a=>{let c=g.has(a.id);return(0,b.jsx)("li",{className:"border-b border-border last:border-b-0",children:(0,b.jsxs)("label",{className:"flex items-start gap-2 px-3 py-1.5 text-xs cursor-pointer has-[:disabled]:cursor-not-allowed",children:[(0,b.jsx)("input",{type:"checkbox",checked:c,disabled:!c&&g.size>=j,onChange:()=>{var b;return b=a.id,void h(a=>{let c=new Set(a);return c.delete(b)||c.add(b),c})},className:"mt-0.5 accent-accent"}),(0,b.jsxs)("span",{className:"flex-1 min-w-0 text-txt",children:[(0,b.jsx)("span",{className:"font-mono text-muted mr-1",children:a.id}),a.title]}),a.tasks.length>0&&(0,b.jsxs)("span",{className:"shrink-0 text-[10px] font-mono text-muted",children:["has ",a.tasks.length," task",1===a.tasks.length?"":"s"]})]})},a.id)})})]},a.horizon.id))}),(0,b.jsx)("p",{className:k||0===j?"text-xs text-amber":"text-xs text-muted",children:0===j?`All ${G.MAX_RUNNING_CHATS} agent slots are busy. Stop a chat or wait for one to finish.`:k?`${g.size} selected, but only ${j} of ${G.MAX_RUNNING_CHATS} agent slots ${1===j?"is":"are"} free (${i} running). Uncheck some or stop a chat.`:`One chat per epic, running at once (${j} of ${G.MAX_RUNNING_CHATS} agent slots free). Each shows a plan before writing anything.`}),(0,b.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,b.jsx)(o.Button,{type:"button",variant:"ghost",size:"sm",onClick:d,children:"Cancel"}),(0,b.jsxs)(o.Button,{type:"submit",size:"sm",disabled:!g.size||k,className:"bg-accent text-accent-fg hover:bg-accent/90",children:["Break down ",g.size||""," epic",1===g.size?"":"s"]})]})]})}async function aj(a,b){try{let c=await fetch(a,void 0===b?void 0:{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(b)}),d=await c.json().catch(()=>null);if(!c.ok)return{error:d?.error??`Request failed (${c.status})`};return{data:d}}catch{return{error:"Could not reach the server"}}}function ak(a,b,c,d){var f;let g,h,i,j,k,[l,m]=(f=!d,h=(g=a=>({x:a.position.x+(a.measured?.width??("horizon"===a.type?z.HORIZON_W:z.FEATURE_W))/2,y:a.position.y+(a.measured?.height??48)/2}))(b),j=(i=g(c)).x-h.x,k=i.y-h.y,f||Math.abs(j)>Math.abs(k)?j>0?[e.Position.Right,e.Position.Left]:[e.Position.Left,e.Position.Right]:k>0?[e.Position.Bottom,e.Position.Top]:[e.Position.Top,e.Position.Bottom]);return{id:a,source:b.id,target:c.id,sourceHandle:l,targetHandle:`${m}-t`,type:d?"straight":"default",selectable:!1,...function(a,b,c){if(c)return"done"===a.data.item.status?{style:{stroke:"var(--color-accent)",strokeWidth:3}}:{style:{stroke:"var(--color-border2)",strokeWidth:3,strokeDasharray:"6 6"}};let d=b.data.item.status;return"in-progress"===d?{animated:!0,style:{stroke:"var(--color-accent)",strokeWidth:2}}:"done"===d?{style:{stroke:"var(--color-border2)",strokeWidth:1.5}}:{style:{stroke:"var(--color-border2)",strokeWidth:1.5,strokeDasharray:"2 5",strokeLinecap:"round"}}}(b,c,d)}}function al(a){let b=new MutationObserver(a);return b.observe(document.documentElement,{attributes:!0,attributeFilter:["class"]}),()=>b.disconnect()}let am={"--xy-background-color":"var(--color-bg)"};function an(){let{rootParam:a,openDoc:e,board:f}=(0,m.useApp)(),{showAbout:p}=(0,H.useChats)(),v=(0,l.useRouter)(),w=(0,l.useSearchParams)(),y="timeline"===w.get("view")?"timeline":"map",A=(0,r.localToday)(),[B,C]=(0,c.useState)([]),[D,E]=(0,c.useState)({}),[F,G]=(0,c.useState)([]),[I,J]=(0,c.useState)(!0),[K,L]=(0,c.useState)(null),[M,N]=(0,c.useState)(null),[O,P]=(0,c.useState)(null),[Q,S]=(0,c.useState)(null),T=w.get("item"),[U,W]=(0,c.useState)(null);T!==U&&(W(T),T&&N(T));let[X,Y]=(0,c.useState)(null),[Z,_]=(0,c.useState)(!1),[aa,ab]=(0,c.useState)(null),[ac,ad]=(0,c.useState)(!1),[ae,ai]=(0,c.useState)(!1),an=(0,c.useRef)(!1),aq=(0,c.useRef)(null),ar=(0,c.useCallback)(a=>{let b=aq.current?.clientWidth??0,c=a.getNodesBounds(a.getNodes());if(!b||!c.width)return;let d=Math.min(1,Math.max(.75,(b-80)/c.width));a.setViewport({x:b/2-(c.x+c.width/2)*d,y:40-c.y*d,zoom:d})},[]),as=(0,c.useRef)(!1),at=(0,c.useRef)(0),au=(0,c.useSyncExternalStore)(al,()=>document.documentElement.classList.contains("dark"),()=>!0),av=(0,c.useCallback)((a,b)=>{C(a),E(b),G(c=>{let d,e;return d=(0,z.resolvePositions)(a,b),e=new Map(c.map(a=>[a.id,a])),a.map(a=>{let b=e.get(a.id);return{id:a.id,type:null===a.parent?"horizon":"feature",position:d[a.id]??{x:0,y:0},data:{item:a},measured:b?.measured,selected:b?.selected}})})},[]),aw=(0,c.useCallback)(()=>{let b=++at.current;return aj(`/api/roadmap${a}`).then(({data:a,error:c})=>{if(b===at.current){if(J(!1),c){L(c),av([],{}),N(null);return}L(null),Y(a?.generateSource??null),av(a?.items??[],a?.layout??{})}})},[a,av]);(0,c.useEffect)(()=>{aw()},[aw]),(0,c.useEffect)(()=>{let a=new EventSource("/api/events");return a.onmessage=a=>{try{let b=JSON.parse(a.data);if("roadmap_updated"!==b.type)return;an.current?as.current=!0:aw()}catch{}},()=>a.close()},[aw]);let ax=(0,c.useMemo)(()=>{let a=new Map(F.map(a=>[a.id,a])),b=[],c=B.filter(a=>null===a.parent).sort((a,b)=>a.order-b.order);for(let d of(c.forEach((d,e)=>{let f=a.get(d.id),g=c[e+1]&&a.get(c[e+1].id);f&&g&&b.push(ak(`spine-${d.id}`,f,g,!0))}),B)){let c=d.parent&&a.get(d.parent),e=a.get(d.id);c&&e&&"horizon"===c.type&&b.push(ak(`branch-${d.id}`,c,e,!1))}return b},[B,F]),ay=(0,c.useMemo)(()=>Object.fromEntries(Object.values(f??{}).flat().map(a=>[a.id,a])),[f]),az=(0,c.useMemo)(()=>(0,r.roadmapHealth)(B,ay,A),[B,ay,A]),aA=(0,c.useMemo)(()=>{let a=Object.values(ay),b=new Map(B.filter(a=>null===a.parent).sort((a,b)=>a.order-b.order).map((a,b)=>[a.id,b+1]));return F.map(c=>{var d;let e,{item:f}=c.data,g=B.filter(a=>a.parent===f.id),h="feature"===c.type&&"in-progress"===f.status?q(f,a):null;return{...c,data:{...c.data,progress:az.progress[c.id],drift:az.drift.filter(a=>a.id===c.id).map(a=>a.message),dueState:(0,r.dueState)(f.due,f.status,A),..."feature"===c.type&&{...(d=f.tasks,{taskDue:e=(0,r.taskDueSummary)(d,ay,A),taskDueSoon:!!e?.next&&"soon"===(0,r.dueState)(e.next,"planned",A)}),taskStatuses:f.tasks.map(a=>ay[a]?.status).filter(a=>!!a&&"cancelled"!==a),nextTaskId:h?.kind==="ready"?h.taskId:null},..."horizon"===c.type&&{chapter:b.get(f.id),epics:{done:g.filter(a=>"done"===a.status).length,total:g.length}}}}})},[F,B,az,A,ay]),aB=(0,c.useCallback)(a=>G(b=>(0,d.applyNodeChanges)(a,b)),[]);async function aC(){_(!0),L(null);let{data:b,error:c}=await aj(`/api/roadmap/generate${a}`,{});if(c){L(c),_(!1);return}let d=Object.fromEntries(Object.entries((0,z.resolvePositions)(b?.items??[],{})).map(([a,b])=>[a,{x:Math.round(b.x),y:Math.round(b.y)}])),{error:e}=await aj(`/api/roadmap/layout${a}`,{positions:d});await aw(),e&&L(e),_(!1)}let aD=Object.values(f??{}).flat().filter(a=>"cancelled"!==a.status).length,aE="roadmap-md"===X?"from ROADMAP.md":"tasks"===X?`from ${aD} tasks, grouped by phase`:"starter horizons: Shipped · Now · Next · Later";async function aF(b){let{error:c}=await aj(`/api/roadmap/create${a}`,{title:b,parent:aa||null});return c||(await aw(),null)}async function aG(b,c){av(B.map(a=>a.id===b?{...a,...c}:a),D);let{data:d,error:e}=await aj(`/api/roadmap/update${a}`,{id:b,patch:c});if(e)return await aw(),e;let f=d?.item;return f?av(B.map(a=>a.id===b?f:a),D):await aw(),null}async function aH(b){let{data:c,error:d}=await aj(`/api/roadmap/delete${a}`,{id:b});return d||(av(B.filter(a=>a.id!==b),D),c&&(0,V.undoToast)(`Deleted ${b}`,async()=>{let{error:b}=await aj(`/api/roadmap/restore${a}`,c);if(b)throw Error(b);await aw()}),null)}let aI=B.find(a=>a.id===M)??null,aJ=a=>{a&&L(a)},aK={edit:a=>{N(a),P(a)},setStatus:(a,b)=>{aG(a,{status:b}).then(aJ)},move:(a,b)=>{aG(a,{parent:b}).then(aJ)},addEpic:a=>{N(null),ab(a)},duplicate:async b=>{let c=B.find(a=>a.id===b);if(!c)return;let{data:d,error:e}=await aj(`/api/roadmap/create${a}`,{title:`${c.title} (copy)`,parent:c.parent,status:"planned",order:c.order+1,due:c.due,body:c.body});if(e)return L(e);await aw(),d?.item&&N(d.item.id)},openFile:a=>e(a),chat:a=>{N(null),p({kind:"epic",id:a})},remove:async a=>{let b=await aH(a);if(b)return L(b);M===a&&N(null)}},aL=(a,b)=>{b.preventDefault(),S({id:a,x:b.clientX,y:b.clientY})},aM=(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(af,{open:null!==aa,heading:aa?`New feature under ${aa}`:"New horizon",onOpenChange:a=>{a||ab(null)},onSubmit:aF}),(0,b.jsx)(ag,{open:ac,onOpenChange:ad}),(0,b.jsx)(ah,{open:ae,onOpenChange:ai,items:B})]});return I?(0,b.jsx)("div",{className:"flex-1 flex items-center justify-center text-sm text-muted",children:"Loading…"}):0===B.length?(0,b.jsxs)("div",{className:"flex-1 p-6",children:[K&&(0,b.jsx)("p",{className:"mb-4 text-sm text-danger",children:K}),(0,b.jsx)(n.EmptyState,{icon:"🗺️",message:"No roadmap yet",subMessage:"Items live in plans/roadmap/R*.md",bordered:!0}),(0,b.jsxs)("div",{className:"mt-4 flex flex-col items-center gap-2",children:[(0,b.jsxs)("div",{className:"flex gap-2",children:[(0,b.jsxs)(o.Button,{size:"sm",onClick:aC,disabled:Z,className:"bg-accent text-accent-fg hover:bg-accent/90",children:[(0,b.jsx)(k.Sparkles,{})," ",Z?"Generating…":"Generate roadmap"]}),(0,b.jsxs)(o.Button,{size:"sm",variant:"outline",onClick:()=>(0,t.askAgent)("Plan a roadmap for this project."),disabled:Z,children:[(0,b.jsx)(g.Bot,{})," Plan with agent"]}),(0,b.jsxs)(o.Button,{size:"sm",variant:"outline",onClick:()=>ad(!0),disabled:Z,children:[(0,b.jsx)(h.FileText,{})," Plan from spec"]}),(0,b.jsxs)(o.Button,{size:"sm",variant:"outline",onClick:()=>ab(""),disabled:Z,children:[(0,b.jsx)(j.Plus,{})," Create first horizon"]})]}),(0,b.jsxs)("p",{className:"text-xs text-muted",children:["Generate ",aE,". Existing files are not modified."]})]}),aM]}):(0,b.jsxs)("div",{className:"relative flex flex-1 min-h-0 flex-col",children:[(0,b.jsxs)("div",{className:"flex shrink-0 items-center gap-4 border-b border-border px-3 py-2",children:[(0,b.jsx)("div",{className:"flex rounded-md border border-border p-0.5 text-xs",children:["map","timeline"].map(a=>(0,b.jsx)("button",{type:"button",onClick:()=>{let b,c;return b=new URLSearchParams(w.toString()),"map"===a?b.delete("view"):b.set("view",a),c=b.toString(),void v.replace(c?`/roadmap?${c}`:"/roadmap")},className:(0,s.cn)("rounded-sm px-3 py-1 capitalize",y===a?"bg-surface2 text-txt":"text-muted hover:text-txt"),children:a},a))}),(0,b.jsx)(ao,{items:B,tasksById:ay}),(0,b.jsxs)("div",{className:"ml-auto flex items-center gap-2",children:[K&&(0,b.jsx)("p",{className:"text-xs text-danger",children:K}),az.drift.length>0&&(0,b.jsx)(ap,{drift:az.drift,onSelect:N,onApply:a=>a.suggestedStatus&&aG(a.id,{status:a.suggestedStatus}).then(a=>{a&&L(a)})}),(0,b.jsxs)(o.Button,{size:"sm",variant:"outline",onClick:()=>ad(!0),children:[(0,b.jsx)(h.FileText,{})," Plan from spec"]}),B.some(a=>null!==a.parent&&"done"!==a.status)&&(0,b.jsxs)(o.Button,{size:"sm",variant:"outline",onClick:()=>ai(!0),children:[(0,b.jsx)(i.ListTree,{})," Break down epics…"]}),(0,b.jsxs)(o.Button,{size:"sm",onClick:()=>ab(""),className:"bg-accent text-accent-fg hover:bg-accent/90",children:[(0,b.jsx)(j.Plus,{})," Horizon"]})]})]}),"map"===y?(0,b.jsx)("div",{ref:aq,className:"relative flex-1 min-h-0",children:(0,b.jsxs)(d.ReactFlow,{nodes:aA,edges:ax,nodeTypes:u.nodeTypes,onNodesChange:aB,onNodeClick:(a,b)=>N(b.id),onNodeContextMenu:(a,b)=>aL(b.id,a),onNodeDragStart:()=>{an.current=!0},onNodeDragStop:(b,c,d)=>{let e;return an.current=!1,e=Object.fromEntries(d.map(a=>[a.id,{x:Math.round(a.position.x),y:Math.round(a.position.y)}])),void(av(B,{...D,...e}),aj(`/api/roadmap/layout${a}`,{positions:e}).then(({error:a})=>{a&&L(a),as.current&&(as.current=!1,aw())}))},nodesConnectable:!1,deleteKeyCode:null,colorMode:au?"dark":"light",onInit:ar,minZoom:.2,style:am,children:[(0,b.jsx)(d.Background,{variant:d.BackgroundVariant.Dots,gap:20,size:1}),(0,b.jsx)(d.Controls,{showInteractive:!1})]})}):(0,b.jsx)(x,{items:B,today:A,onSelect:N,onItemContextMenu:aL,progressById:az.progress}),(0,b.jsx)($,{item:aI,items:B,onClose:()=>N(null),editing:!!aI&&O===aI.id,onEditingChange:a=>P(a?M:null),actions:aK,onSave:aG,onDelete:aH,onAddFeature:a=>{N(null),ab(a)},onEditRaw:a=>{e(a)},tasksById:ay,progressById:az.progress,onSelect:N}),(0,b.jsx)(R,{at:Q,items:B,actions:aK,onClose:()=>S(null)}),aM]})}function ao({items:a,tasksById:c}){let d=a.filter(a=>null!==a.parent),e=a=>d.filter(b=>b.status===a).length,f=[...new Set(d.flatMap(a=>a.tasks))].map(a=>c[a]).filter(a=>a&&"cancelled"!==a.status),g=f.filter(a=>"done"===a.status).length;return(0,b.jsxs)("div",{className:"hidden items-center gap-4 font-mono text-[11px] text-muted md:flex",children:[["in-progress","paused","done","planned"].filter(a=>"paused"!==a||e(a)>0).map(a=>(0,b.jsxs)("span",{className:"flex items-center gap-1.5",children:[(0,b.jsx)(u.StatusDot,{status:a}),(0,b.jsx)("span",{className:(0,s.cn)("tabular-nums","in-progress"===a&&e(a)>0?"text-accent":"text-txt"),children:e(a)}),u.STATUS_LABEL[a].toLowerCase()]},a)),f.length>0&&(0,b.jsxs)("span",{className:"flex items-center gap-2 border-l border-border pl-4",children:[(0,b.jsx)("span",{className:"relative h-1 w-20 overflow-hidden rounded-full bg-border",children:(0,b.jsx)("span",{className:"absolute inset-y-0 left-0 rounded-full bg-teal",style:{width:`${g/f.length*100}%`}})}),(0,b.jsxs)("span",{children:[(0,b.jsxs)("span",{className:"tabular-nums text-txt",children:[g,"/",f.length]})," tasks"]})]})]})}function ap({drift:a,onSelect:c,onApply:d}){return(0,b.jsxs)("details",{className:"group relative",children:[(0,b.jsxs)("summary",{className:"flex h-8 cursor-pointer list-none items-center gap-1.5 rounded-md border border-amber/40 bg-amber/10 px-2.5 text-xs font-medium text-txt hover:bg-amber/15 [&::-webkit-details-marker]:hidden",children:[(0,b.jsx)(f.AlertTriangle,{className:"h-3.5 w-3.5 text-amber"})," ",a.length," need attention"]}),(0,b.jsx)("ul",{className:"absolute right-0 top-full z-30 mt-1.5 max-h-72 w-80 overflow-y-auto rounded-lg border border-border bg-surface text-xs shadow-xl",children:a.map(a=>(0,b.jsxs)("li",{className:"flex items-start gap-2 border-b border-border px-3 py-2.5 last:border-0",children:[(0,b.jsx)("span",{className:"mt-1 h-1.5 w-1.5 shrink-0 rounded-full bg-amber"}),(0,b.jsx)("button",{type:"button",onClick:()=>c(a.id),className:"flex-1 text-left leading-relaxed text-muted hover:text-txt",children:a.message}),a.suggestedStatus&&(0,b.jsxs)("button",{type:"button",onClick:()=>d(a),className:"shrink-0 rounded-sm border border-border px-1.5 py-0.5 font-mono text-[10px] text-txt hover:border-accent hover:text-accent",title:`Set status to ${a.suggestedStatus}`,children:["→ ",a.suggestedStatus]})]},`${a.id}-${a.kind}`))})]})}a.s(["default",0,function(){return(0,b.jsx)("div",{className:"flex flex-col h-[calc(100svh-3rem)]",children:(0,b.jsx)(c.Suspense,{children:(0,b.jsx)(an,{})})})}],690793)}];
|
|
4
|
+
|
|
5
|
+
//# sourceMappingURL=src_app_%28app%29_roadmap_page_tsx_0vcq3jr._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/app/%28app%29/roadmap/page.tsx","../../../../src/components/roadmap/RoadmapTab.tsx","../../../../src/lib/work-queue.ts","../../../../src/components/roadmap/RoadmapTimeline.tsx","../../../../src/components/roadmap/RoadmapItemSheet.tsx","../../../../src/components/roadmap/ItemActionsMenu.tsx","../../../../src/components/roadmap/NewItemDialog.tsx","../../../../src/components/roadmap/PlanFromSpecDialog.tsx","../../../../src/components/roadmap/BreakdownEpicsDialog.tsx"],"sourcesContent":["\"use client\"\n\nimport { Suspense } from \"react\"\nimport { RoadmapTab } from \"@/components/roadmap/RoadmapTab\"\n\nexport default function RoadmapPage() {\n // main has no fixed height; the canvas needs one (viewport minus the h-12 AppHeader)\n return (\n <div className=\"flex flex-col h-[calc(100svh-3rem)]\">\n <Suspense>\n <RoadmapTab />\n </Suspense>\n </div>\n )\n}\n","\"use client\"\n\nimport { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from \"react\"\nimport {\n Background,\n BackgroundVariant,\n Controls,\n Position,\n ReactFlow,\n applyNodeChanges,\n type Edge,\n type NodeChange,\n type ReactFlowInstance,\n} from \"@xyflow/react\"\nimport \"@xyflow/react/dist/style.css\"\n\nconst MIN_INITIAL_ZOOM = 0.75\nconst VIEWPORT_PAD = 40\nimport { AlertTriangle, Bot, FileText, ListTree, Plus, Sparkles } from \"lucide-react\"\nimport { useRouter, useSearchParams } from \"next/navigation\"\nimport { useApp } from \"@/context/AppContext\"\nimport { EmptyState } from \"@/components/shared/EmptyState\"\nimport { Button } from \"@/components/ui/button\"\nimport type { RoadmapItem, RoadmapLayout, RoadmapSource, Task, TaskStatus, UpdateRoadmapItemPatch } from \"@/types\"\nimport { pickNextTask } from \"@/lib/work-queue\"\nimport { dueState, localToday, roadmapHealth, taskDueSummary, type RoadmapDrift, type TaskInfo } from \"@/lib/roadmap-health\"\nimport { cn } from \"@/lib/utils\"\nimport { askAgent } from \"@/lib/ask-agent\"\nimport { RoadmapTimeline } from \"./RoadmapTimeline\"\nimport { FEATURE_W, HORIZON_W, resolvePositions } from \"./layout\"\nimport { STATUS_LABEL, StatusDot, nodeTypes, type RoadmapNode } from \"./RoadmapNodes\"\nimport { RoadmapItemSheet } from \"./RoadmapItemSheet\"\nimport { NewItemDialog } from \"./NewItemDialog\"\nimport { PlanFromSpecDialog } from \"./PlanFromSpecDialog\"\nimport { BreakdownEpicsDialog } from \"./BreakdownEpicsDialog\"\nimport { ItemContextMenu, type ContextMenuState, type ItemActions } from \"./ItemActionsMenu\"\nimport { useChats } from \"@/context/ChatContext\"\nimport { undoToast } from \"@/components/ui/toast\"\n\ntype ApiResult<T> = { data?: T; error?: string }\n\nasync function api<T>(url: string, body?: unknown): Promise<ApiResult<T>> {\n try {\n const res = await fetch(\n url,\n body === undefined\n ? undefined\n : { method: \"POST\", headers: { \"Content-Type\": \"application/json\" }, body: JSON.stringify(body) },\n )\n const json = await res.json().catch(() => null)\n if (!res.ok) return { error: json?.error ?? `Request failed (${res.status})` }\n return { data: json as T }\n } catch {\n return { error: \"Could not reach the server\" }\n }\n}\n\nfunction taskDueFields(taskIds: string[], tasks: Record<string, TaskInfo>, today: string) {\n const taskDue = taskDueSummary(taskIds, tasks, today)\n return { taskDue, taskDueSoon: !!taskDue?.next && dueState(taskDue.next, \"planned\", today) === \"soon\" }\n}\n\nfunction buildNodes(items: RoadmapItem[], layout: RoadmapLayout, prev: RoadmapNode[]): RoadmapNode[] {\n const pos = resolvePositions(items, layout)\n const prevById = new Map(prev.map((n) => [n.id, n]))\n return items.map((item) => {\n const old = prevById.get(item.id)\n return {\n id: item.id,\n type: item.parent === null ? \"horizon\" : \"feature\",\n position: pos[item.id] ?? { x: 0, y: 0 },\n data: { item },\n // keep React Flow's measurements/selection across rebuilds\n measured: old?.measured,\n selected: old?.selected,\n }\n })\n}\n\n/** Pick the handle sides that face each other. Branches always leave a horizon sideways, like roadmap.sh. */\nfunction sides(a: RoadmapNode, b: RoadmapNode, horizontal: boolean): [Position, Position] {\n const center = (n: RoadmapNode) => ({\n x: n.position.x + (n.measured?.width ?? (n.type === \"horizon\" ? HORIZON_W : FEATURE_W)) / 2,\n y: n.position.y + (n.measured?.height ?? 48) / 2,\n })\n const ca = center(a)\n const cb = center(b)\n const dx = cb.x - ca.x\n const dy = cb.y - ca.y\n if (horizontal || Math.abs(dx) > Math.abs(dy)) return dx > 0 ? [Position.Right, Position.Left] : [Position.Left, Position.Right]\n return dy > 0 ? [Position.Bottom, Position.Top] : [Position.Top, Position.Bottom]\n}\n\n/** Spine: solid up to the current horizon, dashed after. Branch: follows the epic (live = animated accent). */\nfunction edgeStyle(a: RoadmapNode, b: RoadmapNode, spine: boolean): Pick<Edge, \"style\" | \"animated\"> {\n if (spine) {\n return a.data.item.status === \"done\"\n ? { style: { stroke: \"var(--color-accent)\", strokeWidth: 3 } }\n : { style: { stroke: \"var(--color-border2)\", strokeWidth: 3, strokeDasharray: \"6 6\" } }\n }\n const status = b.data.item.status\n if (status === \"in-progress\") return { animated: true, style: { stroke: \"var(--color-accent)\", strokeWidth: 2 } }\n if (status === \"done\") return { style: { stroke: \"var(--color-border2)\", strokeWidth: 1.5 } }\n return { style: { stroke: \"var(--color-border2)\", strokeWidth: 1.5, strokeDasharray: \"2 5\", strokeLinecap: \"round\" } }\n}\n\nfunction edge(id: string, a: RoadmapNode, b: RoadmapNode, spine: boolean): Edge {\n const [s, t] = sides(a, b, !spine)\n return {\n id,\n source: a.id,\n target: b.id,\n sourceHandle: s,\n targetHandle: `${t}-t`,\n type: spine ? \"straight\" : \"default\",\n selectable: false,\n ...edgeStyle(a, b, spine),\n }\n}\n\nfunction subscribeTheme(cb: () => void) {\n const mo = new MutationObserver(cb)\n mo.observe(document.documentElement, { attributes: true, attributeFilter: [\"class\"] })\n return () => mo.disconnect()\n}\n\nconst FLOW_STYLE = { \"--xy-background-color\": \"var(--color-bg)\" } as React.CSSProperties\n\nexport function RoadmapTab() {\n const { rootParam, openDoc, board } = useApp()\n const { showAbout } = useChats()\n const router = useRouter()\n const searchParams = useSearchParams()\n const view = searchParams.get(\"view\") === \"timeline\" ? \"timeline\" : \"map\"\n const setView = (v: \"map\" | \"timeline\") => {\n const params = new URLSearchParams(searchParams.toString())\n if (v === \"map\") params.delete(\"view\")\n else params.set(\"view\", v)\n const qs = params.toString()\n router.replace(qs ? `/roadmap?${qs}` : \"/roadmap\")\n }\n const today = localToday()\n const [items, setItems] = useState<RoadmapItem[]>([])\n const [layout, setLayout] = useState<RoadmapLayout>({})\n const [nodes, setNodes] = useState<RoadmapNode[]>([])\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n const [selectedId, setSelectedId] = useState<string | null>(null)\n // the sheet shows the edit form while this matches the selected item\n const [editingId, setEditingId] = useState<string | null>(null)\n const [menuAt, setMenuAt] = useState<ContextMenuState>(null)\n // ?item=R004 (links from a chat) opens that item's sheet; adjusted during render so a new link re-opens it\n const itemParam = searchParams.get(\"item\")\n const [seenItemParam, setSeenItemParam] = useState<string | null>(null)\n if (itemParam !== seenItemParam) {\n setSeenItemParam(itemParam)\n if (itemParam) setSelectedId(itemParam)\n }\n const [generateSource, setGenerateSource] = useState<RoadmapSource | null>(null)\n const [generating, setGenerating] = useState(false)\n // null = closed; \"\" = new horizon; \"R001\" = new feature under R001\n const [createParent, setCreateParent] = useState<string | null>(null)\n const [specOpen, setSpecOpen] = useState(false)\n const [breakdownOpen, setBreakdownOpen] = useState(false)\n const draggingRef = useRef(false)\n const containerRef = useRef<HTMLDivElement>(null)\n\n // Like roadmap.sh: open at readable zoom, centered horizontally, from the top of the map.\n // fitView on a large roadmap shrinks text to unreadable sizes.\n const showTop = useCallback((rf: ReactFlowInstance<RoadmapNode>) => {\n const width = containerRef.current?.clientWidth ?? 0\n const bounds = rf.getNodesBounds(rf.getNodes())\n if (!width || !bounds.width) return\n const zoom = Math.min(1, Math.max(MIN_INITIAL_ZOOM, (width - VIEWPORT_PAD * 2) / bounds.width))\n rf.setViewport({ x: width / 2 - (bounds.x + bounds.width / 2) * zoom, y: VIEWPORT_PAD - bounds.y * zoom, zoom })\n }, [])\n // a roadmap_updated that arrived mid-drag; reloaded once the drag's layout POST lands\n const pendingReloadRef = useRef(false)\n // only the latest load() may apply its response (guards project switches / overlapping SSE reloads)\n const loadSeqRef = useRef(0)\n\n const isDark = useSyncExternalStore(\n subscribeTheme,\n () => document.documentElement.classList.contains(\"dark\"),\n () => true,\n )\n\n const applyData = useCallback((nextItems: RoadmapItem[], nextLayout: RoadmapLayout) => {\n setItems(nextItems)\n setLayout(nextLayout)\n setNodes((prev) => buildNodes(nextItems, nextLayout, prev))\n }, [])\n\n const load = useCallback(() => {\n const seq = ++loadSeqRef.current\n type ListResponse = { items: RoadmapItem[]; layout: RoadmapLayout; generateSource?: RoadmapSource }\n return api<ListResponse>(`/api/roadmap${rootParam}`).then(({ data, error: err }) => {\n if (seq !== loadSeqRef.current) return\n setLoading(false)\n if (err) {\n setError(err)\n // never leave another project's (or stale) items on screen, editable against this root\n applyData([], {})\n setSelectedId(null)\n return\n }\n setError(null)\n setGenerateSource(data?.generateSource ?? null)\n applyData(data?.items ?? [], data?.layout ?? {})\n })\n }, [rootParam, applyData])\n\n useEffect(() => {\n load()\n }, [load])\n\n useEffect(() => {\n const es = new EventSource(\"/api/events\")\n es.onmessage = (e) => {\n try {\n const msg = JSON.parse(e.data)\n if (msg.type !== \"roadmap_updated\") return\n if (draggingRef.current) pendingReloadRef.current = true\n else load()\n } catch {\n // non-JSON keepalive; ignore\n }\n }\n return () => es.close()\n }, [load])\n\n const edges = useMemo(() => {\n const byId = new Map(nodes.map((n) => [n.id, n]))\n const out: Edge[] = []\n const horizons = items.filter((i) => i.parent === null).sort((a, b) => a.order - b.order)\n horizons.forEach((h, i) => {\n const a = byId.get(h.id)\n const next = horizons[i + 1] && byId.get(horizons[i + 1].id)\n if (a && next) out.push(edge(`spine-${h.id}`, a, next, true))\n })\n for (const item of items) {\n const p = item.parent && byId.get(item.parent)\n const c = byId.get(item.id)\n if (p && c && p.type === \"horizon\") out.push(edge(`branch-${item.id}`, p, c, false))\n }\n return out\n }, [items, nodes])\n\n // board is refreshed by AppContext on task_updated, so progress/drift follow task moves live\n const tasksById = useMemo<Record<string, Task>>(\n () => Object.fromEntries(Object.values(board ?? {}).flat().map((t) => [t.id, t])),\n [board],\n )\n const health = useMemo(() => roadmapHealth(items, tasksById, today), [items, tasksById, today])\n\n const shownNodes = useMemo(() => {\n const allTasks = Object.values(tasksById)\n // chapters number real horizons only; orphans on the spine get none\n const chapters = new Map(items.filter((i) => i.parent === null).sort((a, b) => a.order - b.order).map((h, i) => [h.id, i + 1]))\n return nodes.map((n) => {\n const { item } = n.data\n const kids = items.filter((i) => i.parent === item.id)\n const next = n.type === \"feature\" && item.status === \"in-progress\" ? pickNextTask(item, allTasks) : null\n return {\n ...n,\n data: {\n ...n.data,\n progress: health.progress[n.id],\n drift: health.drift.filter((d) => d.id === n.id).map((d) => d.message),\n dueState: dueState(item.due, item.status, today),\n ...(n.type === \"feature\" && {\n ...taskDueFields(item.tasks, tasksById, today),\n taskStatuses: item.tasks.map((id) => tasksById[id]?.status).filter((s): s is TaskStatus => !!s && s !== \"cancelled\"),\n nextTaskId: next?.kind === \"ready\" ? next.taskId : null,\n }),\n ...(n.type === \"horizon\" && {\n chapter: chapters.get(item.id),\n epics: { done: kids.filter((k) => k.status === \"done\").length, total: kids.length },\n }),\n },\n }\n })\n }, [nodes, items, health, today, tasksById])\n\n const onNodesChange = useCallback(\n (changes: NodeChange<RoadmapNode>[]) => setNodes((nds) => applyNodeChanges(changes, nds)),\n [],\n )\n\n function onDragStop(dragged: RoadmapNode[]) {\n draggingRef.current = false\n const positions: RoadmapLayout = Object.fromEntries(\n dragged.map((n) => [n.id, { x: Math.round(n.position.x), y: Math.round(n.position.y) }]),\n )\n // children without a saved position follow their horizon immediately\n applyData(items, { ...layout, ...positions })\n api(`/api/roadmap/layout${rootParam}`, { positions }).then(({ error: err }) => {\n if (err) setError(err)\n if (pendingReloadRef.current) {\n pendingReloadRef.current = false\n load()\n }\n })\n }\n\n async function generate() {\n setGenerating(true)\n setError(null)\n const { data, error: err } = await api<{ items: RoadmapItem[] }>(`/api/roadmap/generate${rootParam}`, {})\n if (err) {\n setError(err)\n setGenerating(false)\n return\n }\n // freeze the generated arrangement so later additions don't shift auto-placed horizons\n const positions: RoadmapLayout = Object.fromEntries(\n Object.entries(resolvePositions(data?.items ?? [], {})).map(([id, p]) => [id, { x: Math.round(p.x), y: Math.round(p.y) }]),\n )\n const { error: layoutErr } = await api(`/api/roadmap/layout${rootParam}`, { positions })\n await load()\n if (layoutErr) setError(layoutErr)\n setGenerating(false)\n }\n\n const openTaskCount = Object.values(board ?? {}).flat().filter((t) => t.status !== \"cancelled\").length\n const sourceLabel =\n generateSource === \"roadmap-md\" ? \"from ROADMAP.md\"\n : generateSource === \"tasks\" ? `from ${openTaskCount} tasks, grouped by phase`\n : \"starter horizons: Shipped · Now · Next · Later\"\n\n async function createItem(title: string): Promise<string | null> {\n const { error: err } = await api(`/api/roadmap/create${rootParam}`, {\n title,\n parent: createParent || null,\n })\n if (err) return err\n await load()\n return null\n }\n\n async function saveItem(id: string, patch: UpdateRoadmapItemPatch): Promise<string | null> {\n // Optimistic: the patch's fields are the item's fields; a failed write reloads the files\n applyData(items.map((i) => (i.id === id ? { ...i, ...patch } as RoadmapItem : i)), layout)\n const { data, error: err } = await api<{ item: RoadmapItem }>(`/api/roadmap/update${rootParam}`, { id, patch })\n if (err) { await load(); return err }\n const updated = data?.item\n if (updated) applyData(items.map((i) => (i.id === id ? updated : i)), layout)\n else await load()\n return null\n }\n\n async function deleteItem(id: string): Promise<string | null> {\n type Deleted = { file: string; raw: string; position: { x: number; y: number } | null }\n const { data, error: err } = await api<Deleted>(`/api/roadmap/delete${rootParam}`, { id })\n if (err) return err\n applyData(items.filter((i) => i.id !== id), layout)\n if (data) {\n undoToast(`Deleted ${id}`, async () => {\n const { error: undoErr } = await api(`/api/roadmap/restore${rootParam}`, data)\n if (undoErr) throw new Error(undoErr)\n await load()\n })\n }\n return null\n }\n\n const selected = items.find((i) => i.id === selectedId) ?? null\n\n const report = (err: string | null) => { if (err) setError(err) }\n const actions: ItemActions = {\n edit: (id) => { setSelectedId(id); setEditingId(id) },\n setStatus: (id, status) => { saveItem(id, { status }).then(report) },\n move: (id, horizonId) => { saveItem(id, { parent: horizonId }).then(report) },\n addEpic: (horizonId) => { setSelectedId(null); setCreateParent(horizonId) },\n duplicate: async (id) => {\n const src = items.find((i) => i.id === id)\n if (!src) return\n const { data, error: err } = await api<{ item: RoadmapItem }>(`/api/roadmap/create${rootParam}`, {\n title: `${src.title} (copy)`,\n parent: src.parent,\n status: \"planned\",\n order: src.order + 1,\n due: src.due,\n body: src.body,\n })\n if (err) return setError(err)\n await load()\n if (data?.item) setSelectedId(data.item.id)\n },\n openFile: (file) => openDoc(file),\n chat: (id) => { setSelectedId(null); showAbout({ kind: \"epic\", id }) },\n remove: async (id) => {\n const err = await deleteItem(id)\n if (err) return setError(err)\n if (selectedId === id) setSelectedId(null)\n },\n }\n const openMenu = (id: string, e: React.MouseEvent) => {\n e.preventDefault()\n setMenuAt({ id, x: e.clientX, y: e.clientY })\n }\n\n const dialog = (\n <>\n <NewItemDialog\n open={createParent !== null}\n heading={createParent ? `New feature under ${createParent}` : \"New horizon\"}\n onOpenChange={(v) => { if (!v) setCreateParent(null) }}\n onSubmit={createItem}\n />\n <PlanFromSpecDialog open={specOpen} onOpenChange={setSpecOpen} />\n <BreakdownEpicsDialog open={breakdownOpen} onOpenChange={setBreakdownOpen} items={items} />\n </>\n )\n\n if (loading) {\n return <div className=\"flex-1 flex items-center justify-center text-sm text-muted\">Loading…</div>\n }\n\n if (items.length === 0) {\n return (\n <div className=\"flex-1 p-6\">\n {error && <p className=\"mb-4 text-sm text-danger\">{error}</p>}\n <EmptyState icon=\"🗺️\" message=\"No roadmap yet\" subMessage=\"Items live in plans/roadmap/R*.md\" bordered />\n <div className=\"mt-4 flex flex-col items-center gap-2\">\n <div className=\"flex gap-2\">\n <Button size=\"sm\" onClick={generate} disabled={generating} className=\"bg-accent text-accent-fg hover:bg-accent/90\">\n <Sparkles /> {generating ? \"Generating…\" : \"Generate roadmap\"}\n </Button>\n <Button size=\"sm\" variant=\"outline\" onClick={() => askAgent(\"Plan a roadmap for this project.\")} disabled={generating}>\n <Bot /> Plan with agent\n </Button>\n <Button size=\"sm\" variant=\"outline\" onClick={() => setSpecOpen(true)} disabled={generating}>\n <FileText /> Plan from spec\n </Button>\n <Button size=\"sm\" variant=\"outline\" onClick={() => setCreateParent(\"\")} disabled={generating}>\n <Plus /> Create first horizon\n </Button>\n </div>\n <p className=\"text-xs text-muted\">Generate {sourceLabel}. Existing files are not modified.</p>\n </div>\n {dialog}\n </div>\n )\n }\n\n return (\n <div className=\"relative flex flex-1 min-h-0 flex-col\">\n <div className=\"flex shrink-0 items-center gap-4 border-b border-border px-3 py-2\">\n <div className=\"flex rounded-md border border-border p-0.5 text-xs\">\n {([\"map\", \"timeline\"] as const).map((v) => (\n <button\n key={v}\n type=\"button\"\n onClick={() => setView(v)}\n className={cn(\n \"rounded-sm px-3 py-1 capitalize\",\n view === v ? \"bg-surface2 text-txt\" : \"text-muted hover:text-txt\",\n )}\n >\n {v}\n </button>\n ))}\n </div>\n <RoadmapStats items={items} tasksById={tasksById} />\n <div className=\"ml-auto flex items-center gap-2\">\n {error && <p className=\"text-xs text-danger\">{error}</p>}\n {health.drift.length > 0 && (\n <AttentionMenu\n drift={health.drift}\n onSelect={setSelectedId}\n onApply={(d) => d.suggestedStatus && saveItem(d.id, { status: d.suggestedStatus }).then((err) => { if (err) setError(err) })}\n />\n )}\n <Button size=\"sm\" variant=\"outline\" onClick={() => setSpecOpen(true)}>\n <FileText /> Plan from spec\n </Button>\n {items.some((i) => i.parent !== null && i.status !== \"done\") && (\n <Button size=\"sm\" variant=\"outline\" onClick={() => setBreakdownOpen(true)}>\n <ListTree /> Break down epics…\n </Button>\n )}\n <Button size=\"sm\" onClick={() => setCreateParent(\"\")} className=\"bg-accent text-accent-fg hover:bg-accent/90\">\n <Plus /> Horizon\n </Button>\n </div>\n </div>\n\n {view === \"map\" ? (\n <div ref={containerRef} className=\"relative flex-1 min-h-0\">\n <ReactFlow<RoadmapNode>\n nodes={shownNodes}\n edges={edges}\n nodeTypes={nodeTypes}\n onNodesChange={onNodesChange}\n onNodeClick={(_, n) => setSelectedId(n.id)}\n onNodeContextMenu={(e, n) => openMenu(n.id, e)}\n onNodeDragStart={() => { draggingRef.current = true }}\n onNodeDragStop={(_, __, dragged) => onDragStop(dragged)}\n nodesConnectable={false}\n deleteKeyCode={null}\n colorMode={isDark ? \"dark\" : \"light\"}\n onInit={showTop}\n minZoom={0.2}\n style={FLOW_STYLE}\n >\n <Background variant={BackgroundVariant.Dots} gap={20} size={1} />\n <Controls showInteractive={false} />\n </ReactFlow>\n </div>\n ) : (\n <RoadmapTimeline items={items} today={today} onSelect={setSelectedId} onItemContextMenu={openMenu} progressById={health.progress} />\n )}\n\n <RoadmapItemSheet\n item={selected}\n items={items}\n onClose={() => setSelectedId(null)}\n editing={!!selected && editingId === selected.id}\n onEditingChange={(v) => setEditingId(v ? selectedId : null)}\n actions={actions}\n onSave={saveItem}\n onDelete={deleteItem}\n onAddFeature={(parentId) => { setSelectedId(null); setCreateParent(parentId) }}\n onEditRaw={(file) => { openDoc(file) }}\n tasksById={tasksById}\n progressById={health.progress}\n onSelect={setSelectedId}\n />\n <ItemContextMenu at={menuAt} items={items} actions={actions} onClose={() => setMenuAt(null)} />\n {dialog}\n </div>\n )\n}\n\n/** Epic counts by status double as the legend; tasks = every task linked to an epic. */\nfunction RoadmapStats({ items, tasksById }: { items: RoadmapItem[]; tasksById: Record<string, Task> }) {\n const epics = items.filter((i) => i.parent !== null)\n const count = (st: RoadmapItem[\"status\"]) => epics.filter((e) => e.status === st).length\n const linked = [...new Set(epics.flatMap((e) => e.tasks))].map((id) => tasksById[id]).filter((t) => t && t.status !== \"cancelled\")\n const done = linked.filter((t) => t.status === \"done\").length\n return (\n <div className=\"hidden items-center gap-4 font-mono text-[11px] text-muted md:flex\">\n {([\"in-progress\", \"paused\", \"done\", \"planned\"] as const).filter((st) => st !== \"paused\" || count(st) > 0).map((st) => (\n <span key={st} className=\"flex items-center gap-1.5\">\n <StatusDot status={st} />\n <span className={cn(\"tabular-nums\", st === \"in-progress\" && count(st) > 0 ? \"text-accent\" : \"text-txt\")}>{count(st)}</span>\n {STATUS_LABEL[st].toLowerCase()}\n </span>\n ))}\n {linked.length > 0 && (\n <span className=\"flex items-center gap-2 border-l border-border pl-4\">\n <span className=\"relative h-1 w-20 overflow-hidden rounded-full bg-border\">\n <span className=\"absolute inset-y-0 left-0 rounded-full bg-teal\" style={{ width: `${(done / linked.length) * 100}%` }} />\n </span>\n <span><span className=\"tabular-nums text-txt\">{done}/{linked.length}</span> tasks</span>\n </span>\n )}\n </div>\n )\n}\n\n/** Amber pill with the drift count; opens the list (closed by default so it never covers the map). */\nfunction AttentionMenu({ drift, onSelect, onApply }: {\n drift: RoadmapDrift[]\n onSelect: (id: string) => void\n onApply: (d: RoadmapDrift) => void\n}) {\n return (\n <details className=\"group relative\">\n <summary className=\"flex h-8 cursor-pointer list-none items-center gap-1.5 rounded-md border border-amber/40 bg-amber/10 px-2.5 text-xs font-medium text-txt hover:bg-amber/15 [&::-webkit-details-marker]:hidden\">\n <AlertTriangle className=\"h-3.5 w-3.5 text-amber\" /> {drift.length} need attention\n </summary>\n <ul className=\"absolute right-0 top-full z-30 mt-1.5 max-h-72 w-80 overflow-y-auto rounded-lg border border-border bg-surface text-xs shadow-xl\">\n {drift.map((d) => (\n <li key={`${d.id}-${d.kind}`} className=\"flex items-start gap-2 border-b border-border px-3 py-2.5 last:border-0\">\n <span className=\"mt-1 h-1.5 w-1.5 shrink-0 rounded-full bg-amber\" />\n <button type=\"button\" onClick={() => onSelect(d.id)} className=\"flex-1 text-left leading-relaxed text-muted hover:text-txt\">\n {d.message}\n </button>\n {d.suggestedStatus && (\n <button\n type=\"button\"\n onClick={() => onApply(d)}\n className=\"shrink-0 rounded-sm border border-border px-1.5 py-0.5 font-mono text-[10px] text-txt hover:border-accent hover:text-accent\"\n title={`Set status to ${d.suggestedStatus}`}\n >\n → {d.suggestedStatus}\n </button>\n )}\n </li>\n ))}\n </ul>\n </details>\n )\n}\n","// Pure next-task picker for an epic's work queue (no fs). Self-check: node src/lib/work-queue.check.mts\nimport type { RoadmapItem, Task } from './core'\n\nexport type QueueTask = Pick<Task, 'id' | 'status' | 'dependsOn'>\nexport type QueueResult =\n | { kind: 'ready'; taskId: string }\n | { kind: 'finished' }\n // needsHuman: no remaining task can move without someone unblocking or creating a task\n | { kind: 'waiting'; waiting: { taskId: string; reason: string }[]; needsHuman: boolean }\n\n/** Every `T\\d+` in a free-text \"Depends on\" line: \"T008, T009 (x)\" → [\"T008\",\"T009\"]. */\nexport function depIds(dependsOn: string): string[] {\n return [...new Set((dependsOn.match(/\\bT\\d+\\b/gi) ?? []).map(d => d.toUpperCase()))]\n}\n\nconst settled = (s: Task['status']) => s === 'done' || s === 'cancelled'\n\nexport function pickNextTask(epic: RoadmapItem, tasks: QueueTask[]): QueueResult {\n const byId = new Map(tasks.map(t => [t.id, t]))\n const linked = epic.tasks.map(id => byId.get(id)).filter((t): t is QueueTask => !!t)\n const unmet = (t: QueueTask) => depIds(t.dependsOn).filter(d => {\n const dep = byId.get(d)\n return !dep || !settled(dep.status)\n })\n\n for (const t of linked) {\n if (t.status === 'todo' && !unmet(t).length) return { kind: 'ready', taskId: t.id }\n }\n if (linked.every(t => settled(t.status))) return { kind: 'finished' }\n\n // Can this task still move without a human? in-progress/settled yes; blocked/paused/review/missing no\n // (review waits for someone to approve or send it back, R043);\n // todo only if it's in this epic (the queue never hands out outside tasks) and every unmet dep can.\n // Cycles count as stuck.\n const inEpic = new Set(epic.tasks)\n const memo = new Map<string, boolean>()\n const canMove = (id: string): boolean => {\n if (memo.has(id)) return memo.get(id) ?? false\n memo.set(id, false)\n const t = byId.get(id)\n const ok = !!t && t.status !== 'blocked' && t.status !== 'paused' && t.status !== 'review' && (t.status !== 'todo' || (inEpic.has(id) && unmet(t).every(canMove)))\n memo.set(id, ok)\n return ok\n }\n\n const waiting: { taskId: string; reason: string }[] = []\n for (const id of epic.tasks) {\n const t = byId.get(id)\n if (!t) waiting.push({ taskId: id, reason: `${id} has no task file` })\n else if (t.status === 'in-progress') waiting.push({ taskId: id, reason: `${id} is in progress (claimed)` })\n else if (t.status === 'blocked') waiting.push({ taskId: id, reason: `${id} is blocked` })\n else if (t.status === 'paused') waiting.push({ taskId: id, reason: `${id} is paused — needs a human to resume it` })\n else if (t.status === 'review') waiting.push({ taskId: id, reason: `${id} in review — needs a human` })\n else if (t.status === 'todo') {\n const deps = unmet(t).map(d => `${d} (${byId.get(d)?.status ?? 'missing'})`)\n waiting.push({ taskId: id, reason: `${id} waits on ${deps.join(', ')}` })\n }\n }\n return { kind: 'waiting', waiting, needsHuman: waiting.every(w => !canMove(w.taskId)) }\n}\n","\"use client\"\n\nimport { useEffect, useMemo, useRef } from \"react\"\nimport { cn } from \"@/lib/utils\"\nimport type { RoadmapItem } from \"@/types\"\nimport type { RoadmapProgress } from \"@/lib/roadmap-health\"\nimport { StatusDot } from \"./RoadmapNodes\"\nimport { AgentDot } from \"@/components/chat/AgentMark\"\nimport { LANE_ROW_H, buildTimeline, formatDay } from \"./timeline\"\n\nconst LANE_LABEL_W = 200\nconst HEADER_H = 36\n\ninterface RoadmapTimelineProps {\n items: RoadmapItem[]\n today: string\n onSelect: (id: string) => void\n onItemContextMenu?: (id: string, e: React.MouseEvent) => void\n progressById: Record<string, RoadmapProgress>\n}\n\nexport function RoadmapTimeline({ items, today, onSelect, onItemContextMenu, progressById }: RoadmapTimelineProps) {\n // same chapter numbers as the map: real horizons by order\n const chapters = new Map(items.filter((i) => i.parent === null).sort((a, b) => a.order - b.order).map((h, i) => [h.id, i + 1]))\n const tl = useMemo(() => buildTimeline(items, today), [items, today])\n const scrollRef = useRef<HTMLDivElement>(null)\n\n // open with today about a third from the left\n useEffect(() => {\n const el = scrollRef.current\n if (el) el.scrollLeft = Math.max(0, tl.todayX - (el.clientWidth - LANE_LABEL_W) / 3)\n }, [tl.todayX])\n\n const hasDates = tl.lanes.some((l) => l.markers.length > 0)\n\n return (\n <div className=\"flex flex-1 min-h-0 flex-col\">\n <div ref={scrollRef} className=\"relative flex-1 min-h-0 overflow-auto\">\n <div className=\"relative\" style={{ width: LANE_LABEL_W + tl.width, minHeight: \"100%\" }}>\n {/* month grid + today line, behind the lanes */}\n <div className=\"pointer-events-none absolute inset-y-0\" style={{ left: LANE_LABEL_W, width: tl.width }}>\n {tl.months.map((m) => (\n <div key={m.x} className=\"absolute inset-y-0 border-l border-border\" style={{ left: m.x }} />\n ))}\n <div className=\"absolute inset-y-0 left-0 bg-surface/50\" style={{ width: tl.todayX }} />\n <div className=\"absolute inset-y-0 w-px bg-accent shadow-[0_0_12px_rgb(var(--rgb-accent)/0.8)]\" style={{ left: tl.todayX }}>\n <span\n className=\"absolute -translate-x-1/2 rounded-full bg-accent px-2 py-0.5 font-mono text-[10px] uppercase tracking-wider text-accent-fg\"\n style={{ top: HEADER_H + 6 }}\n >\n Today\n </span>\n </div>\n </div>\n\n {/* month header */}\n <div className=\"sticky top-0 z-20 flex border-b border-border bg-bg\" style={{ height: HEADER_H }}>\n <div className=\"sticky left-0 z-10 shrink-0 bg-bg\" style={{ width: LANE_LABEL_W }} />\n <div className=\"relative\">\n {tl.months.map((m) => (\n <span key={m.x} className=\"absolute top-3 whitespace-nowrap pl-2 font-mono text-[10px] uppercase tracking-widest text-muted\" style={{ left: m.x }}>\n {m.label}\n </span>\n ))}\n </div>\n </div>\n\n {tl.lanes.map((lane) => (\n <div key={lane.item.id} className=\"relative flex border-b border-border\">\n <LaneLabel item={lane.item} chapter={chapters.get(lane.item.id)} progress={progressById[lane.item.id]} onSelect={onSelect} onContextMenu={onItemContextMenu} />\n <div className=\"relative\" style={{ width: tl.width, height: lane.rows * LANE_ROW_H + 12 }}>\n {lane.markers.map((mk) => (\n <button\n key={mk.item.id}\n type=\"button\"\n onClick={() => onSelect(mk.item.id)}\n onContextMenu={(e) => onItemContextMenu?.(mk.item.id, e)}\n title={`${mk.item.id} · ${mk.item.title} · due ${mk.item.due}${mk.state === \"overdue\" ? \" (overdue)\" : \"\"}`}\n className=\"group absolute flex items-center gap-1.5\"\n style={{ left: mk.x - 10, top: 6 + mk.row * LANE_ROW_H }}\n >\n {mk.horizon ? (\n <span\n className={cn(\n \"h-4 w-4 rotate-45 border-2 border-accent\",\n mk.item.status === \"done\" ? \"bg-accent\" : \"bg-bg\",\n mk.state === \"overdue\" && \"border-danger\",\n )}\n />\n ) : (\n <span className={cn(\"rounded-full\", mk.state === \"overdue\" && \"ring-2 ring-danger ring-offset-1 ring-offset-bg\")}>\n <StatusDot status={mk.item.status} />\n </span>\n )}\n <span\n className={cn(\n \"flex max-w-[150px] flex-col rounded-md border px-2 py-0.5 text-left transition-colors\",\n mk.item.status === \"in-progress\" ? \"border-accent/50 bg-surface shadow-[0_6px_18px_-10px_rgb(var(--rgb-accent)/0.7)]\"\n : mk.item.status === \"done\" ? \"border-border bg-surface/60\" : \"border-dashed border-border2 bg-bg\",\n \"group-hover:border-accent\",\n )}\n >\n <span className=\"flex items-center gap-1\">\n <span className={cn(\"truncate text-xs\", mk.item.status === \"done\" ? \"text-muted\" : \"text-txt\", mk.horizon && \"font-semibold\")}>\n {mk.item.title}\n </span>\n <AgentDot attach={{ kind: \"epic\", id: mk.item.id }} />\n </span>\n <span\n className={cn(\n \"font-mono text-[10px]\",\n mk.state === \"overdue\" ? \"text-danger\" : mk.state === \"soon\" ? \"text-amber\" : \"text-muted\",\n )}\n >\n {formatDay(mk.item.due as string)}\n </span>\n </span>\n </button>\n ))}\n </div>\n </div>\n ))}\n\n {!hasDates && (\n <p className=\"px-6 py-8 text-sm text-muted\" style={{ marginLeft: LANE_LABEL_W }}>\n No due dates yet — open an item and set a Due date.\n </p>\n )}\n </div>\n </div>\n\n {tl.undated.length > 0 && (\n <div className=\"max-h-28 shrink-0 overflow-y-auto border-t border-border bg-surface px-4 py-2\">\n <p className=\"mb-2 font-mono text-[10px] uppercase tracking-widest text-muted\">No due date · {tl.undated.length}</p>\n <div className=\"flex flex-wrap gap-1.5\">\n {tl.undated.map((i) => (\n <button\n key={i.id}\n type=\"button\"\n onClick={() => onSelect(i.id)}\n onContextMenu={(e) => onItemContextMenu?.(i.id, e)}\n className=\"flex items-center gap-1 rounded-md border border-border px-1.5 py-0.5 text-xs text-muted hover:border-accent hover:text-txt\"\n >\n <StatusDot status={i.status} />\n {i.title}\n <AgentDot attach={{ kind: \"epic\", id: i.id }} />\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n )\n}\n\nfunction LaneLabel({ item, chapter, progress, onSelect, onContextMenu }: {\n item: RoadmapItem\n chapter?: number\n progress?: RoadmapProgress\n onSelect: (id: string) => void\n onContextMenu?: (id: string, e: React.MouseEvent) => void\n}) {\n return (\n <button\n type=\"button\"\n onClick={() => onSelect(item.id)}\n onContextMenu={(e) => onContextMenu?.(item.id, e)}\n className=\"sticky left-0 z-10 flex shrink-0 items-center gap-3 border-r border-border bg-surface px-3 text-left hover:bg-surface2\"\n style={{ width: LANE_LABEL_W }}\n >\n <span\n className={cn(\n \"font-mono text-lg font-semibold tabular-nums\",\n item.status === \"in-progress\" ? \"text-accent\" : item.status === \"done\" ? \"text-teal\" : \"text-muted\",\n )}\n >\n {chapter ? String(chapter).padStart(2, \"0\") : \"··\"}\n </span>\n <span className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <span className=\"line-clamp-2 text-[11px] font-semibold uppercase leading-snug tracking-wider text-txt\">{item.title}</span>\n {progress && (\n <span className=\"h-1 overflow-hidden rounded-full bg-border\">\n <span className=\"block h-full rounded-full bg-teal\" style={{ width: `${(progress.done / progress.total) * 100}%` }} />\n </span>\n )}\n </span>\n </button>\n )\n}\n","\"use client\"\n\nimport { useState } from \"react\"\nimport { Bot, ChevronRight, FileText, MessageSquare, Pencil, Plus } from \"lucide-react\"\nimport { Sheet, SheetContent, SheetDescription, SheetTitle } from \"@/components/ui/sheet\"\nimport { Input } from \"@/components/ui/input\"\nimport { Button } from \"@/components/ui/button\"\nimport { MarkdownRenderer } from \"@/components/docs/MarkdownRenderer\"\nimport { cn } from \"@/lib/utils\"\nimport { askAgent } from \"@/lib/ask-agent\"\nimport { chatFor } from \"@/lib/chats\"\nimport { AgentDot, AgentMark } from \"@/components/chat/AgentMark\"\nimport { useChats } from \"@/context/ChatContext\"\nimport { dueState, localToday, type RoadmapProgress } from \"@/lib/roadmap-health\"\nimport { pickNextTask } from \"@/lib/work-queue\"\nimport { ItemActionsMenu, type ItemActions } from \"./ItemActionsMenu\"\nimport { useItemCommands } from \"@/components/shared/item-commands\"\nimport { OwnerChip } from \"@/components/shared/OwnerChip\"\nimport { ItemPanelHeader } from \"@/components/shared/ItemPanelHeader\"\nimport { InlineDate, InlineSelect } from \"@/components/shared/InlineProperty\"\nimport { toast } from \"@/components/ui/toast\"\nimport { DueChip, STATUS_LABEL, SegmentedProgress, StatusDot, StatusPill, TASK_STATUS_BG } from \"./RoadmapNodes\"\nimport type { RoadmapItem, RoadmapStatus, Task, TaskStatus, UpdateRoadmapItemPatch } from \"@/types\"\n\nconst STATUSES: RoadmapStatus[] = [\"planned\", \"in-progress\", \"paused\", \"done\"]\n\nconst FIELD = \"w-full rounded-md border border-border bg-bg px-3 py-2 text-sm text-txt focus:outline-hidden focus:ring-1 focus:ring-accent disabled:opacity-50\"\nconst LABEL = \"text-xs font-medium text-muted\"\nconst SECTION = \"font-mono text-[10px] uppercase tracking-widest text-muted\"\n\ninterface RoadmapItemSheetProps {\n item: RoadmapItem | null\n items: RoadmapItem[]\n onClose: () => void\n /** Each returns an error message, or null on success. */\n onSave: (id: string, patch: UpdateRoadmapItemPatch) => Promise<string | null>\n onDelete: (id: string) => Promise<string | null>\n onAddFeature: (parentId: string) => void\n onEditRaw: (file: string) => void\n onSelect: (id: string) => void\n /** Every task on the board, by id — the epic's linked tasks are looked up here. */\n tasksById: Record<string, Task>\n progressById: Record<string, RoadmapProgress>\n editing: boolean\n onEditingChange: (editing: boolean) => void\n actions: ItemActions\n}\n\nexport function RoadmapItemSheet({ item, onClose, ...rest }: RoadmapItemSheetProps) {\n return (\n <Sheet open={!!item} onOpenChange={(v) => { if (!v) onClose() }}>\n <SheetContent className=\"w-[480px] sm:max-w-[480px] gap-0 bg-surface border-border text-txt flex flex-col overflow-y-auto p-0\">\n {/* keyed so view/edit and form state re-initialise when a different item opens */}\n {item && <ItemPanel key={item.id} item={item} onClose={onClose} {...rest} />}\n </SheetContent>\n </Sheet>\n )\n}\n\nfunction ItemPanel(props: RoadmapItemSheetProps & { item: RoadmapItem }) {\n return props.editing\n ? <ItemForm {...props} onCancel={() => props.onEditingChange(false)} />\n : <ItemView {...props} onEdit={() => props.onEditingChange(true)} />\n}\n\n/** Read-first view: where it sits, how far along, what's next, and the brief. */\nfunction ItemView({ item, items, onClose, onAddFeature, onEditRaw, onSelect, tasksById, progressById, onEdit, actions, onSave }: RoadmapItemSheetProps & { item: RoadmapItem; onEdit: () => void }) {\n const isHorizon = item.parent === null\n const parent = items.find((i) => i.id === item.parent)\n const epics = items.filter((i) => i.parent === item.id).sort((a, b) => a.order - b.order)\n const progress = progressById[item.id]\n const today = localToday()\n const { chats, showAbout } = useChats()\n const chat = isHorizon ? undefined : chatFor(chats, { kind: \"epic\", id: item.id })\n const offerBreakdown = !isHorizon && item.tasks.length === 0 && !chat\n const [menuOpen, setMenuOpen] = useState(false)\n const save = (patch: UpdateRoadmapItemPatch) => { onSave(item.id, patch).then((err) => { if (err) toast(err) }) }\n useItemCommands(`${item.id} · ${item.title}`, [\n { action: \"edit\", label: \"Edit\", run: onEdit },\n { action: \"status\", label: \"Change status…\", run: () => setMenuOpen(true) },\n { action: \"duplicate\", label: \"Duplicate\", run: () => actions.duplicate(item.id) },\n ...(isHorizon ? [] : [{ action: \"chat\" as const, label: \"Chat about it\", run: () => actions.chat(item.id) }]),\n ...(epics.length ? [] : [{ action: \"remove\" as const, label: \"Delete\", run: () => actions.remove(item.id) }]),\n ])\n\n return (\n <div className=\"flex min-h-full flex-col\">\n <ItemPanelHeader\n className={cn(\"px-6\", item.status === \"in-progress\" && \"bg-[linear-gradient(180deg,rgb(var(--rgb-accent)/0.08),transparent)]\")}\n kicker={\n <SheetDescription asChild>\n <div className=\"flex min-w-0 items-center gap-1\">\n {parent && (\n <>\n <button type=\"button\" onClick={() => onSelect(parent.id)} className=\"truncate hover:text-txt\">{parent.title}</button>\n <ChevronRight className=\"h-3 w-3 shrink-0\" />\n </>\n )}\n <span className=\"shrink-0\">{item.id} · {isHorizon ? \"horizon\" : \"epic\"}</span>\n <AgentMark attach={{ kind: \"epic\", id: item.id }} />\n </div>\n </SheetDescription>\n }\n title={<SheetTitle className=\"text-xl font-semibold leading-tight text-txt\">{item.title}</SheetTitle>}\n menu={<ItemActionsMenu item={item} items={items} actions={actions} open={menuOpen} onOpenChange={setMenuOpen} />}\n properties={[\n {\n label: \"Status\",\n value: (\n <InlineSelect label={`Status of ${item.id}`} value={item.status} onChange={(v) => actions.setStatus(item.id, v as RoadmapStatus)}\n options={STATUSES.map((s) => ({ value: s, label: STATUS_LABEL[s], node: <><StatusDot status={s} />{STATUS_LABEL[s]}</> }))}>\n <StatusPill status={item.status} />\n </InlineSelect>\n ),\n },\n {\n label: \"Owner\",\n value: (\n <InlineSelect label={`Owner of ${item.id}`} value={item.owner ?? \"\"} onChange={(v) => save({ owner: v || null })}\n options={[\n { value: \"human\", label: \"Human\", node: <OwnerChip owner=\"human\" className=\"text-xs\" /> },\n ...[...new Set([\"ai:claude\", ...(item.owner?.startsWith(\"ai:\") ? [item.owner] : [])])].map((a) => ({ value: a, label: a, node: <OwnerChip owner={a} className=\"text-xs\" /> })),\n { value: \"\", label: \"No owner\", node: <span className=\"text-muted\">No owner</span> },\n ]}>\n {item.owner ? <OwnerChip owner={item.owner} className=\"text-xs\" /> : <span className=\"text-muted\">—</span>}\n </InlineSelect>\n ),\n },\n {\n label: \"Due\",\n value: (\n <InlineDate label={`Due date of ${item.id}`} value={item.due} onChange={(v) => save({ due: v })}>\n {item.due ? <DueChip due={item.due} state={dueState(item.due, item.status, today)} /> : <span className=\"text-muted\">—</span>}\n </InlineDate>\n ),\n },\n { label: isHorizon ? \"Epics\" : \"Tasks\", value: <span className=\"font-mono\">{isHorizon ? epics.length : item.tasks.length}</span> },\n ]}\n >\n {progress && (\n <div className=\"mt-2 flex items-end gap-4\">\n <p className=\"font-mono text-3xl font-semibold leading-none tabular-nums text-txt\">\n {Math.round((progress.done / progress.total) * 100)}<span className=\"text-base text-muted\">%</span>\n </p>\n <div className=\"flex-1 pb-1\">\n <p className=\"mb-1.5 font-mono text-[10px] text-muted\">{progress.done} of {progress.total}{isHorizon ? \"\" : \" tasks\"} done</p>\n {isHorizon ? (\n <div className=\"h-1.5 overflow-hidden rounded-full bg-border\">\n <div className=\"h-full rounded-full bg-teal\" style={{ width: `${(progress.done / progress.total) * 100}%` }} />\n </div>\n ) : (\n <SegmentedProgress statuses={item.tasks.map((id) => tasksById[id]?.status).filter((s): s is TaskStatus => !!s && s !== \"cancelled\")} />\n )}\n </div>\n </div>\n )}\n </ItemPanelHeader>\n\n <div className=\"flex flex-1 flex-col gap-6 px-6 py-5\">\n {!isHorizon && item.tasks.length > 0 && <LinkedTasks item={item} tasksById={tasksById} onOpen={onEditRaw} />}\n\n {isHorizon && (\n <section className=\"flex flex-col gap-2\">\n <p className={SECTION}>Epics · {epics.length}</p>\n {epics.length === 0 && <p className=\"text-sm text-muted\">No epics yet.</p>}\n <ul className=\"-mx-2 flex flex-col\">\n {epics.map((e) => {\n const p = progressById[e.id]\n return (\n <li key={e.id}>\n <button type=\"button\" onClick={() => onSelect(e.id)} className=\"flex w-full items-center gap-3 rounded-md px-2 py-2 text-left hover:bg-surface2\">\n <StatusDot status={e.status} />\n <span className=\"shrink-0 font-mono text-[11px] text-muted\">{e.id}</span>\n <span className={cn(\"min-w-0 flex-1 truncate text-sm\", e.status === \"done\" ? \"text-muted\" : \"text-txt\")}>{e.title}</span>\n {p && <span className=\"shrink-0 font-mono text-[10px] text-muted\">{p.done}/{p.total}</span>}\n </button>\n </li>\n )\n })}\n </ul>\n </section>\n )}\n\n <section className=\"flex flex-col gap-2\">\n <p className={SECTION}>Brief</p>\n {item.body.trim()\n ? <MarkdownRenderer content={item.body} className=\"text-sm\" />\n : <p className=\"text-sm text-muted\">No description. Edit to add the outcome, scope and “done when”.</p>}\n </section>\n </div>\n\n <footer className=\"sticky bottom-0 flex flex-wrap items-center gap-2 border-t border-border bg-surface px-6 py-3\">\n {offerBreakdown && (\n <Button size=\"sm\" onClick={() => { onClose(); askAgent(`Break down epic ${item.id} into tasks.`) }} className=\"bg-accent text-accent-fg hover:bg-accent/90\">\n <Bot /> Break down with agent\n </Button>\n )}\n {!isHorizon && (\n <Button\n size=\"sm\"\n variant={offerBreakdown ? \"outline\" : \"default\"}\n onClick={() => { onClose(); showAbout({ kind: \"epic\", id: item.id }) }}\n className={cn(!offerBreakdown && \"bg-accent text-accent-fg hover:bg-accent/90\")}\n >\n <MessageSquare /> {chat ? \"Open chat\" : \"Chat\"}\n </Button>\n )}\n {isHorizon && (\n <Button size=\"sm\" onClick={() => onAddFeature(item.id)} className=\"bg-accent text-accent-fg hover:bg-accent/90\">\n <Plus /> Add epic\n </Button>\n )}\n <Button size=\"sm\" variant=\"outline\" onClick={onEdit}>\n <Pencil /> Edit\n </Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => onEditRaw(item.file)} className=\"ml-auto text-muted hover:text-txt\">\n <FileText /> Open file\n </Button>\n </footer>\n </div>\n )\n}\n\nfunction ItemForm({ item, items, onClose, onSave, onDelete, onCancel }: RoadmapItemSheetProps & { item: RoadmapItem; onCancel: () => void }) {\n // snapshot at open: the dirty check diffs against this, not the live (SSE-refreshed) item\n const [base] = useState(item)\n const [title, setTitle] = useState(item.title)\n const [status, setStatus] = useState<RoadmapStatus>(item.status)\n const [parent, setParent] = useState(item.parent ?? \"\")\n const [order, setOrder] = useState(String(item.order))\n const [tasks, setTasks] = useState(item.tasks.join(\", \"))\n const [due, setDue] = useState(item.due ?? \"\")\n const [body, setBody] = useState(item.body)\n const [error, setError] = useState<string | null>(null)\n const [busy, setBusy] = useState(false)\n\n const hasChildren = items.some((i) => i.parent === item.id)\n const horizons = items.filter((i) => i.parent === null && i.id !== item.id)\n const isHorizon = item.parent === null\n const orphanParent = item.parent !== null && !horizons.some((h) => h.id === item.parent)\n\n async function run(fn: () => Promise<string | null>) {\n setBusy(true)\n setError(null)\n const err = await fn()\n setBusy(false)\n if (err) setError(err)\n return !err\n }\n\n async function save() {\n // Send only fields the user changed, so concurrent edits (AI / other tab) to other fields survive.\n const patch: UpdateRoadmapItemPatch = {}\n const nextTitle = title.trim() || base.title\n if (nextTitle !== base.title) patch.title = nextTitle\n if (status !== base.status) patch.status = status\n if ((parent || null) !== base.parent) patch.parent = parent || null\n if (order.trim() !== String(base.order)) {\n const n = Number(order)\n if (order.trim() === \"\" || !Number.isFinite(n)) {\n setError(\"Order must be a number\")\n return\n }\n patch.order = n\n }\n const nextTasks = tasks.split(\",\").map((t) => t.trim()).filter(Boolean)\n if (nextTasks.join(\",\") !== base.tasks.join(\",\")) patch.tasks = nextTasks\n if ((due || null) !== base.due) patch.due = due || null\n if (body !== base.body) patch.body = body\n if (Object.keys(patch).length === 0) {\n onCancel()\n return\n }\n if (await run(() => onSave(item.id, patch))) onClose()\n }\n\n async function remove() {\n if (await run(() => onDelete(item.id))) onClose()\n }\n\n return (\n <div className=\"flex min-h-full flex-col\">\n <div className=\"border-b border-border px-6 pb-4 pt-6 pr-12\">\n <SheetDescription className=\"font-mono text-[11px] text-muted\">Editing {item.id} · {isHorizon ? \"horizon\" : \"epic\"}</SheetDescription>\n <SheetTitle className=\"mt-1 text-base text-txt\">{item.title}</SheetTitle>\n </div>\n\n <div className=\"flex flex-1 flex-col gap-4 px-6 py-5\">\n <label className=\"flex flex-col gap-1\">\n <span className={LABEL}>Title</span>\n <Input value={title} onChange={(e) => setTitle(e.target.value)} className=\"bg-bg border-border text-txt\" />\n </label>\n\n <div className=\"grid grid-cols-3 gap-3\">\n <label className=\"flex flex-col gap-1\">\n <span className={LABEL}>Status</span>\n <select value={status} onChange={(e) => setStatus(e.target.value as RoadmapStatus)} className={FIELD}>\n {STATUSES.map((s) => <option key={s} value={s}>{s}</option>)}\n </select>\n </label>\n <label className=\"flex flex-col gap-1\">\n <span className={LABEL}>Parent</span>\n <select\n value={parent}\n onChange={(e) => setParent(e.target.value)}\n disabled={hasChildren}\n title={hasChildren ? \"Items with children must stay on the spine\" : undefined}\n className={FIELD}\n >\n <option value=\"\">— (horizon)</option>\n {orphanParent && <option value={item.parent ?? \"\"}>{item.parent} · missing</option>}\n {horizons.map((h) => <option key={h.id} value={h.id}>{h.id} · {h.title}</option>)}\n </select>\n </label>\n <label className=\"flex flex-col gap-1\">\n <span className={LABEL}>Order</span>\n <Input\n type=\"number\"\n step={10}\n value={order}\n onChange={(e) => setOrder(e.target.value)}\n title={isHorizon ? \"Position on the spine\" : \"Position within the branch\"}\n className=\"bg-bg border-border text-txt\"\n />\n </label>\n </div>\n\n <label className=\"flex flex-col gap-1\">\n <span className={LABEL}>Due</span>\n <div className=\"flex items-center gap-2\">\n <Input\n type=\"date\"\n value={due}\n onChange={(e) => setDue(e.target.value)}\n className=\"bg-bg border-border text-txt scheme-light dark:scheme-dark\"\n />\n {due && (\n <button type=\"button\" onClick={() => setDue(\"\")} className=\"text-xs text-muted hover:text-txt\">\n Clear\n </button>\n )}\n </div>\n </label>\n\n <label className=\"flex flex-col gap-1\">\n <span className={LABEL}>Tasks</span>\n <Input\n value={tasks}\n onChange={(e) => setTasks(e.target.value)}\n placeholder=\"T001, T012\"\n className=\"bg-bg border-border text-txt font-mono\"\n />\n </label>\n\n <label className=\"flex flex-col gap-1\">\n <span className={LABEL}>Body (markdown)</span>\n <textarea value={body} onChange={(e) => setBody(e.target.value)} rows={12} className={`${FIELD} font-mono resize-y`} />\n </label>\n\n {error && <p className=\"text-xs text-danger\">{error}</p>}\n </div>\n\n <footer className=\"sticky bottom-0 flex items-center gap-2 border-t border-border bg-surface px-6 py-3\">\n <Button size=\"sm\" onClick={save} disabled={busy} className=\"bg-accent text-accent-fg hover:bg-accent/90\">\n Save\n </Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={onCancel} disabled={busy} className=\"text-txt\">\n Cancel\n </Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={remove} disabled={busy} className=\"ml-auto text-danger hover:text-danger\">\n Delete\n </Button>\n </footer>\n </div>\n )\n}\n\nfunction LinkedTasks({ item, tasksById, onOpen }: {\n item: RoadmapItem\n tasksById: Record<string, Task>\n onOpen: (file: string) => void\n}) {\n const today = localToday()\n const next = pickNextTask(item, Object.values(tasksById))\n const nextId = next.kind === \"ready\" ? next.taskId : null\n // Todo tasks' \"waits on …\" first: in-progress/blocked rows already say so in their badge.\n const reasons = next.kind === \"waiting\"\n ? [...next.waiting].sort((a, b) => Number(tasksById[b.taskId]?.status === \"todo\") - Number(tasksById[a.taskId]?.status === \"todo\")).map((w) => w.reason)\n : []\n return (\n <section className=\"flex flex-col gap-2\">\n <p className={SECTION}>Tasks · {item.tasks.length}</p>\n <ul className=\"-mx-2 flex flex-col\">\n {item.tasks.map((id) => {\n const t = tasksById[id]\n if (!t) {\n return (\n <li key={id} className=\"px-2 py-2 font-mono text-xs text-danger\">{id} · missing task file</li>\n )\n }\n const isNext = t.id === nextId\n return (\n <li key={id} className={cn(\"group flex items-center rounded-md hover:bg-surface2\", isNext && \"bg-accent/10 hover:bg-accent/15\")}>\n <button\n type=\"button\"\n onClick={() => onOpen(t.file)}\n className=\"flex min-w-0 flex-1 items-center gap-3 px-2 py-2 text-left\"\n >\n <span title={t.status} className={cn(\"h-2 w-2 shrink-0 rounded-full\", TASK_STATUS_BG[t.status])} />\n <span className=\"shrink-0 font-mono text-[11px] text-muted\">{t.id}</span>\n <span className={cn(\"min-w-0 flex-1 truncate text-sm\", t.status === \"cancelled\" ? \"text-muted line-through\" : t.status === \"done\" ? \"text-muted\" : \"text-txt\")}>\n {t.title}\n </span>\n <DueChip due={t.due} state={dueState(t.due, t.status === \"done\" ? \"done\" : \"planned\", today)} />\n {isNext\n ? <span className=\"shrink-0 font-mono text-[10px] uppercase tracking-wider text-accent\">Next up</span>\n : t.size && t.size !== \"—\" && <span className=\"shrink-0 font-mono text-[10px] text-muted\">{t.size.split(\" \")[0]}</span>}\n <AgentDot attach={{ kind: \"task\", id: t.id }} />\n </button>\n <TaskChatButton taskId={t.id} />\n </li>\n )\n })}\n </ul>\n {reasons.length > 0 && (\n <p className=\"truncate text-xs text-muted\" title={reasons.join(\"\\n\")}>\n {reasons[0]}{reasons.length > 1 && ` (+${reasons.length - 1} more)`}\n </p>\n )}\n </section>\n )\n}\n\n/** Per-task chat entry in the epic sheet: always visible when a chat exists, on hover otherwise. */\nfunction TaskChatButton({ taskId }: { taskId: string }) {\n const { chats, showAbout } = useChats()\n const has = !!chatFor(chats, { kind: \"task\", id: taskId })\n return (\n <button\n type=\"button\"\n onClick={() => showAbout({ kind: \"task\", id: taskId })}\n aria-label={`${has ? \"Open chat\" : \"Chat\"} about ${taskId}`}\n title={has ? `Open the chat about ${taskId}` : `Chat about ${taskId}`}\n className={cn(\n \"mr-1 grid size-7 shrink-0 place-items-center rounded-md text-muted transition-[opacity,color] duration-(--duration-fast) hover:bg-surface hover:text-accent focus-visible:opacity-100\",\n has ? \"text-accent opacity-100\" : \"opacity-0 group-hover:opacity-100\",\n )}\n >\n <MessageSquare className=\"size-3.5\" />\n </button>\n )\n}\n","\"use client\"\n\nimport { Copy, FileText, FolderInput, MessageSquare, MoreHorizontal, Pencil, Plus, Trash2 } from \"lucide-react\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\"\nimport { cn } from \"@/lib/utils\"\nimport { itemKeyLabel } from \"@/components/shared/item-commands\"\nimport { STATUS_LABEL, StatusDot } from \"./RoadmapNodes\"\nimport type { RoadmapItem, RoadmapStatus } from \"@/types\"\n\nconst STATUSES: RoadmapStatus[] = [\"planned\", \"in-progress\", \"paused\", \"done\"]\n\n/** What the roadmap page does for each menu entry. The menu itself holds no state. */\nexport interface ItemActions {\n edit: (id: string) => void\n setStatus: (id: string, status: RoadmapStatus) => void\n move: (id: string, horizonId: string) => void\n addEpic: (horizonId: string) => void\n duplicate: (id: string) => void\n openFile: (file: string) => void\n chat: (id: string) => void\n remove: (id: string) => void\n}\n\nfunction ItemMenuItems({ item, items, actions }: { item: RoadmapItem; items: RoadmapItem[]; actions: ItemActions }) {\n const isHorizon = item.parent === null\n const horizons = items.filter((i) => i.parent === null && i.id !== item.parent).sort((a, b) => a.order - b.order)\n const children = items.filter((i) => i.parent === item.id).length\n\n return (\n <>\n <DropdownMenuItem onSelect={() => actions.edit(item.id)}><Pencil /> Edit<DropdownMenuShortcut>{itemKeyLabel(\"edit\")}</DropdownMenuShortcut></DropdownMenuItem>\n <DropdownMenuSub>\n <DropdownMenuSubTrigger><StatusDot status={item.status} /> Status<DropdownMenuShortcut>{itemKeyLabel(\"status\")}</DropdownMenuShortcut></DropdownMenuSubTrigger>\n <DropdownMenuSubContent>\n {STATUSES.map((s) => (\n <DropdownMenuItem key={s} disabled={s === item.status} onSelect={() => actions.setStatus(item.id, s)}>\n <StatusDot status={s} /> {STATUS_LABEL[s]}\n </DropdownMenuItem>\n ))}\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n {!isHorizon && horizons.length > 0 && (\n <DropdownMenuSub>\n <DropdownMenuSubTrigger><FolderInput /> Move to horizon</DropdownMenuSubTrigger>\n <DropdownMenuSubContent className=\"max-h-72 overflow-y-auto\">\n {horizons.map((h) => (\n <DropdownMenuItem key={h.id} onSelect={() => actions.move(item.id, h.id)}>\n <span className=\"font-mono text-[11px] text-muted\">{h.id}</span> {h.title}\n </DropdownMenuItem>\n ))}\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n )}\n {isHorizon && <DropdownMenuItem onSelect={() => actions.addEpic(item.id)}><Plus /> Add epic</DropdownMenuItem>}\n <DropdownMenuItem onSelect={() => actions.duplicate(item.id)}><Copy /> Duplicate<DropdownMenuShortcut>{itemKeyLabel(\"duplicate\")}</DropdownMenuShortcut></DropdownMenuItem>\n <DropdownMenuSeparator />\n {!isHorizon && <DropdownMenuItem onSelect={() => actions.chat(item.id)}><MessageSquare /> Chat about it<DropdownMenuShortcut>{itemKeyLabel(\"chat\")}</DropdownMenuShortcut></DropdownMenuItem>}\n <DropdownMenuItem onSelect={() => actions.openFile(item.file)}><FileText /> Open file</DropdownMenuItem>\n <DropdownMenuSeparator />\n {children > 0 ? (\n <DropdownMenuItem disabled className=\"flex-col items-start gap-0\">\n <span className=\"flex items-center gap-2\"><Trash2 /> Delete</span>\n <span className=\"pl-6 text-[11px]\">Move or delete its {children} epic{children === 1 ? \"\" : \"s\"} first</span>\n </DropdownMenuItem>\n ) : (\n <DropdownMenuItem onSelect={() => actions.remove(item.id)} className=\"text-danger focus:text-danger\">\n <Trash2 /> Delete<DropdownMenuShortcut>{itemKeyLabel(\"remove\")}</DropdownMenuShortcut>\n </DropdownMenuItem>\n )}\n </>\n )\n}\n\n/** ⋯ button that opens the item's actions. */\nexport function ItemActionsMenu({ item, items, actions, className, open, onOpenChange }: {\n item: RoadmapItem\n items: RoadmapItem[]\n actions: ItemActions\n className?: string\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}) {\n return (\n <DropdownMenu open={open} onOpenChange={onOpenChange}>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n aria-label={`Actions for ${item.id}`}\n className={cn(\"grid size-7 place-items-center rounded-md text-muted hover:bg-surface2 hover:text-txt\", className)}\n >\n <MoreHorizontal className=\"size-4\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-52\">\n <ItemMenuItems item={item} items={items} actions={actions} />\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nexport type ContextMenuState = { id: string; x: number; y: number } | null\n\n/** The same actions, opened at the pointer (right-click on a map node or timeline bar). */\nexport function ItemContextMenu({ at, items, actions, onClose }: {\n at: ContextMenuState\n items: RoadmapItem[]\n actions: ItemActions\n onClose: () => void\n}) {\n const item = at && items.find((i) => i.id === at.id)\n if (!at || !item) return null\n return (\n // keyed by position so a second right-click re-anchors the menu\n <DropdownMenu key={`${at.id}:${at.x}:${at.y}`} open onOpenChange={(open) => { if (!open) onClose() }}>\n <DropdownMenuTrigger asChild>\n <span aria-hidden className=\"pointer-events-none fixed size-0\" style={{ left: at.x, top: at.y }} />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"w-52\">\n <ItemMenuItems item={item} items={items} actions={actions} />\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n","\"use client\"\n\nimport { useState } from \"react\"\nimport { Dialog, DialogContent, DialogTitle } from \"@/components/ui/dialog\"\nimport { Input } from \"@/components/ui/input\"\nimport { Button } from \"@/components/ui/button\"\n\ninterface NewItemDialogProps {\n open: boolean\n heading: string\n onOpenChange: (open: boolean) => void\n /** Returns an error message to show, or null on success. */\n onSubmit: (title: string) => Promise<string | null>\n}\n\nexport function NewItemDialog({ open, heading, onOpenChange, onSubmit }: NewItemDialogProps) {\n const [title, setTitle] = useState(\"\")\n const [error, setError] = useState<string | null>(null)\n const [busy, setBusy] = useState(false)\n\n function close(v: boolean) {\n if (!v) {\n setTitle(\"\")\n setError(null)\n }\n onOpenChange(v)\n }\n\n async function submit(e: React.FormEvent) {\n e.preventDefault()\n if (!title.trim()) return\n setBusy(true)\n const err = await onSubmit(title.trim())\n setBusy(false)\n if (err) setError(err)\n else close(false)\n }\n\n return (\n <Dialog open={open} onOpenChange={close}>\n <DialogContent className=\"max-w-sm bg-surface border-border text-txt\">\n <DialogTitle className=\"text-sm font-semibold text-txt\">{heading}</DialogTitle>\n <form onSubmit={submit} className=\"flex flex-col gap-3\">\n <Input\n autoFocus\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n placeholder=\"Title\"\n className=\"bg-bg border-border text-txt\"\n />\n {error && <p className=\"text-xs text-danger\">{error}</p>}\n <div className=\"flex justify-end gap-2\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => close(false)}>\n Cancel\n </Button>\n <Button type=\"submit\" size=\"sm\" disabled={busy || !title.trim()} className=\"bg-accent text-accent-fg hover:bg-accent/90\">\n Create\n </Button>\n </div>\n </form>\n </DialogContent>\n </Dialog>\n )\n}\n","\"use client\"\n\nimport { useState } from \"react\"\nimport { Dialog, DialogContent, DialogTitle } from \"@/components/ui/dialog\"\nimport { Button } from \"@/components/ui/button\"\nimport { askAgent } from \"@/lib/ask-agent\"\n\ninterface PlanFromSpecDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n}\n\n/** Paste a feature spec → the chat agent breaks it into tasks (new epic, existing epic, or loose). */\nexport function PlanFromSpecDialog({ open, onOpenChange }: PlanFromSpecDialogProps) {\n // Kept after submit (cleared only on Cancel): if the running-agent cap refuses the ask, reopening restores the spec.\n const [spec, setSpec] = useState(\"\")\n\n function submit(e: React.FormEvent) {\n e.preventDefault()\n if (!spec.trim()) return\n onOpenChange(false)\n askAgent(`Break down this spec into tasks:\\n\\n${spec.trim()}`)\n }\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"max-w-lg bg-surface border-border text-txt\">\n <DialogTitle className=\"text-sm font-semibold text-txt\">Plan from spec</DialogTitle>\n <form onSubmit={submit} className=\"flex flex-col gap-3\">\n <textarea\n autoFocus\n value={spec}\n onChange={(e) => setSpec(e.target.value)}\n placeholder=\"Paste a feature spec…\"\n rows={12}\n className=\"w-full resize-y rounded-md border border-border bg-bg px-3 py-2 text-sm text-txt placeholder:text-muted focus:outline-none focus:ring-1 focus:ring-accent\"\n />\n <p className=\"text-xs text-muted\">The agent asks where the tasks go (a new epic, an existing epic, or no epic) and shows a plan before writing anything.</p>\n <div className=\"flex justify-end gap-2\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => { setSpec(\"\"); onOpenChange(false) }}>\n Cancel\n </Button>\n <Button type=\"submit\" size=\"sm\" disabled={!spec.trim()} className=\"bg-accent text-accent-fg hover:bg-accent/90\">\n Break down\n </Button>\n </div>\n </form>\n </DialogContent>\n </Dialog>\n )\n}\n","\"use client\"\n\nimport { useState } from \"react\"\nimport { Dialog, DialogContent, DialogTitle } from \"@/components/ui/dialog\"\nimport { Button } from \"@/components/ui/button\"\nimport { askAgent } from \"@/lib/ask-agent\"\nimport { MAX_RUNNING_CHATS } from \"@/lib/chats\"\nimport { useChats } from \"@/context/ChatContext\"\nimport type { RoadmapItem } from \"@/types\"\n\ninterface BreakdownEpicsDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n items: RoadmapItem[]\n}\n\n/** Not-done epics grouped by horizon (spine order); within a horizon, epics with no tasks first. */\nfunction epicGroups(items: RoadmapItem[]) {\n const byOrder = (a: RoadmapItem, b: RoadmapItem) => a.order - b.order\n return items\n .filter((i) => i.parent === null)\n .sort(byOrder)\n .map((h) => ({\n horizon: h,\n epics: items\n .filter((i) => i.parent === h.id && i.status !== \"done\")\n .sort((a, b) => Number(a.tasks.length > 0) - Number(b.tasks.length > 0) || byOrder(a, b)),\n }))\n .filter((g) => g.epics.length > 0)\n}\n\n/** Tick several epics → one breakdown chat per epic, all running at once (capped by free agent slots). */\nexport function BreakdownEpicsDialog({ open, onOpenChange, items }: BreakdownEpicsDialogProps) {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"max-w-lg bg-surface border-border text-txt\">\n <DialogTitle className=\"text-sm font-semibold text-txt\">Break down epics</DialogTitle>\n {/* Mounted only while open, so the default selection is recomputed on every open */}\n <BreakdownForm items={items} onDone={() => onOpenChange(false)} />\n </DialogContent>\n </Dialog>\n )\n}\n\nfunction BreakdownForm({ items, onDone }: { items: RoadmapItem[]; onDone: () => void }) {\n const groups = epicGroups(items)\n const [checked, setChecked] = useState(\n () => new Set(groups.flatMap((g) => g.epics.filter((e) => e.tasks.length === 0).map((e) => e.id))),\n )\n const running = useChats().runningCount\n const free = Math.max(0, MAX_RUNNING_CHATS - running)\n const over = checked.size > free\n\n function toggle(id: string) {\n setChecked((s) => {\n const next = new Set(s)\n if (!next.delete(id)) next.add(id)\n return next\n })\n }\n\n function submit(e: React.FormEvent) {\n e.preventDefault()\n if (!checked.size || over) return\n onDone()\n // Spine order, same message as the single-epic \"Break down with agent\"\n for (const g of groups) for (const epic of g.epics) {\n if (checked.has(epic.id)) askAgent(`Break down epic ${epic.id} into tasks.`, { newChat: true })\n }\n }\n\n return (\n <form onSubmit={submit} className=\"flex flex-col gap-3\">\n <div className=\"max-h-[50vh] overflow-y-auto rounded-md border border-border\">\n {groups.map((g) => (\n <div key={g.horizon.id}>\n <div className=\"sticky top-0 bg-surface2 px-3 py-1 text-[10px] font-mono uppercase tracking-widest text-muted\">\n {g.horizon.id} · {g.horizon.title}\n </div>\n <ul>\n {g.epics.map((epic) => {\n const on = checked.has(epic.id)\n return (\n <li key={epic.id} className=\"border-b border-border last:border-b-0\">\n <label className=\"flex items-start gap-2 px-3 py-1.5 text-xs cursor-pointer has-[:disabled]:cursor-not-allowed\">\n <input\n type=\"checkbox\"\n checked={on}\n disabled={!on && checked.size >= free}\n onChange={() => toggle(epic.id)}\n className=\"mt-0.5 accent-accent\"\n />\n <span className=\"flex-1 min-w-0 text-txt\">\n <span className=\"font-mono text-muted mr-1\">{epic.id}</span>{epic.title}\n </span>\n {epic.tasks.length > 0 && (\n <span className=\"shrink-0 text-[10px] font-mono text-muted\">has {epic.tasks.length} task{epic.tasks.length === 1 ? \"\" : \"s\"}</span>\n )}\n </label>\n </li>\n )\n })}\n </ul>\n </div>\n ))}\n </div>\n <p className={over || free === 0 ? \"text-xs text-amber\" : \"text-xs text-muted\"}>\n {free === 0\n ? `All ${MAX_RUNNING_CHATS} agent slots are busy. Stop a chat or wait for one to finish.`\n : over\n ? `${checked.size} selected, but only ${free} of ${MAX_RUNNING_CHATS} agent slots ${free === 1 ? \"is\" : \"are\"} free (${running} running). Uncheck some or stop a chat.`\n : `One chat per epic, running at once (${free} of ${MAX_RUNNING_CHATS} agent slots free). Each shows a plan before writing anything.`}\n </p>\n <div className=\"flex justify-end gap-2\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={onDone}>\n Cancel\n </Button>\n <Button type=\"submit\" size=\"sm\" disabled={!checked.size || over} className=\"bg-accent text-accent-fg hover:bg-accent/90\">\n Break down {checked.size || \"\"} epic{checked.size === 1 ? \"\" : \"s\"}\n </Button>\n </div>\n </form>\n )\n}\n"],"names":["depIds","dependsOn","Set","match","map","d","toUpperCase","settled","s","pickNextTask","epic","tasks","byId","Map","t","id","linked","get","filter","unmet","dep","status","length","kind","taskId","every","inEpic","memo","canMove","has","set","ok","waiting","push","reason","deps","join","needsHuman","w"],"mappings":"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"}
|