vibedoc 1.7.0 → 1.9.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 +15 -0
- package/.next/build-manifest.json +3 -3
- package/.next/prerender-manifest.json +42 -14
- package/.next/routes-manifest.json +90 -0
- package/.next/server/app/(app)/activity/page.js +2 -2
- 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 +2 -2
- 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.js +2 -2
- package/.next/server/app/(app)/chat/page.js.nft.json +1 -1
- package/.next/server/app/(app)/chat/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/docs/page.js +2 -2
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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/page.js +2 -2
- package/.next/server/app/_global-error/page.js.nft.json +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 +2 -2
- 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 +13 -12
- package/.next/server/app/activity.segments/!KGFwcCk/activity/__PAGE__.segment.rsc +12 -9
- package/.next/server/app/activity.segments/_full.segment.rsc +13 -12
- 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 +3 -3
- 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.js +3 -3
- package/.next/server/app/api/conversations/route.js.nft.json +1 -1
- package/.next/server/app/api/decisions/route.js +3 -3
- package/.next/server/app/api/decisions/route.js.nft.json +1 -1
- package/.next/server/app/api/docs/route.js +3 -3
- package/.next/server/app/api/docs/route.js.nft.json +1 -1
- package/.next/server/app/api/explorer/route.js +3 -3
- package/.next/server/app/api/explorer/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/route.js +3 -3
- package/.next/server/app/api/mcp/route.js.nft.json +1 -1
- package/.next/server/app/api/memory/entries/delete/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/memory/entries/delete/route/build-manifest.json +12 -0
- package/.next/server/app/api/memory/entries/delete/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/memory/entries/delete/route.js +9 -0
- package/.next/server/app/api/memory/entries/delete/route.js.map +5 -0
- package/.next/server/app/api/memory/entries/delete/route.js.nft.json +1 -0
- package/.next/server/app/api/memory/entries/delete/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/memory/entries/restore/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/memory/entries/restore/route/build-manifest.json +12 -0
- package/.next/server/app/api/memory/entries/restore/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/memory/entries/restore/route.js +9 -0
- package/.next/server/app/api/memory/entries/restore/route.js.map +5 -0
- package/.next/server/app/api/memory/entries/restore/route.js.nft.json +1 -0
- package/.next/server/app/api/memory/entries/restore/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/memory/entries/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/memory/entries/route/build-manifest.json +12 -0
- package/.next/server/app/api/memory/entries/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/memory/entries/route.js +8 -0
- package/.next/server/app/api/memory/entries/route.js.map +5 -0
- package/.next/server/app/api/memory/entries/route.js.nft.json +1 -0
- package/.next/server/app/api/memory/entries/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/memory/entries/save/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/memory/entries/save/route/build-manifest.json +12 -0
- package/.next/server/app/api/memory/entries/save/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/memory/entries/save/route.js +9 -0
- package/.next/server/app/api/memory/entries/save/route.js.map +5 -0
- package/.next/server/app/api/memory/entries/save/route.js.nft.json +1 -0
- package/.next/server/app/api/memory/entries/save/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/memory/graph/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/memory/graph/route/build-manifest.json +12 -0
- package/.next/server/app/api/memory/graph/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/memory/graph/route.js +9 -0
- package/.next/server/app/api/memory/graph/route.js.map +5 -0
- package/.next/server/app/api/memory/graph/route.js.nft.json +1 -0
- package/.next/server/app/api/memory/graph/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/memory/history/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/memory/history/route/build-manifest.json +12 -0
- package/.next/server/app/api/memory/history/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/memory/history/route.js +9 -0
- package/.next/server/app/api/memory/history/route.js.map +5 -0
- package/.next/server/app/api/memory/history/route.js.nft.json +1 -0
- package/.next/server/app/api/memory/history/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/memory/route.js +3 -3
- package/.next/server/app/api/memory/route.js.nft.json +1 -1
- package/.next/server/app/api/plan/apply/route.js +4 -4
- 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 +3 -3
- package/.next/server/app/api/registry/route.js.nft.json +1 -1
- package/.next/server/app/api/roadmap/create/route.js +4 -4
- package/.next/server/app/api/roadmap/create/route.js.nft.json +1 -1
- package/.next/server/app/api/roadmap/delete/route.js +4 -4
- package/.next/server/app/api/roadmap/delete/route.js.nft.json +1 -1
- package/.next/server/app/api/roadmap/generate/route.js +4 -4
- package/.next/server/app/api/roadmap/generate/route.js.nft.json +1 -1
- package/.next/server/app/api/roadmap/layout/route.js +4 -4
- 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 +4 -4
- 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 +4 -4
- package/.next/server/app/api/setup/generate/route.js.nft.json +1 -1
- package/.next/server/app/api/setup/write/route.js +3 -3
- 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 +3 -3
- 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 +3 -3
- 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 +13 -12
- package/.next/server/app/board.segments/!KGFwcCk/board/__PAGE__.segment.rsc +7 -6
- package/.next/server/app/board.segments/_full.segment.rsc +13 -12
- package/.next/server/app/board.segments/_tree.segment.rsc +3 -2
- package/.next/server/app/chat.html +1 -1
- package/.next/server/app/chat.rsc +13 -12
- package/.next/server/app/chat.segments/!KGFwcCk/chat/__PAGE__.segment.rsc +7 -6
- package/.next/server/app/chat.segments/_full.segment.rsc +13 -12
- package/.next/server/app/chat.segments/_tree.segment.rsc +3 -2
- package/.next/server/app/docs.html +1 -1
- package/.next/server/app/docs.rsc +13 -12
- package/.next/server/app/docs.segments/!KGFwcCk/docs/__PAGE__.segment.rsc +7 -6
- package/.next/server/app/docs.segments/_full.segment.rsc +13 -12
- 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 +13 -12
- package/.next/server/app/explorer.segments/!KGFwcCk/explorer/__PAGE__.segment.rsc +11 -9
- package/.next/server/app/explorer.segments/_full.segment.rsc +13 -12
- 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 +30 -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 +30 -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 -12
- package/.next/server/app/memory.segments/!KGFwcCk/memory/__PAGE__.segment.rsc +13 -9
- package/.next/server/app/memory.segments/_full.segment.rsc +14 -12
- package/.next/server/app/memory.segments/_tree.segment.rsc +4 -2
- package/.next/server/app/page.js +2 -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 +13 -12
- package/.next/server/app/roadmap.segments/!KGFwcCk/roadmap/__PAGE__.segment.rsc +7 -6
- package/.next/server/app/roadmap.segments/_full.segment.rsc +13 -12
- 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 +13 -12
- package/.next/server/app/settings.segments/!KGFwcCk/settings/__PAGE__.segment.rsc +11 -9
- package/.next/server/app/settings.segments/_full.segment.rsc +13 -12
- 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 +13 -12
- package/.next/server/app/setup.segments/!KGFwcCk/setup/__PAGE__.segment.rsc +11 -9
- package/.next/server/app/setup.segments/_full.segment.rsc +13 -12
- package/.next/server/app/setup.segments/_tree.segment.rsc +3 -2
- package/.next/server/app-paths-manifest.json +15 -0
- package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0-5bkpj._.js → 11mp_@anthropic-ai_sdk_0-_cqh8._.js} +1 -1
- package/.next/server/chunks/{11mp_@anthropic-ai_sdk_01l5h3i._.js → 11mp_@anthropic-ai_sdk_00o5o78._.js} +1 -1
- package/.next/server/chunks/{11mp_@anthropic-ai_sdk_00psb_y._.js → 11mp_@anthropic-ai_sdk_03cp17a._.js} +1 -1
- package/.next/server/chunks/{11mp_@anthropic-ai_sdk_072r2bd._.js → 11mp_@anthropic-ai_sdk_07dk2er._.js} +1 -1
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0_e9zpr._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0_xx_qf._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0aer9lc._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0ax30pe._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0gn7vgs._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0hye94a._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0ir5cgk._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0je0_pa._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0jfgh0o._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0mha4x1._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0n__boa._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0sqv26_._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0wnc6g-._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0xh0g59._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1-5wyhj._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_13ahm3n._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_13e6aq4._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_14eg0ld._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_15md1n2._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_16av8b9._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_16hjhv1._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_16txvf7._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_198yu7d._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_198yu7d._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1_9tfq3._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1_9tfq3._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1_izr2o._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1_izr2o._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1fljcyg._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1fljcyg._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1lrt6ul._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1lrt6ul._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1nev_ee._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1nev_ee._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1pgoe2i._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1pgoe2i._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1rgl7mu._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1rgl7mu._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1slq49k._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1slq49k._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1t9bdf0._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1t9bdf0._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1u6qqm2._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1u6qqm2._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1v7ygvz._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1v7ygvz._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1wls8zc._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1wls8zc._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1ywboja._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1ywboja._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_00kwqu5._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_01j2nrd._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_05ybj3t._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0adt7jj._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0bnl14w._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0f557t9._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0ra6giw._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_107cqfx._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1377sl6._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1_2hcok._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1g--m6y._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1geopi5._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1i11dte._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1mj3_qk._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1qgy210._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1rkng9q._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1vr8q8y._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1vr8q8y._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1x8b64g._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1x8b64g._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1zhahf7._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1zhahf7._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__008focd._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__093hlkh._.js.map → [root-of-the-server]__008focd._.js.map} +1 -1
- package/.next/server/chunks/[root-of-the-server]__01xmabe._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__0nfvvy9._.js.map → [root-of-the-server]__01xmabe._.js.map} +1 -1
- package/.next/server/chunks/[root-of-the-server]__03ogp2r._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__03ogp2r._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__05us508._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__05us508._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__08yaps5._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__0eqd-tw._.js.map → [root-of-the-server]__08yaps5._.js.map} +1 -1
- package/.next/server/chunks/{[root-of-the-server]__11s-8eg._.js → [root-of-the-server]__09oyvwa._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__1wr0m-s._.js.map → [root-of-the-server]__09oyvwa._.js.map} +1 -1
- package/.next/server/chunks/[root-of-the-server]__0axugex._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__1u_q61h._.js.map → [root-of-the-server]__0axugex._.js.map} +1 -1
- package/.next/server/chunks/[root-of-the-server]__0b2488c._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__0aynzrb._.js.map → [root-of-the-server]__0b2488c._.js.map} +1 -1
- package/.next/server/chunks/[root-of-the-server]__0b6w_wb._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0b6w_wb._.js.map +1 -0
- package/.next/server/chunks/{[root-of-the-server]__1y3u5ud._.js → [root-of-the-server]__0cbh1s-._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__0cbh1s-._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0exzf-v._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0exzf-v._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0gnil0m._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__18kxo4a._.js.map → [root-of-the-server]__0gnil0m._.js.map} +1 -1
- package/.next/server/chunks/[root-of-the-server]__0hfyuhq._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0hfyuhq._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0hg1r2b._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0hg1r2b._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0ikbk15._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__1j0rrps._.js.map → [root-of-the-server]__0ikbk15._.js.map} +1 -1
- package/.next/server/chunks/[root-of-the-server]__0jr_5eq._.js +110 -0
- package/.next/server/chunks/[root-of-the-server]__0jr_5eq._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0khz7sy._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__1jxu2x9._.js.map → [root-of-the-server]__0khz7sy._.js.map} +1 -1
- package/.next/server/chunks/[root-of-the-server]__0lf11mz._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__1lj_2cv._.js.map → [root-of-the-server]__0lf11mz._.js.map} +1 -1
- package/.next/server/chunks/[root-of-the-server]__0m8hmg0._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__1q4ahvz._.js.map → [root-of-the-server]__0m8hmg0._.js.map} +1 -1
- package/.next/server/chunks/[root-of-the-server]__0qij7wy._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__1y-tt29._.js.map → [root-of-the-server]__0qij7wy._.js.map} +1 -1
- package/.next/server/chunks/[root-of-the-server]__0vf-0gp._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0vf-0gp._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0x8wtot._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__17xb02p._.js.map → [root-of-the-server]__0x8wtot._.js.map} +1 -1
- package/.next/server/chunks/[root-of-the-server]__0y5usoz._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0y5usoz._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__15c5snv._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__05l6129._.js.map → [root-of-the-server]__15c5snv._.js.map} +1 -1
- package/.next/server/chunks/[root-of-the-server]__16u25oa._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__142icjb._.js.map → [root-of-the-server]__16u25oa._.js.map} +1 -1
- package/.next/server/chunks/[root-of-the-server]__18dt3sr._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__14aeqoi._.js.map → [root-of-the-server]__18dt3sr._.js.map} +1 -1
- package/.next/server/chunks/[root-of-the-server]__19rxcu4._.js +110 -0
- package/.next/server/chunks/[root-of-the-server]__19rxcu4._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__1_qenei._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1_qenei._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__1a7d63a._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1a7d63a._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__1b448u7._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__06zf_sh._.js.map → [root-of-the-server]__1b448u7._.js.map} +1 -1
- package/.next/server/chunks/[root-of-the-server]__1e68zmx._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1e68zmx._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__1gvv2xp._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__1y3u5ud._.js.map → [root-of-the-server]__1gvv2xp._.js.map} +1 -1
- package/.next/server/chunks/[root-of-the-server]__1jel07j._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1jel07j._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__1jz98vb._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__106gpvh._.js.map → [root-of-the-server]__1jz98vb._.js.map} +1 -1
- package/.next/server/chunks/[root-of-the-server]__1la-6xe._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1la-6xe._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__1p6-0l0._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1p6-0l0._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__1qd-ecl._.js +110 -0
- package/.next/server/chunks/[root-of-the-server]__1qd-ecl._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__1r_0uma._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__11s-8eg._.js.map → [root-of-the-server]__1r_0uma._.js.map} +1 -1
- package/.next/server/chunks/[root-of-the-server]__1ssunti._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__17p0rkn._.js.map → [root-of-the-server]__1ssunti._.js.map} +1 -1
- package/.next/server/chunks/[root-of-the-server]__1tu85zx._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1tu85zx._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__1wcd2x9._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1wcd2x9._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__1xpp36t._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1xpp36t._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__1z3tswg._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1z3tswg._.js.map +1 -0
- package/.next/server/chunks/_04byth9._.js +34 -19
- package/.next/server/chunks/_04byth9._.js.map +1 -1
- package/.next/server/chunks/_0safx0g._.js +10 -0
- package/.next/server/chunks/_0safx0g._.js.map +1 -0
- 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_memory_entries_delete_route_actions_1a4-ad5.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_memory_entries_delete_route_actions_1a4-ad5.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_memory_entries_restore_route_actions_07637mh.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_memory_entries_restore_route_actions_07637mh.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_memory_entries_route_actions_0bxuv92.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_memory_entries_route_actions_0bxuv92.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_memory_entries_save_route_actions_0bwga-2.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_memory_entries_save_route_actions_0bwga-2.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_memory_graph_route_actions_0pca9et.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_memory_graph_route_actions_0pca9et.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_memory_history_route_actions_0w5pu5p.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_memory_history_route_actions_0w5pu5p.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/0_g__next_dist_000c5_m._.js +3 -0
- 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_0vv_0i3._.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_1z0p1bs._.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]__0opgo3t._.js +14 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__0noc5ay._.js.map → [root-of-the-server]__0opgo3t._.js.map} +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0xt_0w2._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1jv5ug1._.js +3 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__1pk-w2i._.js.map → [root-of-the-server]__1jv5ug1._.js.map} +1 -1
- 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/_0i75x-o._.js +3 -0
- package/.next/server/chunks/ssr/_0i75x-o._.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/_0qp3gu7._.js +3 -0
- package/.next/server/chunks/ssr/_0qp3gu7._.js.map +1 -0
- package/.next/server/chunks/ssr/_15qpb4z._.js +3 -0
- package/.next/server/chunks/ssr/_15qpb4z._.js.map +1 -0
- package/.next/server/chunks/ssr/_1fg0usp._.js +3 -0
- package/.next/server/chunks/ssr/_1fg0usp._.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/_1h0wfpz._.js +3 -0
- package/.next/server/chunks/ssr/_1h0wfpz._.js.map +1 -0
- package/.next/server/chunks/ssr/_1ncdakv._.js +4 -0
- package/.next/server/chunks/ssr/_1ncdakv._.js.map +1 -0
- package/.next/server/chunks/ssr/_1ocnpth._.js +3 -0
- package/.next/server/chunks/ssr/_1ocnpth._.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/_1uno162._.js +3 -0
- package/.next/server/chunks/ssr/_1uno162._.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_04khl_s._.js → node_modules__pnpm_01bjcv9._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_08sqeu2._.js → node_modules__pnpm_03qrzdb._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_104pzhc._.js → node_modules__pnpm_06d-fdo._.js} +2 -2
- package/.next/server/chunks/ssr/node_modules__pnpm_0al3nfy._.js +3 -0
- package/.next/server/chunks/ssr/node_modules__pnpm_0al3nfy._.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules__pnpm_0aoa6rg._.js +4 -0
- package/.next/server/chunks/ssr/node_modules__pnpm_0aoa6rg._.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules__pnpm_1xzf8g_._.js → node_modules__pnpm_0ctisl0._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_0og06fy._.js → node_modules__pnpm_0fwp8jm._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_0a9b2ei._.js → node_modules__pnpm_0kpu0-2._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_0jpv2b6._.js → node_modules__pnpm_0vry74x._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules__pnpm_0fd3pr1._.js → node_modules__pnpm_0ycbjbd._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules__pnpm_1l8k8w1._.js → node_modules__pnpm_1-76qxg._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_0ah02mu._.js → node_modules__pnpm_1-r94f7._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_1yq90z7._.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_0dwi7mu._.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_0f77_ng._.js → node_modules__pnpm_17i6z2d._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_09_i2jk._.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_0ttvopp._.js → node_modules__pnpm_192f222._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_07t_e8c._.js → node_modules__pnpm_1a48_nl._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_195j8p_._.js → node_modules__pnpm_1aa37e1._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_0cj8ryj._.js → node_modules__pnpm_1f440kx._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_0u3u82f._.js → node_modules__pnpm_1fn3ejy._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_0ts89ne._.js → node_modules__pnpm_1min2jl._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_1woddr6._.js → node_modules__pnpm_1q_hhr3._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules__pnpm_1x0t5_z._.js → node_modules__pnpm_1qmkxyo._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_0gifu-u._.js → node_modules__pnpm_1qp_jvj._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules__pnpm_0y35hs4._.js → node_modules__pnpm_1ssjj4u._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_0qc3gsk._.js → node_modules__pnpm_1txccoj._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_1w0f1m5._.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_0286-tg._.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 +1 -1
- package/.next/server/chunks/ssr/src_app_(app)_chat_page_tsx_0c3e4l4._.js.map +1 -1
- package/.next/server/chunks/ssr/src_app_(app)_layout_tsx_1yu5hom._.js +1 -1
- package/.next/server/chunks/ssr/src_app_(app)_layout_tsx_1yu5hom._.js.map +1 -1
- 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)_memory_page_tsx_19jhb1c._.js +13 -0
- package/.next/server/chunks/ssr/src_app_(app)_memory_page_tsx_19jhb1c._.js.map +1 -0
- package/.next/server/chunks/ssr/src_app_(app)_roadmap_page_tsx_0vcq3jr._.js +2 -2
- package/.next/server/chunks/ssr/src_app_(app)_roadmap_page_tsx_0vcq3jr._.js.map +1 -1
- 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_0eyr_zi._.js +3 -0
- package/.next/server/chunks/ssr/src_components_0eyr_zi._.js.map +1 -0
- package/.next/server/chunks/ssr/src_components_1s861m8._.js +3 -0
- package/.next/server/chunks/ssr/src_components_1s861m8._.js.map +1 -0
- 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 +2 -2
- package/.next/server/chunks/ssr/src_context_ChatContext_tsx_0lowp8p._.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 +4 -0
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/prefetch-hints.json +19 -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/0b547y6rqct9z.js +1 -0
- package/.next/static/chunks/0e3ha56i_0j05.css +1 -0
- package/.next/static/chunks/0f32hudp0yir7.js +2 -0
- package/.next/static/chunks/0mgifb98wbesa.js +1 -0
- package/.next/static/chunks/0rsmz1jgro1kj.js +1 -0
- package/.next/static/chunks/0wnq_kh8-6wc1.js +2 -0
- package/.next/static/chunks/13l4l-boqg8fx.js +1 -0
- package/.next/static/chunks/14hxe1qiaram9.js +1 -0
- package/.next/static/chunks/16k196zyl-n9q.js +1 -0
- package/.next/static/chunks/18b5l8p0vd9f8.js +1 -0
- package/.next/static/chunks/1acpfyut6j4e2.js +1 -0
- package/.next/static/chunks/1c_8t2kecjnua.js +1 -0
- package/.next/static/chunks/{1xyepk9227yej.js → 1l_dys0-y5-r7.js} +6 -6
- package/.next/static/chunks/1rko_88i85yqb.js +21 -0
- package/.next/static/chunks/1tu8lforstp1o.js +1 -0
- package/.next/static/chunks/20mdcup14_0yi.js +11 -0
- package/.next/static/chunks/23-xknrz6o748.js +1 -0
- package/.next/static/chunks/24u_rc2tbkhai.js +3 -0
- package/.next/static/chunks/2p-pkveutoh75.js +1 -0
- package/.next/static/chunks/329sozud9-tvr.js +1 -0
- package/.next/static/chunks/3ly7b47esdb7j.js +1 -0
- package/.next/static/chunks/3qqvn9vv6i0gy.js +68 -0
- package/.next/static/chunks/3ruw8lu2_re-h.js +1 -0
- package/.next/static/chunks/3xqcluqa32mjv.js +2 -0
- package/README.md +13 -5
- 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_1htgzmb._.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_0d2_lq6._.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]__05l6129._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__06zf_sh._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__093hlkh._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0aynzrb._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0e59y5j._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0eqd-tw._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0nfvvy9._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__106gpvh._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__11s76m8._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__142icjb._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__14aeqoi._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1613hjb._.js +0 -88
- package/.next/server/chunks/[root-of-the-server]__1613hjb._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__169hmq_._.js +0 -10
- package/.next/server/chunks/[root-of-the-server]__169hmq_._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__17p0rkn._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__17xb02p._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__18kxo4a._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1j0rrps._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1jxu2x9._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1lj_2cv._.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/[root-of-the-server]__1q4ahvz._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1u_q61h._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1wr0m-s._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1xb0fmp._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1xb0fmp._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__1y-tt29._.js +0 -3
- package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_0cvmffy._.js +0 -3
- package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_0cvmffy._.js.map +0 -1
- package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_0u3jxas._.js +0 -3
- package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_0u3jxas._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0noc5ay._.js +0 -14
- package/.next/server/chunks/ssr/[root-of-the-server]__1pk-w2i._.js +0 -3
- package/.next/server/chunks/ssr/_059qmur._.js +0 -3
- package/.next/server/chunks/ssr/_059qmur._.js.map +0 -1
- package/.next/server/chunks/ssr/_081irea._.js +0 -3
- package/.next/server/chunks/ssr/_081irea._.js.map +0 -1
- package/.next/server/chunks/ssr/_0d8t8l4._.js +0 -3
- package/.next/server/chunks/ssr/_0d8t8l4._.js.map +0 -1
- package/.next/server/chunks/ssr/_0dyvcdg._.js +0 -3
- package/.next/server/chunks/ssr/_0dyvcdg._.js.map +0 -1
- package/.next/server/chunks/ssr/_1-ghqy4._.js +0 -3
- package/.next/server/chunks/ssr/_1-ghqy4._.js.map +0 -1
- package/.next/server/chunks/ssr/_17jy5db._.js +0 -3
- package/.next/server/chunks/ssr/_17jy5db._.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/_1dllfz5._.js +0 -4
- package/.next/server/chunks/ssr/_1dllfz5._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules__pnpm_006_c8z._.js +0 -3
- package/.next/server/chunks/ssr/node_modules__pnpm_006_c8z._.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/node_modules__pnpm_1kcnkjs._.js +0 -3
- package/.next/server/chunks/ssr/node_modules__pnpm_1kcnkjs._.js.map +0 -1
- package/.next/server/chunks/ssr/src_1lkod9y._.js +0 -8
- package/.next/server/chunks/ssr/src_1lkod9y._.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-z7kyblalrea.js +0 -1
- package/.next/static/chunks/050mq8l4e1ubn.js +0 -1
- package/.next/static/chunks/098le48845_fg.js +0 -3
- package/.next/static/chunks/0cw4-ebkoufdc.js +0 -1
- package/.next/static/chunks/0feo-go1w5nct.js +0 -1
- package/.next/static/chunks/0k2qhx29amdgs.js +0 -1
- package/.next/static/chunks/14sefb904pl64.js +0 -21
- package/.next/static/chunks/1fer-wulyrjrs.js +0 -3
- package/.next/static/chunks/1o7b1x4umy8a6.js +0 -1
- package/.next/static/chunks/1q_io1j58aukw.js +0 -1
- package/.next/static/chunks/1r7z33e9jk3vp.js +0 -1
- package/.next/static/chunks/1t-cgh4477hfo.js +0 -1
- package/.next/static/chunks/1u-1po1qesc9f.js +0 -1
- package/.next/static/chunks/1u5kegkgm0xoz.js +0 -1
- package/.next/static/chunks/24ygzsgd-moqy.js +0 -1
- package/.next/static/chunks/26folxgplfa9t.js +0 -68
- package/.next/static/chunks/2ocixvjhv34_3.js +0 -1
- package/.next/static/chunks/3_lsdgxa-h7ma.css +0 -10
- package/.next/static/chunks/3h4ehgq7i44wb.js +0 -6
- package/.next/static/chunks/3rmv-sb9w9i3e.js +0 -1
- package/.next/static/chunks/3smp1lj103j-l.js +0 -1
- package/.next/static/chunks/3ttzomivj48jh.js +0 -2
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0-5bkpj._.js.map → 11mp_@anthropic-ai_sdk_0-_cqh8._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_00psb_y._.js.map → 11mp_@anthropic-ai_sdk_00o5o78._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_01l5h3i._.js.map → 11mp_@anthropic-ai_sdk_03cp17a._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_072r2bd._.js.map → 11mp_@anthropic-ai_sdk_07dk2er._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0am8bw2._.js.map → 11mp_@anthropic-ai_sdk_0_e9zpr._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0enefn6._.js.map → 11mp_@anthropic-ai_sdk_0_xx_qf._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0k3n_5f._.js.map → 11mp_@anthropic-ai_sdk_0aer9lc._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0lcfjm4._.js.map → 11mp_@anthropic-ai_sdk_0ax30pe._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0lfx9av._.js.map → 11mp_@anthropic-ai_sdk_0gn7vgs._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0qau3qw._.js.map → 11mp_@anthropic-ai_sdk_0hye94a._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0r1pmvm._.js.map → 11mp_@anthropic-ai_sdk_0ir5cgk._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_11t-z2t._.js.map → 11mp_@anthropic-ai_sdk_0je0_pa._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_15hyn79._.js.map → 11mp_@anthropic-ai_sdk_0jfgh0o._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1_qk07x._.js.map → 11mp_@anthropic-ai_sdk_0mha4x1._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1b2929e._.js.map → 11mp_@anthropic-ai_sdk_0n__boa._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1e72c89._.js.map → 11mp_@anthropic-ai_sdk_0sqv26_._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1eq7asn._.js.map → 11mp_@anthropic-ai_sdk_0wnc6g-._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1fhdojs._.js.map → 11mp_@anthropic-ai_sdk_0xh0g59._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1htgzmb._.js.map → 11mp_@anthropic-ai_sdk_1-5wyhj._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1lh_vwq._.js.map → 11mp_@anthropic-ai_sdk_13ahm3n._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1ludf-o._.js.map → 11mp_@anthropic-ai_sdk_13e6aq4._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1m3luz3._.js.map → 11mp_@anthropic-ai_sdk_14eg0ld._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1x1iz3d._.js.map → 11mp_@anthropic-ai_sdk_15md1n2._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1xsmwlh._.js.map → 11mp_@anthropic-ai_sdk_16av8b9._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_202spah._.js.map → 11mp_@anthropic-ai_sdk_16hjhv1._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_215hw9u._.js.map → 11mp_@anthropic-ai_sdk_16txvf7._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_0d2_lq6._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_00kwqu5._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_0n-i0pd._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_01j2nrd._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_13pos4j._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_05ybj3t._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_17b4pqr._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0adt7jj._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1bkcmom._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0bnl14w._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1hlj_3l._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0f557t9._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1ip-sor._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0ra6giw._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1pex5o1._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_107cqfx._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1s8lc8_._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1377sl6._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__0e59y5j._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1_2hcok._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__11s76m8._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1g--m6y._.js.map} +0 -0
- /package/.next/server/chunks/{ssr/0_nd_mermaid_dist_mermaid_core_mjs_0vv_0i3._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1geopi5._.js.map} +0 -0
- /package/.next/server/chunks/{ssr/1u84_katex_dist_katex_mjs_1z0p1bs._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1i11dte._.js.map} +0 -0
- /package/.next/server/chunks/{ssr/node_modules__pnpm_09_i2jk._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1mj3_qk._.js.map} +0 -0
- /package/.next/server/chunks/{ssr/node_modules__pnpm_0dwi7mu._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1qgy210._.js.map} +0 -0
- /package/.next/server/chunks/{ssr/node_modules__pnpm_1yq90z7._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1rkng9q._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_04khl_s._.js.map → node_modules__pnpm_01bjcv9._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_08sqeu2._.js.map → node_modules__pnpm_03qrzdb._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_104pzhc._.js.map → node_modules__pnpm_06d-fdo._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_1xzf8g_._.js.map → node_modules__pnpm_0ctisl0._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_0og06fy._.js.map → node_modules__pnpm_0fwp8jm._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_0a9b2ei._.js.map → node_modules__pnpm_0kpu0-2._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_0jpv2b6._.js.map → node_modules__pnpm_0vry74x._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_0fd3pr1._.js.map → node_modules__pnpm_0ycbjbd._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_1l8k8w1._.js.map → node_modules__pnpm_1-76qxg._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_0ah02mu._.js.map → node_modules__pnpm_1-r94f7._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_0f77_ng._.js.map → node_modules__pnpm_17i6z2d._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_0ttvopp._.js.map → node_modules__pnpm_192f222._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_07t_e8c._.js.map → node_modules__pnpm_1a48_nl._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_195j8p_._.js.map → node_modules__pnpm_1aa37e1._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_0cj8ryj._.js.map → node_modules__pnpm_1f440kx._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_0u3u82f._.js.map → node_modules__pnpm_1fn3ejy._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_0ts89ne._.js.map → node_modules__pnpm_1min2jl._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_1woddr6._.js.map → node_modules__pnpm_1q_hhr3._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_1x0t5_z._.js.map → node_modules__pnpm_1qmkxyo._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_0gifu-u._.js.map → node_modules__pnpm_1qp_jvj._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_0y35hs4._.js.map → node_modules__pnpm_1ssjj4u._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_0qc3gsk._.js.map → node_modules__pnpm_1txccoj._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_1w0f1m5._.js.map → node_modules__pnpm_1uwkcin._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_0286-tg._.js.map → node_modules__pnpm_1ygal0c._.js.map} +0 -0
- /package/.next/static/{uJ5RYxgFnE5svAvnuLDXN → Q29Tn_NjyVms0d3pKn4Yx}/_buildManifest.js +0 -0
- /package/.next/static/{uJ5RYxgFnE5svAvnuLDXN → Q29Tn_NjyVms0d3pKn4Yx}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{uJ5RYxgFnE5svAvnuLDXN → Q29Tn_NjyVms0d3pKn4Yx}/_ssgManifest.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/chat/AgentMark.tsx","../../../../src/components/roadmap/RoadmapNodes.tsx","../../../../src/lib/roadmap-health.ts","../../../../src/components/roadmap/layout.ts","../../../../src/components/roadmap/timeline.ts"],"sourcesContent":["\"use client\"\n\nimport { Bot, Loader2 } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\nimport { useChats, useItemAgent } from \"@/context/ChatContext\"\nimport type { Attach, ItemAgent } from \"@/lib/chats\"\nimport { StatusMarker } from \"./StatusMarker\"\n\nexport const AGENT_LABEL: Record<ItemAgent[\"status\"], string> = {\n running: \"Agent working\",\n \"needs-answer\": \"Agent needs you\",\n review: \"Plan to review\",\n}\n\n/**\n * Pill on an epic/task while a chat works on it; click opens that chat.\n * `nodrag` + stopPropagation keep a React Flow node from dragging/selecting on click.\n */\nexport function AgentMark({ attach, className }: { attach: Attach; className?: string }) {\n const agent = useItemAgent(attach)\n const { show } = useChats()\n if (!agent) return null\n const label = AGENT_LABEL[agent.status]\n return (\n <button\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); show(agent.chatId) }}\n title={`${label} · open chat`}\n aria-label={`${label}, open chat`}\n className={cn(\n \"nodrag inline-flex shrink-0 items-center gap-1 rounded-full border px-1.5 py-px font-mono text-[10px] leading-4 animate-fade-in transition-colors duration-(--duration-fast)\",\n agent.status === \"running\" && \"border-accent/50 text-accent hover:bg-accent/10\",\n agent.status === \"needs-answer\" && \"border-amber/50 text-amber hover:bg-amber/10\",\n agent.status === \"review\" && \"border-accent/50 bg-accent/10 text-accent hover:bg-accent/20\",\n className,\n )}\n >\n {agent.status === \"running\" ? <Loader2 className=\"size-3 animate-spin\" aria-hidden /> : <Bot className=\"size-3\" aria-hidden />}\n {label}\n </button>\n )\n}\n\n/** Non-interactive variant for places that are already a button (timeline markers, board cards, task rows). */\nexport function AgentDot({ attach }: { attach: Attach }) {\n const agent = useItemAgent(attach)\n if (!agent) return null\n return <StatusMarker status={agent.status} label={AGENT_LABEL[agent.status]} />\n}\n","\"use client\"\n\nimport { Handle, Position, type Node, type NodeProps } from \"@xyflow/react\"\nimport { AlertTriangle, Check } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\nimport type { RoadmapItem, RoadmapStatus, TaskStatus } from \"@/types\"\nimport type { DueState, TaskDueSummary } from \"@/lib/roadmap-health\"\nimport { formatDay } from \"./timeline\"\nimport { FEATURE_W, HORIZON_W } from \"./layout\"\nimport { AgentMark } from \"@/components/chat/AgentMark\"\nimport { useItemAgent } from \"@/context/ChatContext\"\n\nexport type RoadmapNodeData = {\n item: RoadmapItem\n progress?: { done: number; total: number } // derived, never persisted\n drift?: string[]\n dueState?: DueState | null\n taskDue?: TaskDueSummary | null\n taskDueSoon?: boolean\n taskStatuses?: TaskStatus[] // feature: linked tasks in order, cancelled/missing left out\n nextTaskId?: string | null // feature: what vibedoc_next_task would hand out\n chapter?: number // horizon: 1-based position on the spine\n epics?: { done: number; total: number } // horizon: child epics\n}\nexport type RoadmapNode = Node<RoadmapNodeData, \"horizon\" | \"feature\">\n\nconst SIDES = [Position.Top, Position.Right, Position.Bottom, Position.Left]\n\n/** One invisible source + target handle per side; edges pick `side` / `side-t`. */\nfunction Handles() {\n return (\n <>\n {SIDES.map((p) => (\n <Handle key={p} id={p} type=\"source\" position={p} isConnectable={false} className=\"opacity-0\" />\n ))}\n {SIDES.map((p) => (\n <Handle key={`${p}-t`} id={`${p}-t`} type=\"target\" position={p} isConnectable={false} className=\"opacity-0\" />\n ))}\n </>\n )\n}\n\nexport const STATUS_LABEL: Record<RoadmapStatus, string> = { \"in-progress\": \"Active\", paused: \"Paused\", done: \"Done\", planned: \"Planned\" }\n\n/** Roadmap status as a dot: live = accent with a pulse, done = teal, planned = hollow. */\nexport function StatusDot({ status, className }: { status: RoadmapStatus; className?: string }) {\n return (\n <span title={STATUS_LABEL[status]} aria-label={STATUS_LABEL[status]} className={cn(\"relative inline-flex h-2 w-2 shrink-0\", className)}>\n {status === \"in-progress\" && <span className=\"absolute inset-0 animate-ping rounded-full bg-accent/60\" />}\n <span\n className={cn(\n \"relative h-full w-full rounded-full\",\n status === \"done\" && \"bg-teal\",\n status === \"in-progress\" && \"bg-accent\",\n status === \"planned\" && \"border border-muted\",\n status === \"paused\" && \"border-2 border-y-0 border-muted\",\n )}\n />\n </span>\n )\n}\n\nexport function StatusPill({ status }: { status: RoadmapStatus }) {\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-full border px-2 py-0.5 font-mono text-[10px] uppercase tracking-wider\",\n status === \"done\" && \"border-teal/40 text-teal\",\n status === \"in-progress\" && \"border-accent/50 text-accent\",\n status === \"planned\" && \"border-dashed border-border2 text-muted\",\n status === \"paused\" && \"border-border2 text-muted\",\n )}\n >\n <StatusDot status={status} className=\"h-1.5 w-1.5\" />\n {STATUS_LABEL[status]}\n </span>\n )\n}\n\nexport const TASK_STATUS_BG: Record<TaskStatus, string> = {\n done: \"bg-teal\",\n \"in-progress\": \"bg-amber\",\n review: \"bg-accent\",\n blocked: \"bg-danger\",\n paused: \"bg-muted/60\",\n todo: \"bg-border2\",\n cancelled: \"bg-border\",\n}\n\n/** One segment per task, colored by its board status (same colors as the board). */\nexport function SegmentedProgress({ statuses, className }: { statuses?: TaskStatus[]; className?: string }) {\n if (!statuses?.length) return null\n const done = statuses.filter((s) => s === \"done\").length\n return (\n <div className={cn(\"flex h-1.5 min-w-0 flex-1 gap-0.5\", className)} title={`${done}/${statuses.length} tasks done`}>\n {statuses.map((s, i) => (\n <span key={i} className={cn(\"h-full flex-1 rounded-[1px]\", TASK_STATUS_BG[s])} />\n ))}\n </div>\n )\n}\n\n/** Small progress ring; color follows `className` (currentColor). */\nexport function ProgressRing({ value, total, className }: { value: number; total: number; className?: string }) {\n const r = 14\n const c = 2 * Math.PI * r\n const pct = total > 0 ? value / total : 0\n return (\n <span className={cn(\"relative inline-flex h-9 w-9 shrink-0 items-center justify-center\", className)} title={`${value}/${total} tasks done`}>\n <svg viewBox=\"0 0 36 36\" className=\"absolute inset-0 -rotate-90\">\n <circle cx=\"18\" cy=\"18\" r={r} fill=\"none\" strokeWidth=\"3\" className=\"stroke-border\" />\n <circle cx=\"18\" cy=\"18\" r={r} fill=\"none\" strokeWidth=\"3\" stroke=\"currentColor\" strokeLinecap=\"round\"\n strokeDasharray={c} strokeDashoffset={c * (1 - pct)} />\n </svg>\n <span className=\"font-mono text-[9px] text-txt\">{Math.round(pct * 100)}</span>\n </span>\n )\n}\n\nexport function Progress({ progress }: { progress?: RoadmapNodeData[\"progress\"] }) {\n if (!progress) return null\n const pct = Math.round((progress.done / progress.total) * 100)\n return (\n <div className=\"flex items-center gap-1.5\" title={`${progress.done}/${progress.total} done`}>\n <div className=\"h-1 flex-1 overflow-hidden rounded-full bg-border\">\n <div className=\"h-full rounded-full bg-teal\" style={{ width: `${pct}%` }} />\n </div>\n <span className=\"font-mono text-[10px] text-muted\">{progress.done}/{progress.total}</span>\n </div>\n )\n}\n\nexport function DueChip({ due, state }: { due: string | null; state?: DueState | null }) {\n if (!due) return null\n return (\n <span\n className={cn(\n \"font-mono text-[10px]\",\n state === \"overdue\" ? \"text-danger\" : state === \"soon\" ? \"text-amber\" : \"text-muted\",\n )}\n >\n Due {formatDay(due)}\n </span>\n )\n}\n\n/** The single most urgent date line for a card: overdue tasks, then the epic's own due, then the next task due. */\nfunction DueNote({ data }: { data: RoadmapNodeData }) {\n const s = data.taskDue\n if (s && s.overdue > 0) {\n return <span className=\"font-mono text-[10px] text-danger\">{s.overdue} {s.overdue === 1 ? \"task\" : \"tasks\"} overdue</span>\n }\n if (data.item.due) return <DueChip due={data.item.due} state={data.dueState} />\n if (s?.next) return <span className={cn(\"font-mono text-[10px]\", data.taskDueSoon ? \"text-amber\" : \"text-muted\")}>Next due {formatDay(s.next)}</span>\n return null\n}\n\nfunction DriftMark({ drift }: { drift?: string[] }) {\n if (!drift?.length) return null\n return (\n <span title={drift.join(\"\\n\")} className=\"absolute -left-2 -top-2 rounded-full bg-bg p-0.5 text-amber\">\n <AlertTriangle className=\"h-3.5 w-3.5\" />\n </span>\n )\n}\n\n/** A horizon is a chapter: big number, title, epic count, and a ring for task progress. */\nexport function HorizonNode({ data, selected }: NodeProps<RoadmapNode>) {\n const { item, progress, epics, chapter } = data\n const status = item.status\n return (\n <div\n style={{ width: HORIZON_W }}\n className={cn(\n \"relative flex items-center gap-3 rounded-xl border bg-surface px-3.5 py-3 transition-shadow duration-(--duration-base)\",\n status === \"in-progress\" && \"border-accent/60 shadow-[0_0_0_1px_rgb(var(--rgb-accent)/0.25),0_10px_30px_-12px_rgb(var(--rgb-accent)/0.6)]\",\n status === \"done\" && \"border-teal/40\",\n status === \"planned\" && \"border-dashed border-border2\",\n status === \"paused\" && \"border-border2 opacity-75\",\n selected && \"ring-2 ring-accent/60 ring-offset-2 ring-offset-bg\",\n )}\n >\n <Handles />\n <span\n className={cn(\n \"font-mono text-2xl font-semibold leading-none tabular-nums\",\n status === \"in-progress\" ? \"text-accent\" : status === \"done\" ? \"text-teal\" : \"text-muted\",\n )}\n >\n {chapter ? String(chapter).padStart(2, \"0\") : \"··\"}\n </span>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-xs font-semibold uppercase leading-snug tracking-wider text-txt\">{item.title}</p>\n <p className=\"mt-1 flex flex-wrap items-center gap-x-2 font-mono text-[10px] text-muted\">\n {epics && epics.total > 0 && <span>{epics.done}/{epics.total} epics</span>}\n <DueChip due={item.due} state={data.dueState} />\n </p>\n </div>\n {progress && (\n <ProgressRing value={progress.done} total={progress.total} className={status === \"done\" ? \"text-teal\" : \"text-accent\"} />\n )}\n <DriftMark drift={data.drift} />\n </div>\n )\n}\n\n/**\n * Three looks so the eye lands on live work: live = lit card with task segments and the next task,\n * done = one quiet line, planned = dashed outline. Height stays under ROW_H (layout.ts) so saved positions never overlap.\n */\nexport function FeatureNode({ data, selected }: NodeProps<RoadmapNode>) {\n const { item, taskStatuses, nextTaskId } = data\n const agent = useItemAgent({ kind: \"epic\", id: item.id })\n const drifting = !!data.drift?.length\n const ring = selected && \"ring-2 ring-accent/60 ring-offset-2 ring-offset-bg\"\n\n if (item.status === \"done\") {\n return (\n <div\n style={{ width: FEATURE_W }}\n className={cn(\"group relative flex items-center gap-2 rounded-lg border border-border bg-surface/60 px-3 py-2 hover:border-teal/40\", ring)}\n >\n <Handles />\n <Check className=\"h-3.5 w-3.5 shrink-0 text-teal\" strokeWidth={3} />\n <p className=\"min-w-0 flex-1 truncate text-[13px] text-muted group-hover:text-txt\" title={item.title}>{item.title}</p>\n {agent ? <AgentMark attach={{ kind: \"epic\", id: item.id }} />\n : data.progress && <span className=\"font-mono text-[10px] text-muted\">{data.progress.done}/{data.progress.total}</span>}\n <DriftMark drift={data.drift} />\n </div>\n )\n }\n\n const live = item.status === \"in-progress\"\n return (\n <div\n style={{ width: FEATURE_W }}\n className={cn(\n \"relative flex flex-col gap-1.5 rounded-lg border px-3 py-2.5 transition-shadow duration-(--duration-base)\",\n live\n ? \"border-accent/50 bg-surface shadow-[0_8px_24px_-10px_rgb(var(--rgb-accent)/0.55)]\"\n : \"border-dashed border-border2 bg-bg hover:border-muted\",\n item.status === \"paused\" && \"opacity-70\",\n ring,\n )}\n >\n <Handles />\n {live && <span className={cn(\"absolute -inset-y-px -left-px w-[3px] rounded-l-lg\", drifting ? \"bg-amber\" : \"bg-accent\")} />}\n <div className=\"flex items-center justify-between font-mono text-[10px]\">\n <span className=\"text-muted\">{item.id}</span>\n {agent ? (\n <AgentMark attach={{ kind: \"epic\", id: item.id }} />\n ) : live ? (\n <span className=\"flex items-center gap-1.5 uppercase tracking-wider text-accent\"><StatusDot status=\"in-progress\" className=\"h-1.5 w-1.5\" />Live</span>\n ) : (\n <span className=\"uppercase tracking-wider text-muted\">{item.tasks.length ? `${item.tasks.length} tasks` : \"No tasks yet\"}</span>\n )}\n </div>\n <p className={cn(\"line-clamp-2 text-[13px] leading-snug\", live ? \"font-medium text-txt\" : \"text-txt/80\")} title={item.title}>\n {item.title}\n </p>\n {taskStatuses && taskStatuses.length > 0 && (\n <div className=\"flex items-center gap-2\">\n <SegmentedProgress statuses={taskStatuses} />\n <span className=\"shrink-0 font-mono text-[10px] text-muted\">\n {live && nextTaskId ? <>next <span className=\"text-txt\">{nextTaskId}</span></> : `${taskStatuses.filter((s) => s === \"done\").length}/${taskStatuses.length}`}\n </span>\n </div>\n )}\n <DueNote data={data} />\n <DriftMark drift={data.drift} />\n </div>\n )\n}\n\nexport const nodeTypes = { horizon: HorizonNode, feature: FeatureNode }\n","/**\n * src/lib/roadmap-health.ts\n * Pure (no fs): roadmap progress + drift, shared by the Roadmap page and the MCP handler.\n * A feature's expected status comes from its linked tasks; a horizon's from its features.\n */\n\nimport type { RoadmapItem, RoadmapStatus, Task } from './core'\n\n/** What health needs from a task: status for progress, due for at-risk. */\nexport type TaskInfo = Pick<Task, 'status' | 'due'>\n\nexport interface RoadmapProgress { done: number; total: number }\n\nexport interface RoadmapDrift {\n id: string\n kind: 'status-mismatch' | 'missing-task' | 'overdue' | 'at-risk'\n message: string\n suggestedStatus?: RoadmapStatus\n}\n\nexport interface RoadmapHealth {\n progress: Record<string, RoadmapProgress>\n drift: RoadmapDrift[]\n}\n\nexport type DueState = 'overdue' | 'soon' | 'ok' | 'done'\n\nconst SOON_DAYS = 7\n\n/** Local calendar date \"YYYY-MM-DD\" (due dates are calendar dates, not instants). */\nexport function localToday(now = new Date()): string {\n const p = (n: number) => String(n).padStart(2, '0')\n return `${now.getFullYear()}-${p(now.getMonth() + 1)}-${p(now.getDate())}`\n}\n\nfunction daysBetween(from: string, to: string): number {\n const utc = (d: string) => Date.UTC(+d.slice(0, 4), +d.slice(5, 7) - 1, +d.slice(8, 10))\n return Math.round((utc(to) - utc(from)) / 86_400_000)\n}\n\nexport function dueState(due: string | null, status: RoadmapStatus, today: string): DueState | null {\n if (!due) return null\n if (status === 'done') return 'done'\n if (due < today) return 'overdue'\n return daysBetween(today, due) <= SOON_DAYS ? 'soon' : 'ok'\n}\n\ntype Started = 'done' | 'in-progress' | 'other'\n\nfunction expectedStatus(states: Started[]): RoadmapStatus {\n if (states.every(s => s === 'done')) return 'done'\n if (states.some(s => s !== 'other')) return 'in-progress'\n return 'planned'\n}\n\nexport interface TaskDueSummary { overdue: number; next: string | null }\n\n/** Open tasks' deadlines for a map node: how many are overdue, and the nearest upcoming due. */\nexport function taskDueSummary(taskIds: string[], tasks: Record<string, TaskInfo>, today: string): TaskDueSummary | null {\n const dues = taskIds\n .map(id => tasks[id])\n .filter(t => t && t.due && t.status !== 'done' && t.status !== 'cancelled')\n .map(t => t.due as string)\n if (!dues.length) return null\n const upcoming = dues.filter(d => d >= today).sort()\n return { overdue: dues.length - upcoming.length, next: upcoming[0] ?? null }\n}\n\n/** Why an unfinished epic may miss its date: overdue or blocked tasks, or due soon with nothing started. */\nfunction atRiskReasons(item: RoadmapItem, linked: string[], tasks: Record<string, TaskInfo>, today: string): string[] {\n const reasons: string[] = []\n for (const id of linked) {\n const t = tasks[id]\n if (t.status !== 'done' && t.due && t.due < today) reasons.push(`${id} overdue since ${t.due}`)\n if (t.status === 'blocked') reasons.push(`${id} blocked`)\n }\n const started = linked.some(id => ['done', 'in-progress', 'review'].includes(tasks[id].status))\n if (item.due && dueState(item.due, item.status, today) === 'soon' && !started) {\n reasons.push(`due ${item.due}, nothing started`)\n }\n return reasons\n}\n\nexport function roadmapHealth(\n items: RoadmapItem[], tasks: Record<string, TaskInfo>, today: string,\n): RoadmapHealth {\n const progress: Record<string, RoadmapProgress> = {}\n const drift: RoadmapDrift[] = []\n\n for (const item of items) {\n if (item.due && dueState(item.due, item.status, today) === 'overdue') {\n drift.push({ id: item.id, kind: 'overdue', message: `${item.id} \"${item.title}\" is overdue since ${item.due}` })\n }\n }\n const horizonIds = new Set(items.filter(i => i.parent === null).map(i => i.id))\n\n for (const item of items) {\n if (item.parent === null) continue\n const missing = item.tasks.filter(t => !(t in tasks))\n if (missing.length) {\n drift.push({ id: item.id, kind: 'missing-task', message: `${item.id} links unknown task ${missing.join(', ')}` })\n }\n // cancelled tasks don't count toward progress or expected status\n const linked = item.tasks.filter(t => t in tasks && tasks[t].status !== 'cancelled')\n // a paused epic is stopped on purpose: not at risk\n const risks = item.status === 'done' || item.status === 'paused' ? [] : atRiskReasons(item, linked, tasks, today)\n if (risks.length) {\n drift.push({ id: item.id, kind: 'at-risk', message: `${item.id} \"${item.title}\" at risk: ${risks.join('; ')}` })\n }\n if (!linked.length) continue\n const states: Started[] = linked.map(t =>\n tasks[t].status === 'done' ? 'done' : tasks[t].status === 'in-progress' || tasks[t].status === 'review' ? 'in-progress' : 'other')\n progress[item.id] = { done: states.filter(s => s === 'done').length, total: linked.length }\n const expected = expectedStatus(states)\n // paused stays paused until everything is done\n if (expected !== item.status && !(item.status === 'paused' && expected !== 'done')) {\n const open = linked.filter(t => tasks[t].status !== 'done')\n drift.push({\n id: item.id,\n kind: 'status-mismatch',\n message: expected === 'done'\n ? `${item.id} \"${item.title}\": all tasks done but status is ${item.status}`\n : `${item.id} \"${item.title}\" is ${item.status} but tasks ${open.join(', ')} are not done`,\n suggestedStatus: expected,\n })\n }\n }\n\n for (const h of items) {\n if (!horizonIds.has(h.id)) continue\n const kids = items.filter(i => i.parent === h.id)\n if (!kids.length) continue\n const states: Started[] = kids.map(k => k.status === 'done' ? 'done' : k.status === 'in-progress' ? 'in-progress' : 'other')\n // weight by tasks; an epic not broken down yet counts as one unit\n progress[h.id] = kids.reduce((sum, k) => {\n const p = progress[k.id] ?? { done: k.status === 'done' ? 1 : 0, total: 1 }\n return { done: sum.done + p.done, total: sum.total + p.total }\n }, { done: 0, total: 0 })\n const expected = expectedStatus(states)\n if (expected !== h.status && !(h.status === 'paused' && expected !== 'done')) {\n drift.push({\n id: h.id,\n kind: 'status-mismatch',\n message: `${h.id} \"${h.title}\" is ${h.status} but its features say ${expected}`,\n suggestedStatus: expected,\n })\n }\n }\n\n return { progress, drift }\n}\n","import type { RoadmapItem, RoadmapLayout } from \"@/types\"\n\nexport const HORIZON_W = 260\nexport const FEATURE_W = 220\nconst BRANCH_DX = 340\nconst ROW_H = 110\nconst HORIZON_GAP = 90\nconst COL_DX = FEATURE_W + 40\nconst MAX_ROWS_PER_SIDE = 6 // beyond this, a side gets a second (outer, half-row staggered) column\n\n/** Items that sit on the spine: real horizons plus orphans whose parent is not a horizon. */\nexport function spineItems(items: RoadmapItem[]): RoadmapItem[] {\n const horizonIds = new Set(items.filter((i) => i.parent === null).map((i) => i.id))\n return items\n .filter((i) => i.parent === null || !horizonIds.has(i.parent))\n .sort((a, b) => a.order - b.order)\n}\n\nexport function childrenOf(items: RoadmapItem[], parentId: string): RoadmapItem[] {\n return items.filter((i) => i.parent === parentId).sort((a, b) => a.order - b.order)\n}\n\n/**\n * Resolve a position for every item: saved (layout.json) wins, otherwise auto-place.\n * Horizons stack on x=0 by order; children alternate right/left of their parent's RESOLVED position.\n */\nexport function resolvePositions(items: RoadmapItem[], layout: RoadmapLayout): RoadmapLayout {\n const out: RoadmapLayout = {}\n let cursor = 0\n for (const h of spineItems(items)) {\n const hp = layout[h.id] ?? { x: 0, y: cursor }\n out[h.id] = hp\n const kids = h.parent === null ? childrenOf(items, h.id) : []\n const cols = Math.ceil(kids.length / 2) > MAX_ROWS_PER_SIDE ? 2 : 1\n kids.forEach((c, i) => {\n const side = i % 2 === 0 ? 1 : -1\n const k = Math.floor(i / 2) // index within its side\n const col = k % cols\n const row = Math.floor(k / cols)\n out[c.id] = layout[c.id] ?? {\n x: hp.x + (HORIZON_W - FEATURE_W) / 2 + side * (BRANCH_DX + col * COL_DX),\n // outer column sits half a row lower so its edges pass between inner nodes\n y: hp.y + row * ROW_H + col * (ROW_H / 2),\n }\n })\n const rows = Math.ceil(Math.ceil(kids.length / 2) / cols)\n cursor += Math.max(1, rows) * ROW_H + HORIZON_GAP\n }\n return out\n}\n","import type { RoadmapItem } from \"@/types\"\nimport { dueState, type DueState } from \"@/lib/roadmap-health\"\nimport { childrenOf, spineItems } from \"./layout\"\n\nexport const MONTH_W = 160\nexport const LANE_ROW_H = 44\nconst LABEL_W = 180 // horizontal room a marker's label needs before the next one fits on the same row\nconst MIN_MONTHS = 6\n\nconst MONTHS = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n\n// Dates are \"YYYY-MM-DD\" calendar dates — parsed by hand, never via new Date(string) (UTC shift).\nconst ymd = (d: string) => ({ y: +d.slice(0, 4), m: +d.slice(5, 7), day: +d.slice(8, 10) })\nconst daysIn = (y: number, m: number) => new Date(y, m, 0).getDate()\n\nexport function formatDay(d: string): string {\n const { m, day } = ymd(d)\n return `${day} ${MONTHS[m - 1]}`\n}\n\nexport interface TimelineMarker { item: RoadmapItem; x: number; row: number; state: DueState | null; horizon: boolean }\nexport interface TimelineLane { item: RoadmapItem; rows: number; markers: TimelineMarker[] }\nexport interface Timeline {\n months: { label: string; x: number }[]\n width: number\n todayX: number\n lanes: TimelineLane[]\n undated: RoadmapItem[]\n}\n\nexport function buildTimeline(items: RoadmapItem[], today: string): Timeline {\n const dues = items.map((i) => i.due).filter((d): d is string => !!d)\n const first = ymd([today, ...dues].sort()[0])\n const last = ymd([today, ...dues].sort().at(-1) ?? today)\n\n // pad one month each side, then stretch to a readable minimum\n const start = { y: first.y, m: first.m - 1 }\n const span = Math.max(MIN_MONTHS, (last.y - first.y) * 12 + (last.m - first.m) + 3)\n const months = Array.from({ length: span }, (_, i) => {\n const t = start.y * 12 + (start.m - 1) + i\n const y = Math.floor(t / 12)\n const m = (t % 12) + 1\n return { y, m, label: m === 1 || i === 0 ? `${MONTHS[m - 1]} ${y}` : MONTHS[m - 1], x: i * MONTH_W }\n })\n\n const xOf = (d: string) => {\n const { y, m, day } = ymd(d)\n const idx = (y - months[0].y) * 12 + (m - months[0].m)\n return idx * MONTH_W + ((day - 0.5) / daysIn(y, m)) * MONTH_W\n }\n\n const lanes = spineItems(items).map((h) => {\n const dated = [h, ...(h.parent === null ? childrenOf(items, h.id) : [])].filter((i) => i.due)\n const rowEnds: number[] = []\n const markers = dated\n .map((item) => ({ item, x: xOf(item.due as string), horizon: item.id === h.id }))\n .sort((a, b) => a.x - b.x)\n .map((mk) => {\n // greedy: first row whose last label ends before this marker\n let row = rowEnds.findIndex((end) => mk.x >= end)\n if (row === -1) row = rowEnds.push(0) - 1\n rowEnds[row] = mk.x + LABEL_W\n return { ...mk, row, state: dueState(mk.item.due, mk.item.status, today) }\n })\n return { item: h, rows: Math.max(1, rowEnds.length), markers }\n })\n\n return {\n months: months.map(({ label, x }) => ({ label, x })),\n width: span * MONTH_W,\n todayX: xOf(today),\n lanes,\n undated: items.filter((i) => !i.due && i.status !== \"done\"), // shipped work needs no date\n }\n}\n"],"names":["AGENT_LABEL","running","review","AgentMark","attach","className","agent","show","label","status","type","onClick","e","stopPropagation","chatId","title","AgentDot","SIDES","Top","Right","Bottom","Left","Handles","map","p","id","position","isConnectable","STATUS_LABEL","paused","done","planned","StatusDot","StatusPill","TASK_STATUS_BG","blocked","todo","cancelled","SegmentedProgress","statuses","length","filter","s","i","ProgressRing","value","total","r","c","Math","PI","pct","viewBox","cx","cy","fill","strokeWidth","stroke","strokeLinecap","strokeDasharray","strokeDashoffset","round","Progress","progress","style","width","DueChip","due","state","DueNote","data","taskDue","overdue","item","dueState","next","taskDueSoon","DriftMark","drift","join","HorizonNode","selected","epics","chapter","String","padStart","FeatureNode","taskStatuses","nextTaskId","kind","drifting","ring","live","tasks","nodeTypes","horizon","feature","SOON_DAYS","localToday","now","Date","n","getFullYear","getMonth","getDate","daysBetween","from","to","utc","d","UTC","slice","today","expectedStatus","states","every","some","taskDueSummary","taskIds","dues","t","upcoming","sort","atRiskReasons","linked","reasons","push","started","includes","roadmapHealth","items","message","horizonIds","Set","parent","missing","risks","expected","open","suggestedStatus","h","has","kids","k","reduce","sum"],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
module.exports=[815122,a=>{"use strict";var b=a.i(662145),c=a.i(795667),d=a.i(108280),e=a.i(368114),f=a.i(685698),g=a.i(598984);let h={running:"Agent working","needs-answer":"Agent needs you",review:"Plan to review"};a.s(["AgentDot",0,function({attach:a}){let c=(0,f.useItemAgent)(a);return c?(0,b.jsx)(g.StatusMarker,{status:c.status,label:h[c.status]}):null},"AgentMark",0,function({attach:a,className:g}){let i=(0,f.useItemAgent)(a),{show:j}=(0,f.useChats)();if(!i)return null;let k=h[i.status];return(0,b.jsxs)("button",{type:"button",onClick:a=>{a.stopPropagation(),j(i.chatId)},title:`${k} \xb7 open chat`,"aria-label":`${k}, open chat`,className:(0,e.cn)("nodrag inline-flex shrink-0 items-center gap-1 rounded-full border px-1.5 py-px font-mono text-[10px] leading-4 animate-fade-in transition-colors duration-(--duration-fast)","running"===i.status&&"border-accent/50 text-accent hover:bg-accent/10","needs-answer"===i.status&&"border-amber/50 text-amber hover:bg-amber/10","review"===i.status&&"border-accent/50 bg-accent/10 text-accent hover:bg-accent/20",g),children:["running"===i.status?(0,b.jsx)(d.Loader2,{className:"size-3 animate-spin","aria-hidden":!0}):(0,b.jsx)(c.Bot,{className:"size-3","aria-hidden":!0}),k]})}])},618940,a=>{"use strict";var b=a.i(662145),c=a.i(365465),d=a.i(152716),e=a.i(340933),f=a.i(425404),g=a.i(368114),h=a.i(581040),i=a.i(453161),j=a.i(815122),k=a.i(685698);let l=[d.Position.Top,d.Position.Right,d.Position.Bottom,d.Position.Left];function m(){return(0,b.jsxs)(b.Fragment,{children:[l.map(a=>(0,b.jsx)(c.Handle,{id:a,type:"source",position:a,isConnectable:!1,className:"opacity-0"},a)),l.map(a=>(0,b.jsx)(c.Handle,{id:`${a}-t`,type:"target",position:a,isConnectable:!1,className:"opacity-0"},`${a}-t`))]})}let n={"in-progress":"Active",paused:"Paused",done:"Done",planned:"Planned"};function o({status:a,className:c}){return(0,b.jsxs)("span",{title:n[a],"aria-label":n[a],className:(0,g.cn)("relative inline-flex h-2 w-2 shrink-0",c),children:["in-progress"===a&&(0,b.jsx)("span",{className:"absolute inset-0 animate-ping rounded-full bg-accent/60"}),(0,b.jsx)("span",{className:(0,g.cn)("relative h-full w-full rounded-full","done"===a&&"bg-teal","in-progress"===a&&"bg-accent","planned"===a&&"border border-muted","paused"===a&&"border-2 border-y-0 border-muted")})]})}let p={done:"bg-teal","in-progress":"bg-amber",review:"bg-accent",blocked:"bg-danger",paused:"bg-muted/60",todo:"bg-border2",cancelled:"bg-border"};function q({statuses:a,className:c}){if(!a?.length)return null;let d=a.filter(a=>"done"===a).length;return(0,b.jsx)("div",{className:(0,g.cn)("flex h-1.5 min-w-0 flex-1 gap-0.5",c),title:`${d}/${a.length} tasks done`,children:a.map((a,c)=>(0,b.jsx)("span",{className:(0,g.cn)("h-full flex-1 rounded-[1px]",p[a])},c))})}function r({value:a,total:c,className:d}){let e=2*Math.PI*14,f=c>0?a/c:0;return(0,b.jsxs)("span",{className:(0,g.cn)("relative inline-flex h-9 w-9 shrink-0 items-center justify-center",d),title:`${a}/${c} tasks done`,children:[(0,b.jsxs)("svg",{viewBox:"0 0 36 36",className:"absolute inset-0 -rotate-90",children:[(0,b.jsx)("circle",{cx:"18",cy:"18",r:14,fill:"none",strokeWidth:"3",className:"stroke-border"}),(0,b.jsx)("circle",{cx:"18",cy:"18",r:14,fill:"none",strokeWidth:"3",stroke:"currentColor",strokeLinecap:"round",strokeDasharray:e,strokeDashoffset:e*(1-f)})]}),(0,b.jsx)("span",{className:"font-mono text-[9px] text-txt",children:Math.round(100*f)})]})}function s({due:a,state:c}){return a?(0,b.jsxs)("span",{className:(0,g.cn)("font-mono text-[10px]","overdue"===c?"text-danger":"soon"===c?"text-amber":"text-muted"),children:["Due ",(0,h.formatDay)(a)]}):null}function t({data:a}){let c=a.taskDue;return c&&c.overdue>0?(0,b.jsxs)("span",{className:"font-mono text-[10px] text-danger",children:[c.overdue," ",1===c.overdue?"task":"tasks"," overdue"]}):a.item.due?(0,b.jsx)(s,{due:a.item.due,state:a.dueState}):c?.next?(0,b.jsxs)("span",{className:(0,g.cn)("font-mono text-[10px]",a.taskDueSoon?"text-amber":"text-muted"),children:["Next due ",(0,h.formatDay)(c.next)]}):null}function u({drift:a}){return a?.length?(0,b.jsx)("span",{title:a.join("\n"),className:"absolute -left-2 -top-2 rounded-full bg-bg p-0.5 text-amber",children:(0,b.jsx)(e.AlertTriangle,{className:"h-3.5 w-3.5"})}):null}a.s(["DueChip",0,s,"STATUS_LABEL",0,n,"SegmentedProgress",0,q,"StatusDot",0,o,"StatusPill",0,function({status:a}){return(0,b.jsxs)("span",{className:(0,g.cn)("inline-flex items-center gap-1.5 rounded-full border px-2 py-0.5 font-mono text-[10px] uppercase tracking-wider","done"===a&&"border-teal/40 text-teal","in-progress"===a&&"border-accent/50 text-accent","planned"===a&&"border-dashed border-border2 text-muted","paused"===a&&"border-border2 text-muted"),children:[(0,b.jsx)(o,{status:a,className:"h-1.5 w-1.5"}),n[a]]})},"TASK_STATUS_BG",0,p,"nodeTypes",0,{horizon:function({data:a,selected:c}){let{item:d,progress:e,epics:f,chapter:h}=a,j=d.status;return(0,b.jsxs)("div",{style:{width:i.HORIZON_W},className:(0,g.cn)("relative flex items-center gap-3 rounded-xl border bg-surface px-3.5 py-3 transition-shadow duration-(--duration-base)","in-progress"===j&&"border-accent/60 shadow-[0_0_0_1px_rgb(var(--rgb-accent)/0.25),0_10px_30px_-12px_rgb(var(--rgb-accent)/0.6)]","done"===j&&"border-teal/40","planned"===j&&"border-dashed border-border2","paused"===j&&"border-border2 opacity-75",c&&"ring-2 ring-accent/60 ring-offset-2 ring-offset-bg"),children:[(0,b.jsx)(m,{}),(0,b.jsx)("span",{className:(0,g.cn)("font-mono text-2xl font-semibold leading-none tabular-nums","in-progress"===j?"text-accent":"done"===j?"text-teal":"text-muted"),children:h?String(h).padStart(2,"0"):"··"}),(0,b.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,b.jsx)("p",{className:"text-xs font-semibold uppercase leading-snug tracking-wider text-txt",children:d.title}),(0,b.jsxs)("p",{className:"mt-1 flex flex-wrap items-center gap-x-2 font-mono text-[10px] text-muted",children:[f&&f.total>0&&(0,b.jsxs)("span",{children:[f.done,"/",f.total," epics"]}),(0,b.jsx)(s,{due:d.due,state:a.dueState})]})]}),e&&(0,b.jsx)(r,{value:e.done,total:e.total,className:"done"===j?"text-teal":"text-accent"}),(0,b.jsx)(u,{drift:a.drift})]})},feature:function({data:a,selected:c}){let{item:d,taskStatuses:e,nextTaskId:h}=a,l=(0,k.useItemAgent)({kind:"epic",id:d.id}),n=!!a.drift?.length,p=c&&"ring-2 ring-accent/60 ring-offset-2 ring-offset-bg";if("done"===d.status)return(0,b.jsxs)("div",{style:{width:i.FEATURE_W},className:(0,g.cn)("group relative flex items-center gap-2 rounded-lg border border-border bg-surface/60 px-3 py-2 hover:border-teal/40",p),children:[(0,b.jsx)(m,{}),(0,b.jsx)(f.Check,{className:"h-3.5 w-3.5 shrink-0 text-teal",strokeWidth:3}),(0,b.jsx)("p",{className:"min-w-0 flex-1 truncate text-[13px] text-muted group-hover:text-txt",title:d.title,children:d.title}),l?(0,b.jsx)(j.AgentMark,{attach:{kind:"epic",id:d.id}}):a.progress&&(0,b.jsxs)("span",{className:"font-mono text-[10px] text-muted",children:[a.progress.done,"/",a.progress.total]}),(0,b.jsx)(u,{drift:a.drift})]});let r="in-progress"===d.status;return(0,b.jsxs)("div",{style:{width:i.FEATURE_W},className:(0,g.cn)("relative flex flex-col gap-1.5 rounded-lg border px-3 py-2.5 transition-shadow duration-(--duration-base)",r?"border-accent/50 bg-surface shadow-[0_8px_24px_-10px_rgb(var(--rgb-accent)/0.55)]":"border-dashed border-border2 bg-bg hover:border-muted","paused"===d.status&&"opacity-70",p),children:[(0,b.jsx)(m,{}),r&&(0,b.jsx)("span",{className:(0,g.cn)("absolute -inset-y-px -left-px w-[3px] rounded-l-lg",n?"bg-amber":"bg-accent")}),(0,b.jsxs)("div",{className:"flex items-center justify-between font-mono text-[10px]",children:[(0,b.jsx)("span",{className:"text-muted",children:d.id}),l?(0,b.jsx)(j.AgentMark,{attach:{kind:"epic",id:d.id}}):r?(0,b.jsxs)("span",{className:"flex items-center gap-1.5 uppercase tracking-wider text-accent",children:[(0,b.jsx)(o,{status:"in-progress",className:"h-1.5 w-1.5"}),"Live"]}):(0,b.jsx)("span",{className:"uppercase tracking-wider text-muted",children:d.tasks.length?`${d.tasks.length} tasks`:"No tasks yet"})]}),(0,b.jsx)("p",{className:(0,g.cn)("line-clamp-2 text-[13px] leading-snug",r?"font-medium text-txt":"text-txt/80"),title:d.title,children:d.title}),e&&e.length>0&&(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)(q,{statuses:e}),(0,b.jsx)("span",{className:"shrink-0 font-mono text-[10px] text-muted",children:r&&h?(0,b.jsxs)(b.Fragment,{children:["next ",(0,b.jsx)("span",{className:"text-txt",children:h})]}):`${e.filter(a=>"done"===a).length}/${e.length}`})]}),(0,b.jsx)(t,{data:a}),(0,b.jsx)(u,{drift:a.drift})]})}}])},581040,452696,453161,a=>{"use strict";function b(a,b,c){let d;return a?"done"===b?"done":a<c?"overdue":7>=Math.round(((d=a=>Date.UTC(+a.slice(0,4),a.slice(5,7)-1,+a.slice(8,10)))(a)-d(c))/864e5)?"soon":"ok":null}function c(a){return a.every(a=>"done"===a)?"done":a.some(a=>"other"!==a)?"in-progress":"planned"}a.s(["dueState",0,b,"localToday",0,function(a=new Date){let b=a=>String(a).padStart(2,"0");return`${a.getFullYear()}-${b(a.getMonth()+1)}-${b(a.getDate())}`},"roadmapHealth",0,function(a,d,e){let f={},g=[];for(let c of a)c.due&&"overdue"===b(c.due,c.status,e)&&g.push({id:c.id,kind:"overdue",message:`${c.id} "${c.title}" is overdue since ${c.due}`});let h=new Set(a.filter(a=>null===a.parent).map(a=>a.id));for(let h of a){if(null===h.parent)continue;let a=h.tasks.filter(a=>!(a in d));a.length&&g.push({id:h.id,kind:"missing-task",message:`${h.id} links unknown task ${a.join(", ")}`});let i=h.tasks.filter(a=>a in d&&"cancelled"!==d[a].status),j="done"===h.status||"paused"===h.status?[]:function(a,c,d,e){let f=[];for(let a of c){let b=d[a];"done"!==b.status&&b.due&&b.due<e&&f.push(`${a} overdue since ${b.due}`),"blocked"===b.status&&f.push(`${a} blocked`)}let g=c.some(a=>["done","in-progress","review"].includes(d[a].status));return a.due&&"soon"===b(a.due,a.status,e)&&!g&&f.push(`due ${a.due}, nothing started`),f}(h,i,d,e);if(j.length&&g.push({id:h.id,kind:"at-risk",message:`${h.id} "${h.title}" at risk: ${j.join("; ")}`}),!i.length)continue;let k=i.map(a=>"done"===d[a].status?"done":"in-progress"===d[a].status||"review"===d[a].status?"in-progress":"other");f[h.id]={done:k.filter(a=>"done"===a).length,total:i.length};let l=c(k);if(l!==h.status&&("paused"!==h.status||"done"===l)){let a=i.filter(a=>"done"!==d[a].status);g.push({id:h.id,kind:"status-mismatch",message:"done"===l?`${h.id} "${h.title}": all tasks done but status is ${h.status}`:`${h.id} "${h.title}" is ${h.status} but tasks ${a.join(", ")} are not done`,suggestedStatus:l})}}for(let b of a){if(!h.has(b.id))continue;let d=a.filter(a=>a.parent===b.id);if(!d.length)continue;let e=d.map(a=>"done"===a.status?"done":"in-progress"===a.status?"in-progress":"other");f[b.id]=d.reduce((a,b)=>{let c=f[b.id]??{done:+("done"===b.status),total:1};return{done:a.done+c.done,total:a.total+c.total}},{done:0,total:0});let i=c(e);i!==b.status&&("paused"!==b.status||"done"===i)&&g.push({id:b.id,kind:"status-mismatch",message:`${b.id} "${b.title}" is ${b.status} but its features say ${i}`,suggestedStatus:i})}return{progress:f,drift:g}},"taskDueSummary",0,function(a,b,c){let d=a.map(a=>b[a]).filter(a=>a&&a.due&&"done"!==a.status&&"cancelled"!==a.status).map(a=>a.due);if(!d.length)return null;let e=d.filter(a=>a>=c).sort();return{overdue:d.length-e.length,next:e[0]??null}}],452696);function d(a){let b=new Set(a.filter(a=>null===a.parent).map(a=>a.id));return a.filter(a=>null===a.parent||!b.has(a.parent)).sort((a,b)=>a.order-b.order)}function e(a,b){return a.filter(a=>a.parent===b).sort((a,b)=>a.order-b.order)}a.s(["FEATURE_W",0,220,"HORIZON_W",0,260,"childrenOf",0,e,"resolvePositions",0,function(a,b){let c={},f=0;for(let g of d(a)){let d=b[g.id]??{x:0,y:f};c[g.id]=d;let h=null===g.parent?e(a,g.id):[],i=Math.ceil(h.length/2)>6?2:1;h.forEach((a,e)=>{let f=e%2==0?1:-1,g=Math.floor(e/2),h=g%i,j=Math.floor(g/i);c[a.id]=b[a.id]??{x:d.x+20+f*(340+260*h),y:d.y+110*j+55*h}}),f+=110*Math.max(1,Math.ceil(Math.ceil(h.length/2)/i))+90}return c},"spineItems",0,d],453161);let f=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],g=a=>({y:+a.slice(0,4),m:+a.slice(5,7),day:+a.slice(8,10)});a.s(["LANE_ROW_H",0,44,"buildTimeline",0,function(a,c){let h=a.map(a=>a.due).filter(a=>!!a),i=g([c,...h].sort()[0]),j=g([c,...h].sort().at(-1)??c),k={y:i.y,m:i.m-1},l=Math.max(6,(j.y-i.y)*12+(j.m-i.m)+3),m=Array.from({length:l},(a,b)=>{let c=12*k.y+(k.m-1)+b,d=Math.floor(c/12),e=c%12+1;return{y:d,m:e,label:1===e||0===b?`${f[e-1]} ${d}`:f[e-1],x:160*b}}),n=a=>{let{y:b,m:c,day:d}=g(a);return((b-m[0].y)*12+(c-m[0].m))*160+(d-.5)/new Date(b,c,0).getDate()*160},o=d(a).map(d=>{let f=[d,...null===d.parent?e(a,d.id):[]].filter(a=>a.due),g=[],h=f.map(a=>({item:a,x:n(a.due),horizon:a.id===d.id})).sort((a,b)=>a.x-b.x).map(a=>{let d=g.findIndex(b=>a.x>=b);return -1===d&&(d=g.push(0)-1),g[d]=a.x+180,{...a,row:d,state:b(a.item.due,a.item.status,c)}});return{item:d,rows:Math.max(1,g.length),markers:h}});return{months:m.map(({label:a,x:b})=>({label:a,x:b})),width:160*l,todayX:n(c),lanes:o,undated:a.filter(a=>!a.due&&"done"!==a.status)}},"formatDay",0,function(a){let{m:b,day:c}=g(a);return`${c} ${f[b-1]}`}],581040)}];
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=src_components_1s861m8._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/chat/AgentMark.tsx","../../../../src/components/roadmap/RoadmapNodes.tsx","../../../../src/lib/roadmap-health.ts","../../../../src/components/roadmap/layout.ts","../../../../src/components/roadmap/timeline.ts"],"sourcesContent":["\"use client\"\n\nimport { Bot, Loader2 } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\nimport { useChats, useItemAgent } from \"@/context/ChatContext\"\nimport type { Attach, ItemAgent } from \"@/lib/chats\"\nimport { StatusMarker } from \"./StatusMarker\"\n\nexport const AGENT_LABEL: Record<ItemAgent[\"status\"], string> = {\n running: \"Agent working\",\n \"needs-answer\": \"Agent needs you\",\n review: \"Plan to review\",\n}\n\n/**\n * Pill on an epic/task while a chat works on it; click opens that chat.\n * `nodrag` + stopPropagation keep a React Flow node from dragging/selecting on click.\n */\nexport function AgentMark({ attach, className }: { attach: Attach; className?: string }) {\n const agent = useItemAgent(attach)\n const { show } = useChats()\n if (!agent) return null\n const label = AGENT_LABEL[agent.status]\n return (\n <button\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); show(agent.chatId) }}\n title={`${label} · open chat`}\n aria-label={`${label}, open chat`}\n className={cn(\n \"nodrag inline-flex shrink-0 items-center gap-1 rounded-full border px-1.5 py-px font-mono text-[10px] leading-4 animate-fade-in transition-colors duration-(--duration-fast)\",\n agent.status === \"running\" && \"border-accent/50 text-accent hover:bg-accent/10\",\n agent.status === \"needs-answer\" && \"border-amber/50 text-amber hover:bg-amber/10\",\n agent.status === \"review\" && \"border-accent/50 bg-accent/10 text-accent hover:bg-accent/20\",\n className,\n )}\n >\n {agent.status === \"running\" ? <Loader2 className=\"size-3 animate-spin\" aria-hidden /> : <Bot className=\"size-3\" aria-hidden />}\n {label}\n </button>\n )\n}\n\n/** Non-interactive variant for places that are already a button (timeline markers, board cards, task rows). */\nexport function AgentDot({ attach }: { attach: Attach }) {\n const agent = useItemAgent(attach)\n if (!agent) return null\n return <StatusMarker status={agent.status} label={AGENT_LABEL[agent.status]} />\n}\n","\"use client\"\n\nimport { Handle, Position, type Node, type NodeProps } from \"@xyflow/react\"\nimport { AlertTriangle, Check } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\nimport type { RoadmapItem, RoadmapStatus, TaskStatus } from \"@/types\"\nimport type { DueState, TaskDueSummary } from \"@/lib/roadmap-health\"\nimport { formatDay } from \"./timeline\"\nimport { FEATURE_W, HORIZON_W } from \"./layout\"\nimport { AgentMark } from \"@/components/chat/AgentMark\"\nimport { useItemAgent } from \"@/context/ChatContext\"\n\nexport type RoadmapNodeData = {\n item: RoadmapItem\n progress?: { done: number; total: number } // derived, never persisted\n drift?: string[]\n dueState?: DueState | null\n taskDue?: TaskDueSummary | null\n taskDueSoon?: boolean\n taskStatuses?: TaskStatus[] // feature: linked tasks in order, cancelled/missing left out\n nextTaskId?: string | null // feature: what vibedoc_next_task would hand out\n chapter?: number // horizon: 1-based position on the spine\n epics?: { done: number; total: number } // horizon: child epics\n}\nexport type RoadmapNode = Node<RoadmapNodeData, \"horizon\" | \"feature\">\n\nconst SIDES = [Position.Top, Position.Right, Position.Bottom, Position.Left]\n\n/** One invisible source + target handle per side; edges pick `side` / `side-t`. */\nfunction Handles() {\n return (\n <>\n {SIDES.map((p) => (\n <Handle key={p} id={p} type=\"source\" position={p} isConnectable={false} className=\"opacity-0\" />\n ))}\n {SIDES.map((p) => (\n <Handle key={`${p}-t`} id={`${p}-t`} type=\"target\" position={p} isConnectable={false} className=\"opacity-0\" />\n ))}\n </>\n )\n}\n\nexport const STATUS_LABEL: Record<RoadmapStatus, string> = { \"in-progress\": \"Active\", paused: \"Paused\", done: \"Done\", planned: \"Planned\" }\n\n/** Roadmap status as a dot: live = accent with a pulse, done = teal, planned = hollow. */\nexport function StatusDot({ status, className }: { status: RoadmapStatus; className?: string }) {\n return (\n <span title={STATUS_LABEL[status]} aria-label={STATUS_LABEL[status]} className={cn(\"relative inline-flex h-2 w-2 shrink-0\", className)}>\n {status === \"in-progress\" && <span className=\"absolute inset-0 animate-ping rounded-full bg-accent/60\" />}\n <span\n className={cn(\n \"relative h-full w-full rounded-full\",\n status === \"done\" && \"bg-teal\",\n status === \"in-progress\" && \"bg-accent\",\n status === \"planned\" && \"border border-muted\",\n status === \"paused\" && \"border-2 border-y-0 border-muted\",\n )}\n />\n </span>\n )\n}\n\nexport function StatusPill({ status }: { status: RoadmapStatus }) {\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-full border px-2 py-0.5 font-mono text-[10px] uppercase tracking-wider\",\n status === \"done\" && \"border-teal/40 text-teal\",\n status === \"in-progress\" && \"border-accent/50 text-accent\",\n status === \"planned\" && \"border-dashed border-border2 text-muted\",\n status === \"paused\" && \"border-border2 text-muted\",\n )}\n >\n <StatusDot status={status} className=\"h-1.5 w-1.5\" />\n {STATUS_LABEL[status]}\n </span>\n )\n}\n\nexport const TASK_STATUS_BG: Record<TaskStatus, string> = {\n done: \"bg-teal\",\n \"in-progress\": \"bg-amber\",\n review: \"bg-accent\",\n blocked: \"bg-danger\",\n paused: \"bg-muted/60\",\n todo: \"bg-border2\",\n cancelled: \"bg-border\",\n}\n\n/** One segment per task, colored by its board status (same colors as the board). */\nexport function SegmentedProgress({ statuses, className }: { statuses?: TaskStatus[]; className?: string }) {\n if (!statuses?.length) return null\n const done = statuses.filter((s) => s === \"done\").length\n return (\n <div className={cn(\"flex h-1.5 min-w-0 flex-1 gap-0.5\", className)} title={`${done}/${statuses.length} tasks done`}>\n {statuses.map((s, i) => (\n <span key={i} className={cn(\"h-full flex-1 rounded-[1px]\", TASK_STATUS_BG[s])} />\n ))}\n </div>\n )\n}\n\n/** Small progress ring; color follows `className` (currentColor). */\nexport function ProgressRing({ value, total, className }: { value: number; total: number; className?: string }) {\n const r = 14\n const c = 2 * Math.PI * r\n const pct = total > 0 ? value / total : 0\n return (\n <span className={cn(\"relative inline-flex h-9 w-9 shrink-0 items-center justify-center\", className)} title={`${value}/${total} tasks done`}>\n <svg viewBox=\"0 0 36 36\" className=\"absolute inset-0 -rotate-90\">\n <circle cx=\"18\" cy=\"18\" r={r} fill=\"none\" strokeWidth=\"3\" className=\"stroke-border\" />\n <circle cx=\"18\" cy=\"18\" r={r} fill=\"none\" strokeWidth=\"3\" stroke=\"currentColor\" strokeLinecap=\"round\"\n strokeDasharray={c} strokeDashoffset={c * (1 - pct)} />\n </svg>\n <span className=\"font-mono text-[9px] text-txt\">{Math.round(pct * 100)}</span>\n </span>\n )\n}\n\nexport function Progress({ progress }: { progress?: RoadmapNodeData[\"progress\"] }) {\n if (!progress) return null\n const pct = Math.round((progress.done / progress.total) * 100)\n return (\n <div className=\"flex items-center gap-1.5\" title={`${progress.done}/${progress.total} done`}>\n <div className=\"h-1 flex-1 overflow-hidden rounded-full bg-border\">\n <div className=\"h-full rounded-full bg-teal\" style={{ width: `${pct}%` }} />\n </div>\n <span className=\"font-mono text-[10px] text-muted\">{progress.done}/{progress.total}</span>\n </div>\n )\n}\n\nexport function DueChip({ due, state }: { due: string | null; state?: DueState | null }) {\n if (!due) return null\n return (\n <span\n className={cn(\n \"font-mono text-[10px]\",\n state === \"overdue\" ? \"text-danger\" : state === \"soon\" ? \"text-amber\" : \"text-muted\",\n )}\n >\n Due {formatDay(due)}\n </span>\n )\n}\n\n/** The single most urgent date line for a card: overdue tasks, then the epic's own due, then the next task due. */\nfunction DueNote({ data }: { data: RoadmapNodeData }) {\n const s = data.taskDue\n if (s && s.overdue > 0) {\n return <span className=\"font-mono text-[10px] text-danger\">{s.overdue} {s.overdue === 1 ? \"task\" : \"tasks\"} overdue</span>\n }\n if (data.item.due) return <DueChip due={data.item.due} state={data.dueState} />\n if (s?.next) return <span className={cn(\"font-mono text-[10px]\", data.taskDueSoon ? \"text-amber\" : \"text-muted\")}>Next due {formatDay(s.next)}</span>\n return null\n}\n\nfunction DriftMark({ drift }: { drift?: string[] }) {\n if (!drift?.length) return null\n return (\n <span title={drift.join(\"\\n\")} className=\"absolute -left-2 -top-2 rounded-full bg-bg p-0.5 text-amber\">\n <AlertTriangle className=\"h-3.5 w-3.5\" />\n </span>\n )\n}\n\n/** A horizon is a chapter: big number, title, epic count, and a ring for task progress. */\nexport function HorizonNode({ data, selected }: NodeProps<RoadmapNode>) {\n const { item, progress, epics, chapter } = data\n const status = item.status\n return (\n <div\n style={{ width: HORIZON_W }}\n className={cn(\n \"relative flex items-center gap-3 rounded-xl border bg-surface px-3.5 py-3 transition-shadow duration-(--duration-base)\",\n status === \"in-progress\" && \"border-accent/60 shadow-[0_0_0_1px_rgb(var(--rgb-accent)/0.25),0_10px_30px_-12px_rgb(var(--rgb-accent)/0.6)]\",\n status === \"done\" && \"border-teal/40\",\n status === \"planned\" && \"border-dashed border-border2\",\n status === \"paused\" && \"border-border2 opacity-75\",\n selected && \"ring-2 ring-accent/60 ring-offset-2 ring-offset-bg\",\n )}\n >\n <Handles />\n <span\n className={cn(\n \"font-mono text-2xl font-semibold leading-none tabular-nums\",\n status === \"in-progress\" ? \"text-accent\" : status === \"done\" ? \"text-teal\" : \"text-muted\",\n )}\n >\n {chapter ? String(chapter).padStart(2, \"0\") : \"··\"}\n </span>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-xs font-semibold uppercase leading-snug tracking-wider text-txt\">{item.title}</p>\n <p className=\"mt-1 flex flex-wrap items-center gap-x-2 font-mono text-[10px] text-muted\">\n {epics && epics.total > 0 && <span>{epics.done}/{epics.total} epics</span>}\n <DueChip due={item.due} state={data.dueState} />\n </p>\n </div>\n {progress && (\n <ProgressRing value={progress.done} total={progress.total} className={status === \"done\" ? \"text-teal\" : \"text-accent\"} />\n )}\n <DriftMark drift={data.drift} />\n </div>\n )\n}\n\n/**\n * Three looks so the eye lands on live work: live = lit card with task segments and the next task,\n * done = one quiet line, planned = dashed outline. Height stays under ROW_H (layout.ts) so saved positions never overlap.\n */\nexport function FeatureNode({ data, selected }: NodeProps<RoadmapNode>) {\n const { item, taskStatuses, nextTaskId } = data\n const agent = useItemAgent({ kind: \"epic\", id: item.id })\n const drifting = !!data.drift?.length\n const ring = selected && \"ring-2 ring-accent/60 ring-offset-2 ring-offset-bg\"\n\n if (item.status === \"done\") {\n return (\n <div\n style={{ width: FEATURE_W }}\n className={cn(\"group relative flex items-center gap-2 rounded-lg border border-border bg-surface/60 px-3 py-2 hover:border-teal/40\", ring)}\n >\n <Handles />\n <Check className=\"h-3.5 w-3.5 shrink-0 text-teal\" strokeWidth={3} />\n <p className=\"min-w-0 flex-1 truncate text-[13px] text-muted group-hover:text-txt\" title={item.title}>{item.title}</p>\n {agent ? <AgentMark attach={{ kind: \"epic\", id: item.id }} />\n : data.progress && <span className=\"font-mono text-[10px] text-muted\">{data.progress.done}/{data.progress.total}</span>}\n <DriftMark drift={data.drift} />\n </div>\n )\n }\n\n const live = item.status === \"in-progress\"\n return (\n <div\n style={{ width: FEATURE_W }}\n className={cn(\n \"relative flex flex-col gap-1.5 rounded-lg border px-3 py-2.5 transition-shadow duration-(--duration-base)\",\n live\n ? \"border-accent/50 bg-surface shadow-[0_8px_24px_-10px_rgb(var(--rgb-accent)/0.55)]\"\n : \"border-dashed border-border2 bg-bg hover:border-muted\",\n item.status === \"paused\" && \"opacity-70\",\n ring,\n )}\n >\n <Handles />\n {live && <span className={cn(\"absolute -inset-y-px -left-px w-[3px] rounded-l-lg\", drifting ? \"bg-amber\" : \"bg-accent\")} />}\n <div className=\"flex items-center justify-between font-mono text-[10px]\">\n <span className=\"text-muted\">{item.id}</span>\n {agent ? (\n <AgentMark attach={{ kind: \"epic\", id: item.id }} />\n ) : live ? (\n <span className=\"flex items-center gap-1.5 uppercase tracking-wider text-accent\"><StatusDot status=\"in-progress\" className=\"h-1.5 w-1.5\" />Live</span>\n ) : (\n <span className=\"uppercase tracking-wider text-muted\">{item.tasks.length ? `${item.tasks.length} tasks` : \"No tasks yet\"}</span>\n )}\n </div>\n <p className={cn(\"line-clamp-2 text-[13px] leading-snug\", live ? \"font-medium text-txt\" : \"text-txt/80\")} title={item.title}>\n {item.title}\n </p>\n {taskStatuses && taskStatuses.length > 0 && (\n <div className=\"flex items-center gap-2\">\n <SegmentedProgress statuses={taskStatuses} />\n <span className=\"shrink-0 font-mono text-[10px] text-muted\">\n {live && nextTaskId ? <>next <span className=\"text-txt\">{nextTaskId}</span></> : `${taskStatuses.filter((s) => s === \"done\").length}/${taskStatuses.length}`}\n </span>\n </div>\n )}\n <DueNote data={data} />\n <DriftMark drift={data.drift} />\n </div>\n )\n}\n\nexport const nodeTypes = { horizon: HorizonNode, feature: FeatureNode }\n","/**\n * src/lib/roadmap-health.ts\n * Pure (no fs): roadmap progress + drift, shared by the Roadmap page and the MCP handler.\n * A feature's expected status comes from its linked tasks; a horizon's from its features.\n */\n\nimport type { RoadmapItem, RoadmapStatus, Task } from './core'\n\n/** What health needs from a task: status for progress, due for at-risk. */\nexport type TaskInfo = Pick<Task, 'status' | 'due'>\n\nexport interface RoadmapProgress { done: number; total: number }\n\nexport interface RoadmapDrift {\n id: string\n kind: 'status-mismatch' | 'missing-task' | 'overdue' | 'at-risk'\n message: string\n suggestedStatus?: RoadmapStatus\n}\n\nexport interface RoadmapHealth {\n progress: Record<string, RoadmapProgress>\n drift: RoadmapDrift[]\n}\n\nexport type DueState = 'overdue' | 'soon' | 'ok' | 'done'\n\nconst SOON_DAYS = 7\n\n/** Local calendar date \"YYYY-MM-DD\" (due dates are calendar dates, not instants). */\nexport function localToday(now = new Date()): string {\n const p = (n: number) => String(n).padStart(2, '0')\n return `${now.getFullYear()}-${p(now.getMonth() + 1)}-${p(now.getDate())}`\n}\n\nfunction daysBetween(from: string, to: string): number {\n const utc = (d: string) => Date.UTC(+d.slice(0, 4), +d.slice(5, 7) - 1, +d.slice(8, 10))\n return Math.round((utc(to) - utc(from)) / 86_400_000)\n}\n\nexport function dueState(due: string | null, status: RoadmapStatus, today: string): DueState | null {\n if (!due) return null\n if (status === 'done') return 'done'\n if (due < today) return 'overdue'\n return daysBetween(today, due) <= SOON_DAYS ? 'soon' : 'ok'\n}\n\ntype Started = 'done' | 'in-progress' | 'other'\n\nfunction expectedStatus(states: Started[]): RoadmapStatus {\n if (states.every(s => s === 'done')) return 'done'\n if (states.some(s => s !== 'other')) return 'in-progress'\n return 'planned'\n}\n\nexport interface TaskDueSummary { overdue: number; next: string | null }\n\n/** Open tasks' deadlines for a map node: how many are overdue, and the nearest upcoming due. */\nexport function taskDueSummary(taskIds: string[], tasks: Record<string, TaskInfo>, today: string): TaskDueSummary | null {\n const dues = taskIds\n .map(id => tasks[id])\n .filter(t => t && t.due && t.status !== 'done' && t.status !== 'cancelled')\n .map(t => t.due as string)\n if (!dues.length) return null\n const upcoming = dues.filter(d => d >= today).sort()\n return { overdue: dues.length - upcoming.length, next: upcoming[0] ?? null }\n}\n\n/** Why an unfinished epic may miss its date: overdue or blocked tasks, or due soon with nothing started. */\nfunction atRiskReasons(item: RoadmapItem, linked: string[], tasks: Record<string, TaskInfo>, today: string): string[] {\n const reasons: string[] = []\n for (const id of linked) {\n const t = tasks[id]\n if (t.status !== 'done' && t.due && t.due < today) reasons.push(`${id} overdue since ${t.due}`)\n if (t.status === 'blocked') reasons.push(`${id} blocked`)\n }\n const started = linked.some(id => ['done', 'in-progress', 'review'].includes(tasks[id].status))\n if (item.due && dueState(item.due, item.status, today) === 'soon' && !started) {\n reasons.push(`due ${item.due}, nothing started`)\n }\n return reasons\n}\n\nexport function roadmapHealth(\n items: RoadmapItem[], tasks: Record<string, TaskInfo>, today: string,\n): RoadmapHealth {\n const progress: Record<string, RoadmapProgress> = {}\n const drift: RoadmapDrift[] = []\n\n for (const item of items) {\n if (item.due && dueState(item.due, item.status, today) === 'overdue') {\n drift.push({ id: item.id, kind: 'overdue', message: `${item.id} \"${item.title}\" is overdue since ${item.due}` })\n }\n }\n const horizonIds = new Set(items.filter(i => i.parent === null).map(i => i.id))\n\n for (const item of items) {\n if (item.parent === null) continue\n const missing = item.tasks.filter(t => !(t in tasks))\n if (missing.length) {\n drift.push({ id: item.id, kind: 'missing-task', message: `${item.id} links unknown task ${missing.join(', ')}` })\n }\n // cancelled tasks don't count toward progress or expected status\n const linked = item.tasks.filter(t => t in tasks && tasks[t].status !== 'cancelled')\n // a paused epic is stopped on purpose: not at risk\n const risks = item.status === 'done' || item.status === 'paused' ? [] : atRiskReasons(item, linked, tasks, today)\n if (risks.length) {\n drift.push({ id: item.id, kind: 'at-risk', message: `${item.id} \"${item.title}\" at risk: ${risks.join('; ')}` })\n }\n if (!linked.length) continue\n const states: Started[] = linked.map(t =>\n tasks[t].status === 'done' ? 'done' : tasks[t].status === 'in-progress' || tasks[t].status === 'review' ? 'in-progress' : 'other')\n progress[item.id] = { done: states.filter(s => s === 'done').length, total: linked.length }\n const expected = expectedStatus(states)\n // paused stays paused until everything is done\n if (expected !== item.status && !(item.status === 'paused' && expected !== 'done')) {\n const open = linked.filter(t => tasks[t].status !== 'done')\n drift.push({\n id: item.id,\n kind: 'status-mismatch',\n message: expected === 'done'\n ? `${item.id} \"${item.title}\": all tasks done but status is ${item.status}`\n : `${item.id} \"${item.title}\" is ${item.status} but tasks ${open.join(', ')} are not done`,\n suggestedStatus: expected,\n })\n }\n }\n\n for (const h of items) {\n if (!horizonIds.has(h.id)) continue\n const kids = items.filter(i => i.parent === h.id)\n if (!kids.length) continue\n const states: Started[] = kids.map(k => k.status === 'done' ? 'done' : k.status === 'in-progress' ? 'in-progress' : 'other')\n // weight by tasks; an epic not broken down yet counts as one unit\n progress[h.id] = kids.reduce((sum, k) => {\n const p = progress[k.id] ?? { done: k.status === 'done' ? 1 : 0, total: 1 }\n return { done: sum.done + p.done, total: sum.total + p.total }\n }, { done: 0, total: 0 })\n const expected = expectedStatus(states)\n if (expected !== h.status && !(h.status === 'paused' && expected !== 'done')) {\n drift.push({\n id: h.id,\n kind: 'status-mismatch',\n message: `${h.id} \"${h.title}\" is ${h.status} but its features say ${expected}`,\n suggestedStatus: expected,\n })\n }\n }\n\n return { progress, drift }\n}\n","import type { RoadmapItem, RoadmapLayout } from \"@/types\"\n\nexport const HORIZON_W = 260\nexport const FEATURE_W = 220\nconst BRANCH_DX = 340\nconst ROW_H = 110\nconst HORIZON_GAP = 90\nconst COL_DX = FEATURE_W + 40\nconst MAX_ROWS_PER_SIDE = 6 // beyond this, a side gets a second (outer, half-row staggered) column\n\n/** Items that sit on the spine: real horizons plus orphans whose parent is not a horizon. */\nexport function spineItems(items: RoadmapItem[]): RoadmapItem[] {\n const horizonIds = new Set(items.filter((i) => i.parent === null).map((i) => i.id))\n return items\n .filter((i) => i.parent === null || !horizonIds.has(i.parent))\n .sort((a, b) => a.order - b.order)\n}\n\nexport function childrenOf(items: RoadmapItem[], parentId: string): RoadmapItem[] {\n return items.filter((i) => i.parent === parentId).sort((a, b) => a.order - b.order)\n}\n\n/**\n * Resolve a position for every item: saved (layout.json) wins, otherwise auto-place.\n * Horizons stack on x=0 by order; children alternate right/left of their parent's RESOLVED position.\n */\nexport function resolvePositions(items: RoadmapItem[], layout: RoadmapLayout): RoadmapLayout {\n const out: RoadmapLayout = {}\n let cursor = 0\n for (const h of spineItems(items)) {\n const hp = layout[h.id] ?? { x: 0, y: cursor }\n out[h.id] = hp\n const kids = h.parent === null ? childrenOf(items, h.id) : []\n const cols = Math.ceil(kids.length / 2) > MAX_ROWS_PER_SIDE ? 2 : 1\n kids.forEach((c, i) => {\n const side = i % 2 === 0 ? 1 : -1\n const k = Math.floor(i / 2) // index within its side\n const col = k % cols\n const row = Math.floor(k / cols)\n out[c.id] = layout[c.id] ?? {\n x: hp.x + (HORIZON_W - FEATURE_W) / 2 + side * (BRANCH_DX + col * COL_DX),\n // outer column sits half a row lower so its edges pass between inner nodes\n y: hp.y + row * ROW_H + col * (ROW_H / 2),\n }\n })\n const rows = Math.ceil(Math.ceil(kids.length / 2) / cols)\n cursor += Math.max(1, rows) * ROW_H + HORIZON_GAP\n }\n return out\n}\n","import type { RoadmapItem } from \"@/types\"\nimport { dueState, type DueState } from \"@/lib/roadmap-health\"\nimport { childrenOf, spineItems } from \"./layout\"\n\nexport const MONTH_W = 160\nexport const LANE_ROW_H = 44\nconst LABEL_W = 180 // horizontal room a marker's label needs before the next one fits on the same row\nconst MIN_MONTHS = 6\n\nconst MONTHS = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n\n// Dates are \"YYYY-MM-DD\" calendar dates — parsed by hand, never via new Date(string) (UTC shift).\nconst ymd = (d: string) => ({ y: +d.slice(0, 4), m: +d.slice(5, 7), day: +d.slice(8, 10) })\nconst daysIn = (y: number, m: number) => new Date(y, m, 0).getDate()\n\nexport function formatDay(d: string): string {\n const { m, day } = ymd(d)\n return `${day} ${MONTHS[m - 1]}`\n}\n\nexport interface TimelineMarker { item: RoadmapItem; x: number; row: number; state: DueState | null; horizon: boolean }\nexport interface TimelineLane { item: RoadmapItem; rows: number; markers: TimelineMarker[] }\nexport interface Timeline {\n months: { label: string; x: number }[]\n width: number\n todayX: number\n lanes: TimelineLane[]\n undated: RoadmapItem[]\n}\n\nexport function buildTimeline(items: RoadmapItem[], today: string): Timeline {\n const dues = items.map((i) => i.due).filter((d): d is string => !!d)\n const first = ymd([today, ...dues].sort()[0])\n const last = ymd([today, ...dues].sort().at(-1) ?? today)\n\n // pad one month each side, then stretch to a readable minimum\n const start = { y: first.y, m: first.m - 1 }\n const span = Math.max(MIN_MONTHS, (last.y - first.y) * 12 + (last.m - first.m) + 3)\n const months = Array.from({ length: span }, (_, i) => {\n const t = start.y * 12 + (start.m - 1) + i\n const y = Math.floor(t / 12)\n const m = (t % 12) + 1\n return { y, m, label: m === 1 || i === 0 ? `${MONTHS[m - 1]} ${y}` : MONTHS[m - 1], x: i * MONTH_W }\n })\n\n const xOf = (d: string) => {\n const { y, m, day } = ymd(d)\n const idx = (y - months[0].y) * 12 + (m - months[0].m)\n return idx * MONTH_W + ((day - 0.5) / daysIn(y, m)) * MONTH_W\n }\n\n const lanes = spineItems(items).map((h) => {\n const dated = [h, ...(h.parent === null ? childrenOf(items, h.id) : [])].filter((i) => i.due)\n const rowEnds: number[] = []\n const markers = dated\n .map((item) => ({ item, x: xOf(item.due as string), horizon: item.id === h.id }))\n .sort((a, b) => a.x - b.x)\n .map((mk) => {\n // greedy: first row whose last label ends before this marker\n let row = rowEnds.findIndex((end) => mk.x >= end)\n if (row === -1) row = rowEnds.push(0) - 1\n rowEnds[row] = mk.x + LABEL_W\n return { ...mk, row, state: dueState(mk.item.due, mk.item.status, today) }\n })\n return { item: h, rows: Math.max(1, rowEnds.length), markers }\n })\n\n return {\n months: months.map(({ label, x }) => ({ label, x })),\n width: span * MONTH_W,\n todayX: xOf(today),\n lanes,\n undated: items.filter((i) => !i.due && i.status !== \"done\"), // shipped work needs no date\n }\n}\n"],"names":["AGENT_LABEL","running","review","AgentMark","attach","className","agent","show","label","status","type","onClick","e","stopPropagation","chatId","title","AgentDot","SIDES","Top","Right","Bottom","Left","Handles","map","p","id","position","isConnectable","STATUS_LABEL","paused","done","planned","StatusDot","StatusPill","TASK_STATUS_BG","blocked","todo","cancelled","SegmentedProgress","statuses","length","filter","s","i","ProgressRing","value","total","r","c","Math","PI","pct","viewBox","cx","cy","fill","strokeWidth","stroke","strokeLinecap","strokeDasharray","strokeDashoffset","round","Progress","progress","style","width","DueChip","due","state","DueNote","data","taskDue","overdue","item","dueState","next","taskDueSoon","DriftMark","drift","join","HorizonNode","selected","epics","chapter","String","padStart","FeatureNode","taskStatuses","nextTaskId","kind","drifting","ring","live","tasks","nodeTypes","horizon","feature","SOON_DAYS","localToday","now","Date","n","getFullYear","getMonth","getDate","daysBetween","from","to","utc","d","UTC","slice","today","expectedStatus","states","every","some","taskDueSummary","taskIds","dues","t","upcoming","sort","atRiskReasons","linked","reasons","push","started","includes","roadmapHealth","items","message","horizonIds","Set","parent","missing","risks","expected","open","suggestedStatus","h","has","kids","k","reduce","sum"],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
module.exports=[712125,544428,a=>{"use strict";var b=a.i(662145),c=a.i(174897),d=a.i(913975),e=a.i(498053),f=a.i(256857);let g={name:"arrow-up-right",size:24,node:[["path",{d:"M7 7h10v10",key:"1tivn9"}],["path",{d:"M7 17 17 7",key:"1vkiza"}]]};g.node;let h=(0,f.default)(g);a.s(["ArrowUpRight",0,h],544428);let i={name:"maximize-2",size:24,node:[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"m21 3-7 7",key:"1l2asr"}],["path",{d:"m3 21 7-7",key:"tjx5ai"}],["path",{d:"M9 21H3v-6",key:"wtvkvv"}]]};i.node;let j=(0,f.default)(i),k={name:"square",size:24,node:[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}]]};k.node;let l=(0,f.default)(k);var m=a.i(28386),n=a.i(544394),o=a.i(685698),p=a.i(149350),q=a.i(368114),r=a.i(107742);function s({proposal:a,onResolve:d}){let{rootParam:e,openDoc:f}=(0,n.useApp)(),[g,h]=(0,c.useState)(null),[i,j]=(0,c.useState)(null),[k,l]=(0,c.useState)(!1);(0,c.useEffect)(()=>{fetch(`/api/docs${e}&read=${encodeURIComponent(a.path)}`).then(a=>a.ok?a.json():null).then(b=>h(b?.path===a.path.replace(/^\.\//,"")&&"string"==typeof b.content?b.content:"")).catch(()=>h(""))},[a.path,e]);let m=(0,c.useMemo)(()=>null===g?null:function(a,b){let c=a;for(let[a,d]of b.entries()){if("string"!=typeof d?.old_string||"string"!=typeof d?.new_string)return{error:`Edit ${a+1}: old_string and new_string must be strings`};if(""===d.old_string){if(""!==c)return{error:`Edit ${a+1}: empty old_string is only allowed for a new, empty doc`};c=d.new_string;continue}let b=c.indexOf(d.old_string);if(-1===b)return{error:`Edit ${a+1}: old_string not found in the doc`};if(-1!==c.indexOf(d.old_string,b+1))return{error:`Edit ${a+1}: old_string matches more than once; include more surrounding text`};c=c.slice(0,b)+d.new_string+c.slice(b+d.old_string.length)}return{content:c}}(g,a.edits),[g,a.edits]),o=null!==m&&"error"in m?m.error:null,p=(0,c.useMemo)(()=>{var a;let b,c;return null===g||!m||"error"in m?[]:(b=(a=function(a,b){let c=a.split("\n"),d=b.split("\n"),e=0;for(;e<c.length&&e<d.length&&c[e]===d[e];)e++;let f=c.length,g=d.length;for(;f>e&&g>e&&c[f-1]===d[g-1];)f--,g--;let h=c.slice(e,f),i=d.slice(e,g),j=Array.from({length:h.length+1},()=>Array(i.length+1).fill(0));for(let a=h.length-1;a>=0;a--)for(let b=i.length-1;b>=0;b--)j[a][b]=h[a]===i[b]?j[a+1][b+1]+1:Math.max(j[a+1][b],j[a][b+1]);let k=[],l=0,m=0;for(;l<h.length||m<i.length;)l<h.length&&m<i.length&&h[l]===i[m]?(k.push({op:" ",text:h[l]}),l++,m++):l<h.length&&(m===i.length||j[l+1][m]>=j[l][m+1])?(k.push({op:"-",text:h[l]}),l++):(k.push({op:"+",text:i[m]}),m++);return[...c.slice(0,e).map(a=>({op:" ",text:a})),...k,...c.slice(f).map(a=>({op:" ",text:a}))]}(g,m.content)).map(()=>!1),a.forEach((c,d)=>{if(" "!==c.op)for(let c=Math.max(0,d-2);c<=Math.min(a.length-1,d+2);c++)b[c]=!0}),c=[],a.forEach((a,d)=>{b[d]?c.push(a):"number"==typeof c[c.length-1]?c[c.length-1]=c[c.length-1]+1:c.push(1)}),c)},[g,m]),r=p.filter(a=>"number"!=typeof a&&"+"===a.op).length,t=p.filter(a=>"number"!=typeof a&&"-"===a.op).length;async function u(){l(!0),j(null);try{let b=await fetch(`/api/docs${e}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:a.path,edits:a.edits,actor:"ai"})});if(!b.ok)throw Error((await b.json().catch(()=>null))?.error??"Save failed");d("accepted")}catch(a){j(a.message)}finally{l(!1)}}return(0,b.jsxs)("div",{className:"my-2 rounded-md border border-border overflow-hidden",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2 px-2 py-1.5 bg-surface2 border-b border-border",children:[(0,b.jsx)("button",{onClick:()=>f(a.path),className:"text-xs font-mono text-accent truncate hover:underline",title:a.path,children:a.path}),(0,b.jsxs)("span",{className:"text-[10px] font-mono text-teal-400",children:["+",r]}),(0,b.jsxs)("span",{className:"text-[10px] font-mono text-red-400",children:["-",t]})]}),a.summary&&(0,b.jsx)("div",{className:"px-2 py-1 text-xs text-muted border-b border-border",children:a.summary}),(0,b.jsxs)("div",{className:"max-h-72 overflow-auto text-[11px] font-mono leading-5",children:[null===g&&(0,b.jsx)("div",{className:"px-2 py-1 text-muted",children:"Loading diff…"}),o&&(0,b.jsxs)("div",{className:"px-2 py-1 text-red-400",children:["Doc changed since this proposal (",o,"). Ask the agent to propose again."]}),null!==g&&!o&&0===p.length&&(0,b.jsx)("div",{className:"px-2 py-1 text-muted",children:"No changes"}),p.map((a,c)=>"number"==typeof a?(0,b.jsxs)("div",{className:"px-2 text-muted bg-surface2/50",children:["⋯ ",a," unchanged line",a>1?"s":""]},c):(0,b.jsxs)("div",{className:(0,q.cn)("px-2 whitespace-pre-wrap break-words","+"===a.op&&"bg-teal-500/10 text-teal-300","-"===a.op&&"bg-red-500/10 text-red-300 line-through decoration-red-400/40"),children:[a.op," ",a.text||" "]},c))]}),(0,b.jsxs)("div",{className:"flex items-center gap-2 px-2 py-1.5 border-t border-border",children:["pending"===a.status?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("button",{onClick:u,disabled:k||null===g||!!o,className:"text-xs px-2 py-0.5 rounded-sm bg-accent/20 text-accent hover:bg-accent/30 disabled:opacity-50",children:k?"Applying…":"Accept"}),(0,b.jsx)("button",{onClick:()=>d("rejected"),disabled:k,className:"text-xs px-2 py-0.5 rounded-sm text-muted hover:text-txt",children:"Reject"})]}):(0,b.jsx)("span",{className:(0,q.cn)("text-xs","accepted"===a.status?"text-teal-400":"text-muted"),children:"accepted"===a.status?"✓ Applied":"Rejected"}),i&&(0,b.jsx)("span",{className:"text-xs text-red-400 truncate",children:i})]})]})}function t({proposal:a,onResolve:d}){let{rootParam:e,openDoc:f}=(0,n.useApp)(),g=a.plan,h="breakdown"===g.kind?g.tasks:[],i="roadmap"===g.kind?g.horizons??[]:[],j="roadmap"===g.kind?g.epics??[]:[],k="breakdown"===g.kind?(g.epic??"").trim().toUpperCase():"",l="breakdown"===g.kind?g.newEpic:void 0,[m,o]=(0,c.useState)(new Map),[p,q]=(0,c.useState)(new Set),[r,s]=(0,c.useState)(null),[v,w]=(0,c.useState)(null),[x,y]=(0,c.useState)(!1);(0,c.useEffect)(()=>{fetch(`/api/roadmap${e}`).then(a=>a.ok?a.json():null).then(a=>o(new Map((a?.items??[]).map(a=>[a.id,a.title])))).catch(()=>o(new Map))},[e]);let z=("breakdown"===g.kind?h.map(a=>a.key):[...i,...j].map(a=>a.key)).filter(a=>!p.has(a)),A="pending"===a.status,B=new Set(i.map(a=>a.key)),C=(a,c,d,e,f=!1)=>(0,b.jsx)(u,{rowKey:a,title:c,meta:d,body:e,indent:f,checked:!p.has(a),disabled:!A||x,onToggle:()=>{w(null),q(b=>{let c=new Set(b),d=c.has(a);for(let b of B.has(a)?[a,...j.filter(b=>b.parent.trim()===a).map(a=>a.key)]:[a])d?c.delete(b):c.add(b);let e=j.find(b=>b.key===a)?.parent.trim();return d&&e&&B.has(e)&&c.delete(e),c})},open:r===a,onOpen:()=>s(r===a?null:a)},a),D=a=>a.trim().split("\n")[0]??"",E=[...new Set(j.map(a=>a.parent.trim()).filter(a=>!B.has(a)))];async function F(){y(!0),w(null);try{let a=await fetch(`/api/plan/apply${e}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({plan:g,selected:z})}),b=await a.json().catch(()=>null);if(!a.ok)throw Error(b?.error??`Apply failed (${a.status})`);d("accepted",b?.created??[],[...p])}catch(a){w(a.message)}finally{y(!1)}}return(0,b.jsxs)("div",{className:"my-2 rounded-md border border-border overflow-hidden",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2 px-2 py-1.5 bg-surface2 border-b border-border",children:[(0,b.jsx)("span",{className:"text-[10px] font-mono uppercase tracking-widest text-muted",children:"Plan"}),"breakdown"===g.kind?(0,b.jsxs)(b.Fragment,{children:[k?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("span",{className:"text-xs font-mono text-accent",children:k}),(0,b.jsx)("span",{className:"text-xs text-txt truncate",children:m.get(k)??""})]}):l?(0,b.jsxs)("span",{className:"text-xs text-txt truncate",children:["New epic: ",l.title,(0,b.jsxs)("span",{className:"text-muted",children:[" (under ",l.parent.trim().toUpperCase()," ",m.get(l.parent.trim().toUpperCase())??"",")"]})]}):(0,b.jsx)("span",{className:"text-xs text-muted",children:"No epic"}),(0,b.jsxs)("span",{className:"ml-auto text-[10px] font-mono text-muted",children:[h.length," tasks"]})]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("span",{className:"text-xs text-txt",children:"Roadmap"}),(0,b.jsxs)("span",{className:"ml-auto text-[10px] font-mono text-muted",children:[i.length?`${i.length} horizons \xb7 `:"",j.length," epics"]})]})]}),(0,b.jsxs)("ul",{className:"max-h-80 overflow-auto",children:[h.map(a=>C(a.key,a.title,[a.size,a.dependsOn?.length?`after ${a.dependsOn.join(", ")}`:null,a.due?`due ${a.due}`:null].filter(Boolean).join(" · "),a.body)),i.map(a=>[C(a.key,a.title,"new horizon",a.body),...j.filter(b=>b.parent.trim()===a.key).map(a=>C(a.key,a.title,D(a.body),a.body,!0))]),E.map(a=>[(0,b.jsxs)("li",{className:"px-2 py-1.5 border-b border-border text-xs text-muted",children:[(0,b.jsx)("span",{className:"font-mono text-accent mr-1",children:a.toUpperCase()}),m.get(a.toUpperCase())??""]},`parent-${a}`),...j.filter(b=>b.parent.trim()===a).map(a=>C(a.key,a.title,D(a.body),a.body,!0))])]}),v&&(0,b.jsx)("div",{className:"px-2 py-1 text-xs text-red-400 whitespace-pre-wrap border-t border-border",children:v}),(0,b.jsx)("div",{className:"flex items-center gap-2 px-2 py-1.5 border-t border-border",children:A?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("button",{onClick:F,disabled:x||0===z.length,className:"text-xs px-2 py-0.5 rounded-sm bg-accent/20 text-accent hover:bg-accent/30 disabled:opacity-50",children:x?"Creating…":`Accept (${z.length})`}),(0,b.jsx)("button",{onClick:()=>d("rejected",[],[]),disabled:x,className:"text-xs px-2 py-0.5 rounded-sm text-muted hover:text-txt",children:"Reject"})]}):"accepted"===a.status?(0,b.jsxs)("span",{className:"text-xs text-teal-400",children:["✓ Created"," ",(a.created??[]).map((a,c)=>(0,b.jsxs)("span",{children:[c>0&&", ",(0,b.jsx)("button",{onClick:()=>f(a.file),className:"font-mono hover:underline",children:a.id})]},a.id))]}):(0,b.jsx)("span",{className:"text-xs text-muted",children:"Rejected"})})]})}function u({rowKey:a,title:c,meta:d,body:e,indent:f,checked:g,disabled:h,onToggle:i,open:j,onOpen:k}){return(0,b.jsxs)("li",{"data-plan-row":a,className:"border-b border-border last:border-b-0",children:[(0,b.jsxs)("div",{className:(0,q.cn)("flex items-start gap-2 px-2 py-1.5",f&&"pl-6"),children:[(0,b.jsx)("input",{type:"checkbox","aria-label":`Include ${c}`,checked:g,disabled:h,onChange:i,className:"mt-0.5 accent-accent"}),(0,b.jsxs)("button",{onClick:k,className:"flex-1 min-w-0 text-left",children:[(0,b.jsxs)("div",{className:(0,q.cn)("text-xs text-txt",!g&&"line-through text-muted"),children:[(0,b.jsx)("span",{className:"font-mono text-muted mr-1",children:a}),c]}),d&&(0,b.jsx)("div",{className:"text-[10px] font-mono text-muted truncate",children:d})]})]}),j&&e&&(0,b.jsx)("div",{className:"px-3 pb-2 border-t border-border bg-surface2/40",children:(0,b.jsx)(p.MarkdownRenderer,{content:e,className:"text-xs"})})]})}var v=a.i(429672),w=a.i(598984);let x="grid size-8 shrink-0 place-items-center rounded-md text-muted transition-colors duration-(--duration-fast) hover:bg-surface2 hover:text-txt";function y({chat:a,hidden:d,wide:e}){let{send:f,resolveProposal:g,resolvePlan:h,answerQuestions:i}=(0,o.useChats)(),j=(0,c.useRef)(null),k=a.messages;return(0,c.useEffect)(()=>{let a=j.current;a&&!d&&(a.scrollTop=a.scrollHeight)},[k,d]),(0,b.jsx)("div",{ref:j,hidden:d,role:"log","aria-live":"polite",className:"min-h-0 flex-1 overflow-y-auto",children:(0,b.jsxs)("div",{className:(0,q.cn)("mx-auto flex flex-col gap-5 px-5 py-6 text-sm",e?"max-w-3xl":"max-w-none"),children:[0===k.length&&(0,b.jsx)(B,{chat:a,onPick:b=>f(a.id,b)}),k.map((c,d)=>(0,b.jsx)(z,{m:c,thinking:a.busy&&d===k.length-1,busy:a.busy,onProposal:(b,c,d)=>g(a.id,b,c,d),onPlan:(b,c,d,e)=>h(a.id,b,c,d,e),onAnswers:(b,c)=>i(a.id,b,c)},d))]})})}function z({m:a,thinking:c,busy:d,onProposal:e,onPlan:f,onAnswers:g}){return"user"===a.role?(0,b.jsx)("div",{className:"flex justify-end animate-fade-in",children:(0,b.jsx)("div",{className:"max-w-[85%] whitespace-pre-wrap rounded-2xl rounded-br-md border border-accent/20 bg-accent/10 px-3.5 py-2 text-txt",children:a.text})}):(0,b.jsxs)("div",{className:"flex gap-3 animate-fade-in",children:[(0,b.jsx)("div",{className:"mt-0.5 grid size-6 shrink-0 place-items-center rounded-md bg-linear-to-br from-accent to-teal text-[10px] text-white","aria-hidden":!0,children:"⬡"}),(0,b.jsxs)("div",{className:"min-w-0 flex-1 space-y-2",children:[a.tools.length>0&&(0,b.jsx)("div",{className:"flex flex-wrap gap-1",children:a.tools.map((a,c)=>(0,b.jsx)("span",{className:"rounded-sm border border-border bg-surface2 px-1.5 py-0.5 font-mono text-[10px] text-muted animate-slide-in",children:a},c))}),a.proposals.map(a=>(0,b.jsx)(s,{proposal:a,onResolve:b=>e(a.id,a.path,b)},a.id)),a.plans.map(a=>(0,b.jsx)(t,{proposal:a,onResolve:(b,c,d)=>f(a,b,c,d)},a.id)),a.questions.map(a=>(0,b.jsx)(v.QuestionCard,{set:a,disabled:d,onSubmit:b=>g(a,b)},a.id)),a.text&&(0,b.jsx)(p.MarkdownRenderer,{content:a.text,className:"text-sm"}),c&&!a.text&&!a.error&&(0,b.jsx)(A,{}),a.error&&(0,b.jsx)("p",{className:"whitespace-pre-wrap text-xs text-danger",children:a.error})]})]})}function A(){return(0,b.jsxs)("span",{className:"inline-flex items-center gap-2 text-xs text-muted",children:[(0,b.jsx)("span",{className:"inline-flex gap-1","aria-hidden":!0,children:[0,150,300].map(a=>(0,b.jsx)("span",{className:"size-1.5 rounded-full bg-accent animate-pulse-dot",style:{animationDelay:`${a}ms`}},a))}),"Thinking…"]})}function B({chat:a,onPick:c}){let d=a.attach;return(0,b.jsxs)("div",{className:"flex flex-col items-start gap-4 py-6 animate-fade-in",children:[(0,b.jsx)("div",{className:"grid size-9 place-items-center rounded-lg bg-linear-to-br from-accent to-teal text-sm text-white","aria-hidden":!0,children:"⬡"}),(0,b.jsxs)("div",{children:[(0,b.jsx)("h3",{className:"text-lg font-semibold text-txt",children:d?`Ask about ${d.id}`:"Ask the agent"}),(0,b.jsx)("p",{className:"mt-1 max-w-md text-sm text-muted",children:d?`The agent reads ${"epic"===d.kind?"the epic and its tasks":"the task"} first. It proposes changes; nothing is written until you accept.`:"It reads your docs, tasks and roadmap and proposes edits you review. Runs on your local Claude Code login."})]}),(0,b.jsx)("div",{className:"flex flex-col gap-1.5",children:(0,r.suggestions)(d).map((a,d)=>(0,b.jsxs)("button",{type:"button",onClick:()=>c(a),style:{animationDelay:`${60*d}ms`},className:"group flex items-center gap-2 rounded-lg border border-border px-3 py-2 text-left text-sm text-txt/90 transition-colors duration-(--duration-fast) animate-slide-in [animation-fill-mode:both] hover:border-accent/50 hover:bg-accent/5",children:[(0,b.jsx)(h,{className:"size-3.5 text-muted transition-transform duration-(--duration-fast) group-hover:-translate-y-px group-hover:translate-x-px group-hover:text-accent"}),a]},a))})]})}function C({chat:a,wide:f}){let{send:g,stop:h,queue:i}=(0,o.useChats)(),{selectedDoc:j}=(0,n.useApp)(),k=(0,d.usePathname)(),[m,p]=(0,c.useState)(""),r="/docs"===k?j?.path:void 0,s=a.messages[a.messages.length-1],t=!!s?.questions.some(a=>!a.answers),u=Math.min(8,Math.max(1,m.split("\n").length));function v(){m.trim()&&!a.busy&&(g(a.id,m),p(""))}return(0,b.jsx)("div",{className:"shrink-0 px-5 pb-4 pt-1",children:(0,b.jsxs)("div",{className:(0,q.cn)("mx-auto rounded-xl border border-border bg-surface2 transition-[border-color,box-shadow] duration-(--duration-base) focus-within:border-accent/60 focus-within:shadow-[0_0_0_3px_rgb(var(--rgb-accent)/0.12)]",f?"max-w-3xl":"max-w-none"),children:[(0,b.jsx)("textarea",{autoFocus:!i.some(b=>b.id===a.id),value:m,onChange:a=>p(a.target.value),onKeyDown:a=>{"Enter"!==a.key||a.shiftKey||a.nativeEvent.isComposing||(a.preventDefault(),v())},rows:u,placeholder:a.busy?"Agent is working…":t?"Answer the questions above…":"Ask the agent… (Enter to send)",className:"block w-full resize-none bg-transparent px-3.5 pt-3 text-sm text-txt placeholder:text-muted focus:outline-hidden"}),(0,b.jsxs)("div",{className:"flex items-center gap-2 px-2.5 pb-2 pt-1",children:[(0,b.jsx)("span",{className:"min-w-0 flex-1 truncate font-mono text-[10px] text-muted",children:r?`@ ${r}`:"Shift+Enter for a new line"}),a.busy?(0,b.jsxs)("button",{type:"button",onClick:()=>h(a.id),title:"Stop the agent",className:"grid size-7 place-items-center rounded-full border border-border text-muted transition-colors hover:text-txt",children:[(0,b.jsx)(l,{className:"size-3 fill-current"}),(0,b.jsx)("span",{className:"sr-only",children:"Stop"})]}):(0,b.jsxs)("button",{type:"button",onClick:v,disabled:!m.trim(),title:"Send (Enter)",className:"grid size-7 place-items-center rounded-full bg-accent text-accent-fg transition-[opacity,transform] duration-(--duration-fast) enabled:hover:scale-105 disabled:opacity-30",children:[(0,b.jsx)(e.ArrowUp,{className:"size-3.5"}),(0,b.jsx)("span",{className:"sr-only",children:"Send"})]})]})]})})}a.s(["ChatView",0,function({chatId:a,variant:e,onExpand:f,onNavigate:g}){let{chats:h,stop:i,remove:k,notice:n,dismissNotice:p}=(0,o.useChats)(),s=(0,d.useRouter)(),t=h.find(b=>b.id===a),[u,v]=(0,c.useState)([a]);if(u.includes(a)||v([...u,a]),!t)return(0,b.jsx)("div",{className:"grid h-full place-items-center p-8 text-sm text-muted",children:"This chat was closed."});let z=(0,r.chatStatus)(t);return(0,b.jsxs)("section",{"aria-label":`Chat: ${t.title}`,className:"flex h-full min-h-0 flex-col",children:[(0,b.jsxs)("header",{className:(0,q.cn)("flex h-14 shrink-0 items-center gap-3 border-b border-border px-5","modal"===e&&"pr-14"),children:[(0,b.jsx)(w.StatusMarker,{status:z,showIdle:!0}),(0,b.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,b.jsx)("h2",{className:"truncate text-sm font-medium text-txt",children:t.title}),(0,b.jsx)("p",{className:"font-mono text-[10px] text-muted",children:r.STATUS_LABEL[z]})]}),t.attach&&(0,b.jsx)("button",{type:"button",onClick:()=>{var a;return t.attach&&(a=(0,w.attachHref)(t.attach),void(g?.(),s.push(a)))},title:`Open ${t.attach.id} in the ${"epic"===t.attach.kind?"roadmap":"board"}`,className:"rounded-full border border-border px-2 py-1 text-muted transition-colors duration-(--duration-fast) hover:border-accent/50 hover:text-accent",children:(0,b.jsx)(w.AttachLabel,{attach:t.attach})}),t.busy&&(0,b.jsxs)("button",{type:"button",onClick:()=>i(t.id),title:"Stop the agent",className:x,children:[(0,b.jsx)(l,{className:"size-3.5 fill-current"}),(0,b.jsx)("span",{className:"sr-only",children:"Stop"})]}),"modal"===e&&f&&(0,b.jsxs)("button",{type:"button",onClick:f,title:"Open as page",className:x,children:[(0,b.jsx)(j,{className:"size-3.5"}),(0,b.jsx)("span",{className:"sr-only",children:"Open as page"})]}),"page"===e&&(0,b.jsx)("button",{type:"button",onClick:()=>k(t.id),"aria-label":`Delete ${t.title}`,title:"Delete chat",className:(0,q.cn)(x,"hover:text-danger"),children:(0,b.jsx)(m.Trash2,{className:"size-3.5"})})]}),u.map(c=>{let d=h.find(a=>a.id===c);return d?(0,b.jsx)(y,{chat:d,hidden:c!==a,wide:"page"===e},c):null}),n&&(0,b.jsxs)("div",{role:"status",className:"mx-5 mb-2 flex items-start gap-2 rounded-md border border-amber/30 bg-amber/10 px-3 py-2 text-xs text-amber animate-fade-in",children:[(0,b.jsx)("span",{className:"flex-1",children:n}),(0,b.jsx)("button",{onClick:p,"aria-label":"Dismiss",className:"leading-none text-muted hover:text-txt",children:"×"})]}),(0,b.jsx)(C,{chat:t,wide:"page"===e},t.id)]})}],712125)}];
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=src_components_chat_ChatView_tsx_0h5j-e2._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/chat/ChatView.tsx","../../../../src/components/chat/ProposalCard.tsx","../../../../src/components/chat/PlanCard.tsx","../../../../src/lib/diff.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/square.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/maximize-2.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/arrow-up-right.ts"],"sourcesContent":["\"use client\"\n\nimport { useEffect, useRef, useState } from \"react\"\nimport { usePathname, useRouter } from \"next/navigation\"\nimport { ArrowUp, ArrowUpRight, Maximize2, Square, Trash2 } from \"lucide-react\"\nimport { useApp } from \"@/context/AppContext\"\nimport { useChats, type ChatMessage, type ChatTab } from \"@/context/ChatContext\"\nimport { MarkdownRenderer } from \"@/components/docs/MarkdownRenderer\"\nimport { cn } from \"@/lib/utils\"\nimport { STATUS_LABEL, chatStatus, suggestions } from \"@/lib/chats\"\nimport { ProposalCard, type ProposalStatus } from \"./ProposalCard\"\nimport { PlanCard, type PlanCreated, type PlanProposal, type PlanStatus } from \"./PlanCard\"\nimport { QuestionCard, type QuestionSet } from \"./QuestionCard\"\nimport { AttachLabel, StatusMarker, attachHref } from \"./StatusMarker\"\n\n/**\n * One conversation. The chat modal and the /chat page both render this, so they are the same chat UI.\n * Chats shown here before stay mounted (hidden) so card state, e.g. unchecked plan rows, survives switching.\n */\nexport function ChatView({ chatId, variant, onExpand, onNavigate }: {\n chatId: string\n variant: \"modal\" | \"page\"\n /** Modal: open this chat as a page */\n onExpand?: () => void\n /** Called before following a link out of the chat (the modal closes itself) */\n onNavigate?: () => void\n}) {\n const { chats, stop, remove, notice, dismissNotice } = useChats()\n const router = useRouter()\n const chat = chats.find((c) => c.id === chatId)\n // Adjust-state-during-render: remember every chat this view has shown\n const [mounted, setMounted] = useState<string[]>([chatId])\n if (!mounted.includes(chatId)) setMounted([...mounted, chatId])\n\n if (!chat) {\n return <div className=\"grid h-full place-items-center p-8 text-sm text-muted\">This chat was closed.</div>\n }\n\n const status = chatStatus(chat)\n const go = (href: string) => { onNavigate?.(); router.push(href) }\n\n return (\n <section aria-label={`Chat: ${chat.title}`} className=\"flex h-full min-h-0 flex-col\">\n <header className={cn(\"flex h-14 shrink-0 items-center gap-3 border-b border-border px-5\", variant === \"modal\" && \"pr-14\")}>\n <StatusMarker status={status} showIdle />\n <div className=\"min-w-0 flex-1\">\n <h2 className=\"truncate text-sm font-medium text-txt\">{chat.title}</h2>\n <p className=\"font-mono text-[10px] text-muted\">{STATUS_LABEL[status]}</p>\n </div>\n {chat.attach && (\n <button\n type=\"button\"\n onClick={() => chat.attach && go(attachHref(chat.attach))}\n title={`Open ${chat.attach.id} in the ${chat.attach.kind === \"epic\" ? \"roadmap\" : \"board\"}`}\n className=\"rounded-full border border-border px-2 py-1 text-muted transition-colors duration-(--duration-fast) hover:border-accent/50 hover:text-accent\"\n >\n <AttachLabel attach={chat.attach} />\n </button>\n )}\n {chat.busy && (\n <button type=\"button\" onClick={() => stop(chat.id)} title=\"Stop the agent\" className={ICON_BTN}>\n <Square className=\"size-3.5 fill-current\" />\n <span className=\"sr-only\">Stop</span>\n </button>\n )}\n {variant === \"modal\" && onExpand && (\n <button type=\"button\" onClick={onExpand} title=\"Open as page\" className={ICON_BTN}>\n <Maximize2 className=\"size-3.5\" />\n <span className=\"sr-only\">Open as page</span>\n </button>\n )}\n {variant === \"page\" && (\n <button type=\"button\" onClick={() => remove(chat.id)} aria-label={`Delete ${chat.title}`} title=\"Delete chat\" className={cn(ICON_BTN, \"hover:text-danger\")}>\n <Trash2 className=\"size-3.5\" />\n </button>\n )}\n </header>\n\n {mounted.map((id) => {\n const c = chats.find((x) => x.id === id)\n return c ? <Conversation key={id} chat={c} hidden={id !== chatId} wide={variant === \"page\"} /> : null\n })}\n\n {notice && (\n <div role=\"status\" className=\"mx-5 mb-2 flex items-start gap-2 rounded-md border border-amber/30 bg-amber/10 px-3 py-2 text-xs text-amber animate-fade-in\">\n <span className=\"flex-1\">{notice}</span>\n <button onClick={dismissNotice} aria-label=\"Dismiss\" className=\"leading-none text-muted hover:text-txt\">×</button>\n </div>\n )}\n <Composer key={chat.id} chat={chat} wide={variant === \"page\"} />\n </section>\n )\n}\n\nconst ICON_BTN = \"grid size-8 shrink-0 place-items-center rounded-md text-muted transition-colors duration-(--duration-fast) hover:bg-surface2 hover:text-txt\"\n\nfunction Conversation({ chat, hidden, wide }: { chat: ChatTab; hidden: boolean; wide: boolean }) {\n const { send, resolveProposal, resolvePlan, answerQuestions } = useChats()\n const scrollRef = useRef<HTMLDivElement>(null)\n const messages = chat.messages\n\n // Follow the stream while visible\n useEffect(() => {\n const el = scrollRef.current\n if (el && !hidden) el.scrollTop = el.scrollHeight\n }, [messages, hidden])\n\n return (\n <div ref={scrollRef} hidden={hidden} role=\"log\" aria-live=\"polite\" className=\"min-h-0 flex-1 overflow-y-auto\">\n <div className={cn(\"mx-auto flex flex-col gap-5 px-5 py-6 text-sm\", wide ? \"max-w-3xl\" : \"max-w-none\")}>\n {messages.length === 0 && <EmptyChat chat={chat} onPick={(s) => send(chat.id, s)} />}\n {messages.map((m, i) => (\n <Message\n key={i}\n m={m}\n thinking={chat.busy && i === messages.length - 1}\n busy={chat.busy}\n onProposal={(id, path, status) => resolveProposal(chat.id, id, path, status)}\n onPlan={(p, status, created, unchecked) => resolvePlan(chat.id, p, status, created, unchecked)}\n onAnswers={(set, answers) => answerQuestions(chat.id, set, answers)}\n />\n ))}\n </div>\n </div>\n )\n}\n\nfunction Message({ m, thinking, busy, onProposal, onPlan, onAnswers }: {\n m: ChatMessage\n thinking: boolean\n busy: boolean\n onProposal: (id: string, path: string, status: ProposalStatus) => void\n onPlan: (p: PlanProposal, status: PlanStatus, created: PlanCreated[], unchecked: string[]) => void\n onAnswers: (set: QuestionSet, answers: string[]) => void\n}) {\n if (m.role === \"user\") {\n return (\n <div className=\"flex justify-end animate-fade-in\">\n <div className=\"max-w-[85%] whitespace-pre-wrap rounded-2xl rounded-br-md border border-accent/20 bg-accent/10 px-3.5 py-2 text-txt\">\n {m.text}\n </div>\n </div>\n )\n }\n return (\n <div className=\"flex gap-3 animate-fade-in\">\n <div className=\"mt-0.5 grid size-6 shrink-0 place-items-center rounded-md bg-linear-to-br from-accent to-teal text-[10px] text-white\" aria-hidden>⬡</div>\n <div className=\"min-w-0 flex-1 space-y-2\">\n {m.tools.length > 0 && (\n <div className=\"flex flex-wrap gap-1\">\n {m.tools.map((t, j) => (\n <span key={j} className=\"rounded-sm border border-border bg-surface2 px-1.5 py-0.5 font-mono text-[10px] text-muted animate-slide-in\">{t}</span>\n ))}\n </div>\n )}\n {m.proposals.map((p) => (\n <ProposalCard key={p.id} proposal={p} onResolve={(status) => onProposal(p.id, p.path, status)} />\n ))}\n {m.plans.map((p) => (\n <PlanCard key={p.id} proposal={p} onResolve={(status, created, unchecked) => onPlan(p, status, created, unchecked)} />\n ))}\n {m.questions.map((q) => (\n <QuestionCard key={q.id} set={q} disabled={busy} onSubmit={(answers) => onAnswers(q, answers)} />\n ))}\n {m.text && <MarkdownRenderer content={m.text} className=\"text-sm\" />}\n {thinking && !m.text && !m.error && <Thinking />}\n {m.error && <p className=\"whitespace-pre-wrap text-xs text-danger\">{m.error}</p>}\n </div>\n </div>\n )\n}\n\nfunction Thinking() {\n return (\n <span className=\"inline-flex items-center gap-2 text-xs text-muted\">\n <span className=\"inline-flex gap-1\" aria-hidden>\n {[0, 150, 300].map((d) => (\n <span key={d} className=\"size-1.5 rounded-full bg-accent animate-pulse-dot\" style={{ animationDelay: `${d}ms` }} />\n ))}\n </span>\n Thinking…\n </span>\n )\n}\n\nfunction EmptyChat({ chat, onPick }: { chat: ChatTab; onPick: (s: string) => void }) {\n const a = chat.attach\n return (\n <div className=\"flex flex-col items-start gap-4 py-6 animate-fade-in\">\n <div className=\"grid size-9 place-items-center rounded-lg bg-linear-to-br from-accent to-teal text-sm text-white\" aria-hidden>⬡</div>\n <div>\n <h3 className=\"text-lg font-semibold text-txt\">{a ? `Ask about ${a.id}` : \"Ask the agent\"}</h3>\n <p className=\"mt-1 max-w-md text-sm text-muted\">\n {a\n ? `The agent reads ${a.kind === \"epic\" ? \"the epic and its tasks\" : \"the task\"} first. It proposes changes; nothing is written until you accept.`\n : \"It reads your docs, tasks and roadmap and proposes edits you review. Runs on your local Claude Code login.\"}\n </p>\n </div>\n <div className=\"flex flex-col gap-1.5\">\n {suggestions(a).map((s, i) => (\n <button\n key={s}\n type=\"button\"\n onClick={() => onPick(s)}\n style={{ animationDelay: `${60 * i}ms` }}\n className=\"group flex items-center gap-2 rounded-lg border border-border px-3 py-2 text-left text-sm text-txt/90 transition-colors duration-(--duration-fast) animate-slide-in [animation-fill-mode:both] hover:border-accent/50 hover:bg-accent/5\"\n >\n <ArrowUpRight className=\"size-3.5 text-muted transition-transform duration-(--duration-fast) group-hover:-translate-y-px group-hover:translate-x-px group-hover:text-accent\" />\n {s}\n </button>\n ))}\n </div>\n </div>\n )\n}\n\nfunction Composer({ chat, wide }: { chat: ChatTab; wide: boolean }) {\n const { send, stop, queue } = useChats()\n const { selectedDoc } = useApp()\n const pathname = usePathname()\n const [input, setInput] = useState(\"\")\n const docPath = pathname === \"/docs\" ? selectedDoc?.path : undefined\n const last = chat.messages[chat.messages.length - 1]\n const questionsPending = !!last?.questions.some((q) => !q.answers)\n const rows = Math.min(8, Math.max(1, input.split(\"\\n\").length))\n\n function submit() {\n if (!input.trim() || chat.busy) return\n send(chat.id, input)\n setInput(\"\")\n }\n\n return (\n <div className=\"shrink-0 px-5 pb-4 pt-1\">\n <div className={cn(\"mx-auto rounded-xl border border-border bg-surface2 transition-[border-color,box-shadow] duration-(--duration-base) focus-within:border-accent/60 focus-within:shadow-[0_0_0_3px_rgb(var(--rgb-accent)/0.12)]\", wide ? \"max-w-3xl\" : \"max-w-none\")}>\n <textarea\n // Not for a queued chat, so a second `c` walks the queue instead of typing into the composer\n autoFocus={!queue.some((q) => q.id === chat.id)}\n value={input}\n onChange={(e) => setInput(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && !e.shiftKey && !e.nativeEvent.isComposing) {\n e.preventDefault()\n submit()\n }\n }}\n rows={rows}\n placeholder={chat.busy ? \"Agent is working…\" : questionsPending ? \"Answer the questions above…\" : \"Ask the agent… (Enter to send)\"}\n className=\"block w-full resize-none bg-transparent px-3.5 pt-3 text-sm text-txt placeholder:text-muted focus:outline-hidden\"\n />\n <div className=\"flex items-center gap-2 px-2.5 pb-2 pt-1\">\n <span className=\"min-w-0 flex-1 truncate font-mono text-[10px] text-muted\">\n {docPath ? `@ ${docPath}` : \"Shift+Enter for a new line\"}\n </span>\n {chat.busy ? (\n <button type=\"button\" onClick={() => stop(chat.id)} title=\"Stop the agent\" className=\"grid size-7 place-items-center rounded-full border border-border text-muted transition-colors hover:text-txt\">\n <Square className=\"size-3 fill-current\" />\n <span className=\"sr-only\">Stop</span>\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={submit}\n disabled={!input.trim()}\n title=\"Send (Enter)\"\n className=\"grid size-7 place-items-center rounded-full bg-accent text-accent-fg transition-[opacity,transform] duration-(--duration-fast) enabled:hover:scale-105 disabled:opacity-30\"\n >\n <ArrowUp className=\"size-3.5\" />\n <span className=\"sr-only\">Send</span>\n </button>\n )}\n </div>\n </div>\n </div>\n )\n}\n","\"use client\"\n\nimport { useEffect, useMemo, useState } from \"react\"\nimport { useApp } from \"@/context/AppContext\"\nimport { applyEdits, lineDiff, type DiffLine, type TextEdit } from \"@/lib/diff\"\nimport { cn } from \"@/lib/utils\"\n\nexport type ProposalStatus = \"pending\" | \"accepted\" | \"rejected\"\n\nexport interface Proposal {\n id: string\n path: string\n edits: TextEdit[]\n summary?: string\n status: ProposalStatus\n}\n\nconst CONTEXT = 2\n\n// Keep changed lines plus CONTEXT lines around them; collapse the rest into a count.\nfunction visibleHunks(lines: DiffLine[]): (DiffLine | number)[] {\n const keep = lines.map(() => false)\n lines.forEach((l, i) => {\n if (l.op === \" \") return\n for (let k = Math.max(0, i - CONTEXT); k <= Math.min(lines.length - 1, i + CONTEXT); k++) keep[k] = true\n })\n const out: (DiffLine | number)[] = []\n lines.forEach((l, i) => {\n if (keep[i]) out.push(l)\n else if (typeof out[out.length - 1] === \"number\") out[out.length - 1] = (out[out.length - 1] as number) + 1\n else out.push(1)\n })\n return out\n}\n\nexport function ProposalCard({ proposal, onResolve }: { proposal: Proposal; onResolve: (status: ProposalStatus) => void }) {\n const { rootParam, openDoc } = useApp()\n const [before, setBefore] = useState<string | null>(null)\n const [error, setError] = useState<string | null>(null)\n const [saving, setSaving] = useState(false)\n\n useEffect(() => {\n fetch(`/api/docs${rootParam}&read=${encodeURIComponent(proposal.path)}`)\n .then((r) => (r.ok ? r.json() : null))\n // readDoc falls back to fuzzy matching; a different path means this doc doesn't exist yet\n .then((d) => setBefore(d?.path === proposal.path.replace(/^\\.\\//, \"\") && typeof d.content === \"string\" ? d.content : \"\"))\n .catch(() => setBefore(\"\"))\n }, [proposal.path, rootParam])\n\n const applied = useMemo(() => (before === null ? null : applyEdits(before, proposal.edits)), [before, proposal.edits])\n const stale = applied !== null && \"error\" in applied ? applied.error : null\n const hunks = useMemo(\n () => (before === null || !applied || \"error\" in applied ? [] : visibleHunks(lineDiff(before, applied.content))),\n [before, applied],\n )\n const added = hunks.filter((h) => typeof h !== \"number\" && h.op === \"+\").length\n const removed = hunks.filter((h) => typeof h !== \"number\" && h.op === \"-\").length\n\n async function accept() {\n setSaving(true)\n setError(null)\n try {\n // Server re-applies the edits to the file as it is now, so unrelated changes since the proposal survive\n const res = await fetch(`/api/docs${rootParam}`, {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ path: proposal.path, edits: proposal.edits, actor: \"ai\" }),\n })\n if (!res.ok) throw new Error((await res.json().catch(() => null))?.error ?? \"Save failed\")\n onResolve(\"accepted\")\n } catch (e) {\n setError((e as Error).message)\n } finally {\n setSaving(false)\n }\n }\n\n return (\n <div className=\"my-2 rounded-md border border-border overflow-hidden\">\n <div className=\"flex items-center gap-2 px-2 py-1.5 bg-surface2 border-b border-border\">\n <button onClick={() => openDoc(proposal.path)} className=\"text-xs font-mono text-accent truncate hover:underline\" title={proposal.path}>\n {proposal.path}\n </button>\n <span className=\"text-[10px] font-mono text-teal-400\">+{added}</span>\n <span className=\"text-[10px] font-mono text-red-400\">-{removed}</span>\n </div>\n {proposal.summary && <div className=\"px-2 py-1 text-xs text-muted border-b border-border\">{proposal.summary}</div>}\n\n <div className=\"max-h-72 overflow-auto text-[11px] font-mono leading-5\">\n {before === null && <div className=\"px-2 py-1 text-muted\">Loading diff…</div>}\n {stale && <div className=\"px-2 py-1 text-red-400\">Doc changed since this proposal ({stale}). Ask the agent to propose again.</div>}\n {before !== null && !stale && hunks.length === 0 && <div className=\"px-2 py-1 text-muted\">No changes</div>}\n {hunks.map((h, i) =>\n typeof h === \"number\" ? (\n <div key={i} className=\"px-2 text-muted bg-surface2/50\">⋯ {h} unchanged line{h > 1 ? \"s\" : \"\"}</div>\n ) : (\n <div\n key={i}\n className={cn(\n \"px-2 whitespace-pre-wrap break-words\",\n h.op === \"+\" && \"bg-teal-500/10 text-teal-300\",\n h.op === \"-\" && \"bg-red-500/10 text-red-300 line-through decoration-red-400/40\",\n )}\n >\n {h.op}{\" \"}{h.text || \" \"}\n </div>\n ),\n )}\n </div>\n\n <div className=\"flex items-center gap-2 px-2 py-1.5 border-t border-border\">\n {proposal.status === \"pending\" ? (\n <>\n <button\n onClick={accept}\n disabled={saving || before === null || !!stale}\n className=\"text-xs px-2 py-0.5 rounded-sm bg-accent/20 text-accent hover:bg-accent/30 disabled:opacity-50\"\n >\n {saving ? \"Applying…\" : \"Accept\"}\n </button>\n <button onClick={() => onResolve(\"rejected\")} disabled={saving} className=\"text-xs px-2 py-0.5 rounded-sm text-muted hover:text-txt\">\n Reject\n </button>\n </>\n ) : (\n <span className={cn(\"text-xs\", proposal.status === \"accepted\" ? \"text-teal-400\" : \"text-muted\")}>\n {proposal.status === \"accepted\" ? \"✓ Applied\" : \"Rejected\"}\n </span>\n )}\n {error && <span className=\"text-xs text-red-400 truncate\">{error}</span>}\n </div>\n </div>\n )\n}\n","\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport { useApp } from \"@/context/AppContext\"\nimport { MarkdownRenderer } from \"@/components/docs/MarkdownRenderer\"\nimport { cn } from \"@/lib/utils\"\nimport type { Plan, PlanEpic, PlanTask } from \"@/lib/plan\"\n\nexport type PlanStatus = \"pending\" | \"accepted\" | \"rejected\"\nexport interface PlanCreated { key: string; id: string; file: string }\n\nexport interface PlanProposal {\n id: string\n plan: Plan\n status: PlanStatus\n created?: PlanCreated[]\n}\n\nexport function PlanCard({ proposal, onResolve }: {\n proposal: PlanProposal\n onResolve: (status: PlanStatus, created: PlanCreated[], unchecked: string[]) => void\n}) {\n const { rootParam, openDoc } = useApp()\n const plan = proposal.plan\n const tasks: PlanTask[] = plan.kind === \"breakdown\" ? plan.tasks : []\n const horizons = plan.kind === \"roadmap\" ? plan.horizons ?? [] : []\n const epics: PlanEpic[] = plan.kind === \"roadmap\" ? plan.epics ?? [] : []\n const epicId = plan.kind === \"breakdown\" ? (plan.epic ?? \"\").trim().toUpperCase() : \"\"\n const newEpic = plan.kind === \"breakdown\" ? plan.newEpic : undefined\n const [titles, setTitles] = useState<Map<string, string>>(new Map())\n const [unchecked, setUnchecked] = useState<Set<string>>(new Set())\n const [open, setOpen] = useState<string | null>(null)\n const [error, setError] = useState<string | null>(null)\n const [saving, setSaving] = useState(false)\n\n useEffect(() => {\n fetch(`/api/roadmap${rootParam}`)\n .then((r) => (r.ok ? r.json() : null))\n .then((d) => setTitles(new Map((d?.items ?? []).map((i: { id: string; title: string }) => [i.id, i.title]))))\n .catch(() => setTitles(new Map()))\n }, [rootParam])\n\n const keys = plan.kind === \"breakdown\" ? tasks.map((t) => t.key) : [...horizons, ...epics].map((x) => x.key)\n const selected = keys.filter((k) => !unchecked.has(k))\n const pending = proposal.status === \"pending\"\n\n // Roadmap: a horizon toggles its epics; checking an epic re-checks its horizon (never an epic without its horizon).\n const epicsOf = (h: string) => epics.filter((e) => e.parent.trim() === h).map((e) => e.key)\n const horizonKeys = new Set(horizons.map((h) => h.key))\n function toggle(key: string) {\n setError(null)\n setUnchecked((prev) => {\n const next = new Set(prev)\n const on = next.has(key)\n const group = horizonKeys.has(key) ? [key, ...epicsOf(key)] : [key]\n for (const k of group) if (on) next.delete(k); else next.add(k)\n const parent = epics.find((e) => e.key === key)?.parent.trim()\n if (on && parent && horizonKeys.has(parent)) next.delete(parent)\n return next\n })\n }\n\n const row = (key: string, title: string, meta: string, body: string | undefined, indent = false) => (\n <PlanRow\n key={key} rowKey={key} title={title} meta={meta} body={body} indent={indent}\n checked={!unchecked.has(key)} disabled={!pending || saving} onToggle={() => toggle(key)}\n open={open === key} onOpen={() => setOpen(open === key ? null : key)}\n />\n )\n const outcome = (body: string) => body.trim().split(\"\\n\")[0] ?? \"\"\n // Existing horizons that the plan adds epics to, in first-use order.\n const existingParents = [...new Set(epics.map((e) => e.parent.trim()).filter((p) => !horizonKeys.has(p)))]\n\n async function accept() {\n setSaving(true)\n setError(null)\n try {\n const res = await fetch(`/api/plan/apply${rootParam}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ plan, selected }),\n })\n const data = await res.json().catch(() => null)\n if (!res.ok) throw new Error(data?.error ?? `Apply failed (${res.status})`)\n onResolve(\"accepted\", data?.created ?? [], [...unchecked])\n } catch (e) {\n setError((e as Error).message)\n } finally {\n setSaving(false)\n }\n }\n\n return (\n <div className=\"my-2 rounded-md border border-border overflow-hidden\">\n <div className=\"flex items-center gap-2 px-2 py-1.5 bg-surface2 border-b border-border\">\n <span className=\"text-[10px] font-mono uppercase tracking-widest text-muted\">Plan</span>\n {plan.kind === \"breakdown\" ? (\n <>\n {epicId ? (\n <>\n <span className=\"text-xs font-mono text-accent\">{epicId}</span>\n <span className=\"text-xs text-txt truncate\">{titles.get(epicId) ?? \"\"}</span>\n </>\n ) : newEpic ? (\n <span className=\"text-xs text-txt truncate\">\n New epic: {newEpic.title}\n <span className=\"text-muted\"> (under {newEpic.parent.trim().toUpperCase()} {titles.get(newEpic.parent.trim().toUpperCase()) ?? \"\"})</span>\n </span>\n ) : (\n <span className=\"text-xs text-muted\">No epic</span>\n )}\n <span className=\"ml-auto text-[10px] font-mono text-muted\">{tasks.length} tasks</span>\n </>\n ) : (\n <>\n <span className=\"text-xs text-txt\">Roadmap</span>\n <span className=\"ml-auto text-[10px] font-mono text-muted\">\n {horizons.length ? `${horizons.length} horizons · ` : \"\"}{epics.length} epics\n </span>\n </>\n )}\n </div>\n\n <ul className=\"max-h-80 overflow-auto\">\n {tasks.map((t) => row(\n t.key, t.title,\n [t.size, t.dependsOn?.length ? `after ${t.dependsOn.join(\", \")}` : null, t.due ? `due ${t.due}` : null].filter(Boolean).join(\" · \"),\n t.body,\n ))}\n {horizons.map((h) => [\n row(h.key, h.title, \"new horizon\", h.body),\n ...epics.filter((e) => e.parent.trim() === h.key).map((e) => row(e.key, e.title, outcome(e.body), e.body, true)),\n ])}\n {existingParents.map((p) => [\n <li key={`parent-${p}`} className=\"px-2 py-1.5 border-b border-border text-xs text-muted\">\n <span className=\"font-mono text-accent mr-1\">{p.toUpperCase()}</span>{titles.get(p.toUpperCase()) ?? \"\"}\n </li>,\n ...epics.filter((e) => e.parent.trim() === p).map((e) => row(e.key, e.title, outcome(e.body), e.body, true)),\n ])}\n </ul>\n\n {error && <div className=\"px-2 py-1 text-xs text-red-400 whitespace-pre-wrap border-t border-border\">{error}</div>}\n\n <div className=\"flex items-center gap-2 px-2 py-1.5 border-t border-border\">\n {pending ? (\n <>\n <button\n onClick={accept}\n disabled={saving || selected.length === 0}\n className=\"text-xs px-2 py-0.5 rounded-sm bg-accent/20 text-accent hover:bg-accent/30 disabled:opacity-50\"\n >\n {saving ? \"Creating…\" : `Accept (${selected.length})`}\n </button>\n <button onClick={() => onResolve(\"rejected\", [], [])} disabled={saving} className=\"text-xs px-2 py-0.5 rounded-sm text-muted hover:text-txt\">\n Reject\n </button>\n </>\n ) : proposal.status === \"accepted\" ? (\n <span className=\"text-xs text-teal-400\">\n ✓ Created{\" \"}\n {(proposal.created ?? []).map((c, i) => (\n <span key={c.id}>\n {i > 0 && \", \"}\n <button onClick={() => openDoc(c.file)} className=\"font-mono hover:underline\">{c.id}</button>\n </span>\n ))}\n </span>\n ) : (\n <span className=\"text-xs text-muted\">Rejected</span>\n )}\n </div>\n </div>\n )\n}\n\nfunction PlanRow({ rowKey, title, meta, body, indent, checked, disabled, onToggle, open, onOpen }: {\n rowKey: string\n title: string\n meta: string\n body?: string\n indent: boolean\n checked: boolean\n disabled: boolean\n onToggle: () => void\n open: boolean\n onOpen: () => void\n}) {\n return (\n <li data-plan-row={rowKey} className=\"border-b border-border last:border-b-0\">\n <div className={cn(\"flex items-start gap-2 px-2 py-1.5\", indent && \"pl-6\")}>\n <input\n type=\"checkbox\"\n aria-label={`Include ${title}`}\n checked={checked}\n disabled={disabled}\n onChange={onToggle}\n className=\"mt-0.5 accent-accent\"\n />\n <button onClick={onOpen} className=\"flex-1 min-w-0 text-left\">\n <div className={cn(\"text-xs text-txt\", !checked && \"line-through text-muted\")}>\n <span className=\"font-mono text-muted mr-1\">{rowKey}</span>{title}\n </div>\n {meta && <div className=\"text-[10px] font-mono text-muted truncate\">{meta}</div>}\n </button>\n </div>\n {open && body && (\n <div className=\"px-3 pb-2 border-t border-border bg-surface2/40\">\n <MarkdownRenderer content={body} className=\"text-xs\" />\n </div>\n )}\n </li>\n )\n}\n","export type DiffLine = { op: \" \" | \"+\" | \"-\"; text: string }\n\n// ponytail: O(n·m) LCS on the changed middle; fine for docs, swap for Myers if huge files show up.\nexport function lineDiff(before: string, after: string): DiffLine[] {\n const a = before.split(\"\\n\")\n const b = after.split(\"\\n\")\n let start = 0\n while (start < a.length && start < b.length && a[start] === b[start]) start++\n let endA = a.length\n let endB = b.length\n while (endA > start && endB > start && a[endA - 1] === b[endB - 1]) { endA--; endB-- }\n\n const x = a.slice(start, endA)\n const y = b.slice(start, endB)\n // lcs[i][j] = LCS length of x[i..] and y[j..]\n const lcs = Array.from({ length: x.length + 1 }, () => new Array<number>(y.length + 1).fill(0))\n for (let i = x.length - 1; i >= 0; i--) {\n for (let j = y.length - 1; j >= 0; j--) {\n lcs[i][j] = x[i] === y[j] ? lcs[i + 1][j + 1] + 1 : Math.max(lcs[i + 1][j], lcs[i][j + 1])\n }\n }\n\n const middle: DiffLine[] = []\n let i = 0\n let j = 0\n while (i < x.length || j < y.length) {\n if (i < x.length && j < y.length && x[i] === y[j]) { middle.push({ op: \" \", text: x[i] }); i++; j++ }\n else if (i < x.length && (j === y.length || lcs[i + 1][j] >= lcs[i][j + 1])) { middle.push({ op: \"-\", text: x[i] }); i++ }\n else { middle.push({ op: \"+\", text: y[j] }); j++ }\n }\n\n return [\n ...a.slice(0, start).map((text) => ({ op: \" \" as const, text })),\n ...middle,\n ...a.slice(endA).map((text) => ({ op: \" \" as const, text })),\n ]\n}\n\nexport type TextEdit = { old_string: string; new_string: string }\n\n// Same contract as Claude Code's Edit tool: each old_string must match exactly once, applied in order.\n// An empty old_string is only allowed on an empty/new file (write the first content).\nexport function applyEdits(text: string, edits: TextEdit[]): { content: string } | { error: string } {\n let content = text\n for (const [i, e] of edits.entries()) {\n if (typeof e?.old_string !== \"string\" || typeof e?.new_string !== \"string\") {\n return { error: `Edit ${i + 1}: old_string and new_string must be strings` }\n }\n if (e.old_string === \"\") {\n if (content !== \"\") return { error: `Edit ${i + 1}: empty old_string is only allowed for a new, empty doc` }\n content = e.new_string\n continue\n }\n const at = content.indexOf(e.old_string)\n if (at === -1) return { error: `Edit ${i + 1}: old_string not found in the doc` }\n if (content.indexOf(e.old_string, at + 1) !== -1) {\n return { error: `Edit ${i + 1}: old_string matches more than once; include more surrounding text` }\n }\n content = content.slice(0, at) + e.new_string + content.slice(at + e.old_string.length)\n }\n return { content }\n}\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'square',\n size: 24,\n node: [['rect', { width: '18', height: '18', x: '3', y: '3', rx: '2', key: 'afitv7' }]],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name Square\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/square\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Square = createLucideIcon(__iconData);\n\nexport default Square;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'maximize-2',\n size: 24,\n node: [\n ['path', { d: 'M15 3h6v6', key: '1q9fwt' }],\n ['path', { d: 'm21 3-7 7', key: '1l2asr' }],\n ['path', { d: 'm3 21 7-7', key: 'tjx5ai' }],\n ['path', { d: 'M9 21H3v-6', key: 'wtvkvv' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name Maximize2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/maximize-2\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Maximize2 = createLucideIcon(__iconData);\n\nexport default Maximize2;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'arrow-up-right',\n size: 24,\n node: [\n ['path', { d: 'M7 7h10v10', key: '1tivn9' }],\n ['path', { d: 'M7 17 17 7', key: '1vkiza' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name ArrowUpRight\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/arrow-up-right\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ArrowUpRight = createLucideIcon(__iconData);\n\nexport default ArrowUpRight;\n"],"names":["__iconData","node"],"mappings":"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","ignoreList":[4,5,6]}
|