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,3 @@
|
|
|
1
|
+
module.exports=[694739,a=>{"use strict";var b=a.i(662145),c=a.i(147758),d=a.i(174897),e=a.i(822404),f=a.i(256857);let g={name:"arrow-right",size:24,node:[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]]};g.node;let h=(0,f.default)(g);var i=a.i(425404),j=a.i(531761),k=a.i(270923),l=a.i(544394),m=a.i(173628);let n=/^\s*[-*]\s+\[( |x|X)\]\s+(.*)$/;var o=a.i(368114);function p({epic:a}){let c=a.match(/^(R\d+)\s*[—–-]\s*(.+)$/);return(0,b.jsxs)("h2",{className:"flex items-baseline gap-3 pt-2",children:[c&&(0,b.jsx)("span",{className:"font-mono text-[11px] text-muted",children:c[1]}),(0,b.jsx)("span",{className:"text-[1.1rem] leading-snug font-semibold text-txt",children:c?c[2]:a})]})}let q=/((?<=^|[\s(])\/[\w\-./#?=]+|\b[a-z][\w-]+\/[\w\-./]*\w|\b[\w-]+\.(?:md|json|tsx?|mts)\b|\b(?:[TR]\d{3}|ADR-\d{3})\b|\bvibedoc_\w+|\bmanualTests\b)/g;function r({text:a}){return(0,b.jsx)(b.Fragment,{children:a.split(q).map((a,c)=>c%2?(0,b.jsx)("code",{className:"font-mono text-[0.9em]",children:a},c):a)})}function s({text:a,checked:c}){let d=a.indexOf(" → "),e=d<0?a:a.slice(0,d),f=d<0?null:a.slice(d+3);return(0,b.jsxs)("span",{className:(0,o.cn)("flex min-w-0 flex-col gap-1 transition-colors duration-(--duration-base)",c?"text-muted line-through":"text-txt"),children:[(0,b.jsx)("span",{className:"text-sm leading-snug",children:(0,b.jsx)(r,{text:e})}),f&&(0,b.jsxs)("span",{className:"flex items-start gap-1.5 text-[13px] leading-snug text-muted",children:[(0,b.jsx)(h,{className:"mt-0.5 size-3.5 shrink-0","aria-hidden":!0}),(0,b.jsx)("span",{className:"sr-only",children:"Expected: "}),(0,b.jsx)("span",{children:(0,b.jsx)(r,{text:f})})]})]})}function t({t:a,checkedOf:d,onToggle:f}){let g=a.tests.items.filter(d).length,h=a.tests.total,i=g===h,j=[{label:"Steps",items:a.tests.items.filter(a=>"steps"===a.group)},{label:"Regression risk",items:a.tests.items.filter(a=>"regression"===a.group)}].filter(a=>a.items.length);return(0,b.jsxs)("article",{id:a.task.id,className:(0,o.cn)("scroll-mt-16 rounded-lg border bg-surface animate-fade-in transition-colors duration-(--duration-slow)",i?"border-teal/30":"border-border"),children:[(0,b.jsxs)("header",{className:"flex flex-col gap-3 px-4 pt-4 pb-3 sm:px-5",children:[(0,b.jsxs)("div",{className:"flex flex-wrap items-baseline gap-x-3 gap-y-1.5",children:[(0,b.jsx)("span",{className:"font-mono text-[11px] text-muted",children:a.task.id}),(0,b.jsx)(e.default,{href:`/board?task=${a.task.id}`,className:"min-w-0 flex-1 basis-60 text-[15px] leading-snug font-semibold text-txt hover:text-accent focus-visible:text-accent focus-visible:outline-none",children:a.task.title}),(0,b.jsxs)("span",{className:"flex items-center gap-3",children:[(0,b.jsx)(m.StatusChip,{status:(0,c.displayStatus)(a.task)}),(0,b.jsxs)("span",{className:"font-mono text-[11px] text-muted tabular-nums",children:[(0,b.jsx)("span",{className:"text-txt",children:g}),"/",h]})]})]}),(0,b.jsx)("div",{className:"flex gap-0.5",role:"progressbar","aria-label":`${a.task.id} manual tests`,"aria-valuemin":0,"aria-valuemax":h,"aria-valuenow":g,children:a.tests.items.map(a=>(0,b.jsx)("span",{className:(0,o.cn)("h-1 flex-1 rounded-full transition-colors duration-(--duration-base)",d(a)?"bg-teal":"regression"===a.group?"bg-amber/25":"bg-border2")},a.index))})]}),(0,b.jsxs)("div",{className:"flex flex-col gap-4 border-t border-border px-4 py-4 sm:px-5",children:[j.map(a=>(0,b.jsxs)("div",{className:"flex flex-col gap-1",children:[(0,b.jsx)("p",{className:(0,o.cn)("font-mono text-[10px] uppercase tracking-widest","Steps"===a.label?"text-muted":"text-amber"),children:a.label}),(0,b.jsx)("ol",{className:"flex flex-col",children:a.items.map((c,e)=>{let g=d(c);return(0,b.jsx)("li",{children:(0,b.jsxs)("label",{className:"-mx-2 grid cursor-pointer grid-cols-[1rem_1.25rem_1fr] items-start gap-x-2.5 rounded-md px-2 py-2 hover:bg-surface2",children:[(0,b.jsx)(u,{checked:g,onChange:a=>f(c,a)}),(0,b.jsx)("span",{className:"mt-px font-mono text-[11px] leading-5 text-muted tabular-nums","aria-hidden":!0,children:"Steps"===a.label?String(e+1).padStart(2,"0"):""}),(0,b.jsx)(s,{text:c.text,checked:g})]})},c.index)})})]},a.label)),a.tests.date&&(0,b.jsxs)("p",{className:"font-mono text-[10px] text-muted",children:["Report from ",a.tests.date]})]})]})}function u({checked:a,onChange:c,className:d}){return(0,b.jsxs)("span",{className:(0,o.cn)("relative mt-0.5 flex size-4 shrink-0",d),children:[(0,b.jsx)("input",{type:"checkbox",checked:a,onChange:a=>c(a.target.checked),className:"peer size-4 cursor-pointer appearance-none rounded-sm border border-muted bg-bg transition-colors duration-(--duration-fast) checked:border-teal checked:bg-teal hover:border-txt focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent"}),(0,b.jsx)(i.Check,{strokeWidth:3,className:"pointer-events-none absolute inset-0.5 size-3 text-accent-fg opacity-0 peer-checked:opacity-100","aria-hidden":!0})]})}a.s(["default",0,function(){let{board:a,rootParam:c}=(0,l.useApp)(),[e,f]=(0,d.useState)(!1),[g,h]=(0,d.useState)({}),[i,m]=(0,d.useState)(null),[o,q]=(0,d.useState)([]),r=(0,d.useMemo)(()=>(a?Object.values(a).flat():[]).flatMap(a=>{let b=a.raw?function(a){let b=a.split("\n"),c=function(a){let b,c=(b=!1,a.map(a=>/^\s*```/.test(a)?(b=!b,!0):b)),d=a.findIndex((a,b)=>!c[b]&&"## Manual tests"===a.trim());if(d<0)return null;let e=a.findIndex((a,b)=>b>d&&!c[b]&&/^##\s/.test(a));return[d,e<0?a.length:e]}(b);if(!c)return null;let d=[],e="steps",f=null;for(let a of b.slice(c[0]+1,c[1])){let b=a.match(/^_(\d{4}-\d{2}-\d{2})\b/);if(b&&!f&&!d.length){f=b[1];continue}if(/^\s*###\s/.test(a)){e=/^\s*###\s+regression/i.test(a)?"regression":"steps";continue}let c=a.match(n);c&&d.push({text:c[2].trim(),checked:" "!==c[1],group:e,index:d.length})}return d.length?{items:d,total:d.length,done:d.filter(a=>a.checked).length,date:f}:null}(a.raw):null;return b?[{task:a,tests:b}]:[]}),[a]),s=(a,b)=>{let c=g[`${a.task.id}:${b.index}`];return c&&c.raw===a.task.raw?c.checked:b.checked},v=a=>a.tests.items.filter(b=>!s(a,b)).length,w=r.filter(a=>v(a)>0),x=e?r:r.filter(a=>v(a)>0||o.includes(a.task.id)),y=w.reduce((a,b)=>a+v(b),0),z=(0,d.useMemo)(()=>{let a=new Map;for(let b of[...x].sort((a,b)=>(b.tests.date??"").localeCompare(a.tests.date??"")||b.task.id.localeCompare(a.task.id))){let c=b.task.phase||"No epic";a.set(c,[...a.get(c)??[],b])}return[...a.entries()]},[x]),A=r.length>0;async function B(a,b,d){let e=`${a.task.id}:${b.index}`;m(null),h(b=>({...b,[e]:{checked:d,raw:a.task.raw??""}})),d&&1===v(a)&&q(b=>[...b,a.task.id]);try{let e=await fetch(`/api/tasks/manual-tests${c}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:a.task.id,index:b.index,checked:d})});if(!e.ok)throw Error((await e.json().catch(()=>null))?.error??`Request failed (${e.status})`)}catch(b){h(a=>{let b={...a};return delete b[e],b}),m(`Couldn't save the tick on ${a.task.id}: ${b.message}. The box is back as it was; try again.`)}}return(0,d.useEffect)(()=>{let a=window.location.hash.slice(1);a&&A&&document.getElementById(a)?.scrollIntoView({block:"start",behavior:"smooth"})},[A]),(0,b.jsxs)("div",{className:"mx-auto flex max-w-4xl flex-col gap-6 px-6 py-8",children:[(0,b.jsxs)("header",{className:"flex flex-wrap items-end gap-x-6 gap-y-3 border-b border-border pb-5",children:[(0,b.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,b.jsx)("h1",{className:"text-[1.6rem] leading-tight font-semibold tracking-[-0.02em] text-txt",children:"Manual tests"}),(0,b.jsx)("p",{className:"mt-2 text-[1.1rem] leading-snug font-semibold text-txt",children:w.length?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("span",{className:"font-mono tabular-nums",children:y})," check",1===y?"":"s"," left across"," ",(0,b.jsx)("span",{className:"font-mono tabular-nums",children:w.length})," task",1===w.length?"":"s"]}):r.length?"Everything is checked":"Nothing to check yet"}),(0,b.jsx)("p",{className:"mt-1 text-sm text-muted",children:"Ticking saves to the task file. It never changes the task's status."})]}),(0,b.jsxs)("label",{className:"flex w-full cursor-pointer items-center gap-2 text-xs text-muted select-none hover:text-txt sm:w-auto",children:[(0,b.jsx)(u,{checked:e,onChange:f,className:"mt-0"}),"Show fully tested ",(0,b.jsxs)("span",{className:"font-mono tabular-nums",children:["(",r.length-w.length,")"]})]})]}),i&&(0,b.jsx)("p",{role:"alert",className:"rounded-md border border-danger/30 bg-danger/5 px-3 py-2 text-xs text-danger",children:i}),0===r.length&&(0,b.jsxs)("div",{className:"flex flex-col items-start gap-2 rounded-lg border border-dashed border-border2 p-6 animate-fade-in",children:[(0,b.jsx)(k.FlaskConical,{className:"size-5 text-muted"}),(0,b.jsx)("p",{className:"text-sm text-txt",children:"No manual test reports yet"}),(0,b.jsxs)("p",{className:"max-w-lg text-xs leading-relaxed text-muted",children:["When an agent finishes a task with ",(0,b.jsx)("code",{className:"font-mono",children:"vibedoc_update_task"})," and a ",(0,b.jsx)("code",{className:"font-mono",children:"manualTests"})," checklist, the steps to click through show up here."]})]}),r.length>0&&0===z.length&&(0,b.jsxs)("div",{className:"flex items-center gap-2.5 rounded-lg border border-teal/30 px-4 py-3 text-sm text-txt animate-fade-in",children:[(0,b.jsx)(j.CircleCheck,{className:"size-4 shrink-0 text-teal","aria-hidden":!0}),"All ",r.length," report",1===r.length?" is":"s are"," fully checked. Turn on Show fully tested to see them again."]}),z.map(([a,c])=>(0,b.jsxs)("section",{className:"flex flex-col gap-4",children:[(0,b.jsx)(p,{epic:a}),c.map(a=>(0,b.jsx)(t,{t:a,checkedOf:b=>s(a,b),onToggle:(b,c)=>B(a,b,c)},a.task.id))]},a))]})}],694739)}];
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=src_app_%28app%29_manual-tests_page_tsx_01tnunf._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/app/%28app%29/manual-tests/page.tsx","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/arrow-right.ts","../../../../src/lib/manual-tests.ts"],"sourcesContent":["\"use client\"\n\nimport { displayStatus } from \"@/lib/statuses\"\nimport { useEffect, useMemo, useState } from \"react\"\nimport Link from \"next/link\"\nimport { ArrowRight, Check, CircleCheck, FlaskConical } from \"lucide-react\"\nimport { useApp } from \"@/context/AppContext\"\nimport { StatusChip } from \"@/components/shared/StatusIcon\"\nimport { parseManualTests, type ManualTestItem, type ManualTests } from \"@/lib/manual-tests\"\nimport { cn } from \"@/lib/utils\"\nimport type { Task } from \"@/types\"\n\ninterface Tested { task: Task; tests: ManualTests }\n\n/** A tick not yet reflected in the board data, keyed \"T001:3\"; only applies while the task file is unchanged. */\ntype Pending = Record<string, { checked: boolean; raw: string }>\n\nexport default function ManualTestsPage() {\n const { board, rootParam } = useApp()\n const [showTested, setShowTested] = useState(false)\n const [pending, setPending] = useState<Pending>({})\n const [error, setError] = useState<string | null>(null)\n // Tasks finished during this visit stay in place (marked done) instead of vanishing under the cursor\n const [finishedHere, setFinishedHere] = useState<string[]>([])\n\n const all = useMemo<Tested[]>(() => {\n const tasks = board ? Object.values(board).flat() : []\n return tasks.flatMap((task) => {\n const tests = task.raw ? parseManualTests(task.raw) : null\n return tests ? [{ task, tests }] : []\n })\n }, [board])\n\n const checkedOf = (t: Tested, item: ManualTestItem) => {\n const p = pending[`${t.task.id}:${item.index}`]\n return p && p.raw === t.task.raw ? p.checked : item.checked\n }\n const remaining = (t: Tested) => t.tests.items.filter((i) => !checkedOf(t, i)).length\n\n const open = all.filter((t) => remaining(t) > 0)\n const shown = showTested ? all : all.filter((t) => remaining(t) > 0 || finishedHere.includes(t.task.id))\n const itemsLeft = open.reduce((n, t) => n + remaining(t), 0)\n\n // Group by epic (Phase); newest report first, both for groups and for tasks inside them\n const groups = useMemo(() => {\n const byEpic = new Map<string, Tested[]>()\n for (const t of [...shown].sort((a, b) => (b.tests.date ?? \"\").localeCompare(a.tests.date ?? \"\") || b.task.id.localeCompare(a.task.id))) {\n const key = t.task.phase || \"No epic\"\n byEpic.set(key, [...(byEpic.get(key) ?? []), t])\n }\n return [...byEpic.entries()]\n }, [shown])\n\n // /manual-tests#T060 (the card badge): scroll that task into view once it's rendered\n const hasTasks = all.length > 0\n useEffect(() => {\n const id = window.location.hash.slice(1)\n if (id && hasTasks) document.getElementById(id)?.scrollIntoView({ block: \"start\", behavior: \"smooth\" })\n }, [hasTasks])\n\n async function toggle(t: Tested, item: ManualTestItem, checked: boolean) {\n const key = `${t.task.id}:${item.index}`\n setError(null)\n setPending((p) => ({ ...p, [key]: { checked, raw: t.task.raw ?? \"\" } }))\n if (checked && remaining(t) === 1) setFinishedHere((ids) => [...ids, t.task.id])\n try {\n const res = await fetch(`/api/tasks/manual-tests${rootParam}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ id: t.task.id, index: item.index, checked }),\n })\n if (!res.ok) throw new Error((await res.json().catch(() => null))?.error ?? `Request failed (${res.status})`)\n // The SSE task_updated refresh brings the new file; the pending entry stops applying once raw changes\n } catch (e) {\n setPending((p) => { const next = { ...p }; delete next[key]; return next })\n setError(`Couldn't save the tick on ${t.task.id}: ${(e as Error).message}. The box is back as it was; try again.`)\n }\n }\n\n return (\n <div className=\"mx-auto flex max-w-4xl flex-col gap-6 px-6 py-8\">\n <header className=\"flex flex-wrap items-end gap-x-6 gap-y-3 border-b border-border pb-5\">\n <div className=\"min-w-0 flex-1\">\n <h1 className=\"text-[1.6rem] leading-tight font-semibold tracking-[-0.02em] text-txt\">Manual tests</h1>\n <p className=\"mt-2 text-[1.1rem] leading-snug font-semibold text-txt\">\n {open.length ? (\n <>\n <span className=\"font-mono tabular-nums\">{itemsLeft}</span> check{itemsLeft === 1 ? \"\" : \"s\"} left across{\" \"}\n <span className=\"font-mono tabular-nums\">{open.length}</span> task{open.length === 1 ? \"\" : \"s\"}\n </>\n ) : all.length ? \"Everything is checked\" : \"Nothing to check yet\"}\n </p>\n <p className=\"mt-1 text-sm text-muted\">Ticking saves to the task file. It never changes the task's status.</p>\n </div>\n <label className=\"flex w-full cursor-pointer items-center gap-2 text-xs text-muted select-none hover:text-txt sm:w-auto\">\n <Tick checked={showTested} onChange={setShowTested} className=\"mt-0\" />\n Show fully tested <span className=\"font-mono tabular-nums\">({all.length - open.length})</span>\n </label>\n </header>\n\n {error && <p role=\"alert\" className=\"rounded-md border border-danger/30 bg-danger/5 px-3 py-2 text-xs text-danger\">{error}</p>}\n\n {all.length === 0 && (\n <div className=\"flex flex-col items-start gap-2 rounded-lg border border-dashed border-border2 p-6 animate-fade-in\">\n <FlaskConical className=\"size-5 text-muted\" />\n <p className=\"text-sm text-txt\">No manual test reports yet</p>\n <p className=\"max-w-lg text-xs leading-relaxed text-muted\">\n When an agent finishes a task with <code className=\"font-mono\">vibedoc_update_task</code> and a <code className=\"font-mono\">manualTests</code> checklist,\n the steps to click through show up here.\n </p>\n </div>\n )}\n\n {all.length > 0 && groups.length === 0 && (\n <div className=\"flex items-center gap-2.5 rounded-lg border border-teal/30 px-4 py-3 text-sm text-txt animate-fade-in\">\n <CircleCheck className=\"size-4 shrink-0 text-teal\" aria-hidden />\n All {all.length} report{all.length === 1 ? \" is\" : \"s are\"} fully checked. Turn on Show fully tested to see them again.\n </div>\n )}\n\n {groups.map(([epic, tasks]) => (\n <section key={epic} className=\"flex flex-col gap-4\">\n <EpicHeading epic={epic} />\n {tasks.map((t) => (\n <TaskTests key={t.task.id} t={t} checkedOf={(i) => checkedOf(t, i)} onToggle={(i, c) => toggle(t, i, c)} />\n ))}\n </section>\n ))}\n </div>\n )\n}\n\n/** \"R043 — Task verification & review\" → the ID in mono, the name as a headline. */\nfunction EpicHeading({ epic }: { epic: string }) {\n const m = epic.match(/^(R\\d+)\\s*[—–-]\\s*(.+)$/)\n return (\n <h2 className=\"flex items-baseline gap-3 pt-2\">\n {m && <span className=\"font-mono text-[11px] text-muted\">{m[1]}</span>}\n <span className=\"text-[1.1rem] leading-snug font-semibold text-txt\">{m ? m[2] : epic}</span>\n </h2>\n )\n}\n\n// Paths, commands, files, IDs and tool names inside a step (the Grep rule: set them in mono)\nconst CODE = /((?<=^|[\\s(])\\/[\\w\\-./#?=]+|\\b[a-z][\\w-]+\\/[\\w\\-./]*\\w|\\b[\\w-]+\\.(?:md|json|tsx?|mts)\\b|\\b(?:[TR]\\d{3}|ADR-\\d{3})\\b|\\bvibedoc_\\w+|\\bmanualTests\\b)/g\n\nfunction Inline({ text }: { text: string }) {\n return (\n <>\n {text.split(CODE).map((part, i) =>\n i % 2 ? <code key={i} className=\"font-mono text-[0.9em]\">{part}</code> : part,\n )}\n </>\n )\n}\n\n/** A step reads \"do this → see that\": the action, then the expected result on its own line. */\nfunction StepText({ text, checked }: { text: string; checked: boolean }) {\n const at = text.indexOf(\" → \")\n const action = at < 0 ? text : text.slice(0, at)\n const expected = at < 0 ? null : text.slice(at + 3)\n return (\n <span className={cn(\"flex min-w-0 flex-col gap-1 transition-colors duration-(--duration-base)\", checked ? \"text-muted line-through\" : \"text-txt\")}>\n <span className=\"text-sm leading-snug\"><Inline text={action} /></span>\n {expected && (\n <span className=\"flex items-start gap-1.5 text-[13px] leading-snug text-muted\">\n <ArrowRight className=\"mt-0.5 size-3.5 shrink-0\" aria-hidden />\n <span className=\"sr-only\">Expected: </span>\n <span><Inline text={expected} /></span>\n </span>\n )}\n </span>\n )\n}\n\nfunction TaskTests({ t, checkedOf, onToggle }: {\n t: Tested\n checkedOf: (item: ManualTestItem) => boolean\n onToggle: (item: ManualTestItem, checked: boolean) => void\n}) {\n const done = t.tests.items.filter(checkedOf).length\n const total = t.tests.total\n const complete = done === total\n const groups = [\n { label: \"Steps\", items: t.tests.items.filter((i) => i.group === \"steps\") },\n { label: \"Regression risk\", items: t.tests.items.filter((i) => i.group === \"regression\") },\n ].filter((g) => g.items.length)\n\n return (\n <article\n id={t.task.id}\n className={cn(\"scroll-mt-16 rounded-lg border bg-surface animate-fade-in transition-colors duration-(--duration-slow)\", complete ? \"border-teal/30\" : \"border-border\")}\n >\n <header className=\"flex flex-col gap-3 px-4 pt-4 pb-3 sm:px-5\">\n <div className=\"flex flex-wrap items-baseline gap-x-3 gap-y-1.5\">\n <span className=\"font-mono text-[11px] text-muted\">{t.task.id}</span>\n <Link href={`/board?task=${t.task.id}`} className=\"min-w-0 flex-1 basis-60 text-[15px] leading-snug font-semibold text-txt hover:text-accent focus-visible:text-accent focus-visible:outline-none\">\n {t.task.title}\n </Link>\n <span className=\"flex items-center gap-3\">\n <StatusChip status={displayStatus(t.task)} />\n <span className=\"font-mono text-[11px] text-muted tabular-nums\">\n <span className=\"text-txt\">{done}</span>/{total}\n </span>\n </span>\n </div>\n {/* One mark per item: the report's ruling, filled as you tick */}\n <div className=\"flex gap-0.5\" role=\"progressbar\" aria-label={`${t.task.id} manual tests`} aria-valuemin={0} aria-valuemax={total} aria-valuenow={done}>\n {t.tests.items.map((i) => (\n <span\n key={i.index}\n className={cn(\"h-1 flex-1 rounded-full transition-colors duration-(--duration-base)\", checkedOf(i) ? \"bg-teal\" : i.group === \"regression\" ? \"bg-amber/25\" : \"bg-border2\")}\n />\n ))}\n </div>\n </header>\n <div className=\"flex flex-col gap-4 border-t border-border px-4 py-4 sm:px-5\">\n {groups.map((g) => (\n <div key={g.label} className=\"flex flex-col gap-1\">\n <p className={cn(\"font-mono text-[10px] uppercase tracking-widest\", g.label === \"Steps\" ? \"text-muted\" : \"text-amber\")}>{g.label}</p>\n <ol className=\"flex flex-col\">\n {g.items.map((item, n) => {\n const checked = checkedOf(item)\n return (\n <li key={item.index}>\n <label className=\"-mx-2 grid cursor-pointer grid-cols-[1rem_1.25rem_1fr] items-start gap-x-2.5 rounded-md px-2 py-2 hover:bg-surface2\">\n <Tick checked={checked} onChange={(c) => onToggle(item, c)} />\n {/* Steps are a sequence; regression checks aren't */}\n <span className=\"mt-px font-mono text-[11px] leading-5 text-muted tabular-nums\" aria-hidden>{g.label === \"Steps\" ? String(n + 1).padStart(2, \"0\") : \"\"}</span>\n <StepText text={item.text} checked={checked} />\n </label>\n </li>\n )\n })}\n </ol>\n </div>\n ))}\n {t.tests.date && <p className=\"font-mono text-[10px] text-muted\">Report from {t.tests.date}</p>}\n </div>\n </article>\n )\n}\n\n/** The native checkbox, drawn in the system: pencil-grey box, teal fill with an ink check when ticked. */\nfunction Tick({ checked, onChange, className }: { checked: boolean; onChange: (checked: boolean) => void; className?: string }) {\n return (\n <span className={cn(\"relative mt-0.5 flex size-4 shrink-0\", className)}>\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={(e) => onChange(e.target.checked)}\n className=\"peer size-4 cursor-pointer appearance-none rounded-sm border border-muted bg-bg transition-colors duration-(--duration-fast) checked:border-teal checked:bg-teal hover:border-txt focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent\"\n />\n <Check strokeWidth={3} className=\"pointer-events-none absolute inset-0.5 size-3 text-accent-fg opacity-0 peer-checked:opacity-100\" aria-hidden />\n </span>\n )\n}\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'arrow-right',\n size: 24,\n node: [\n ['path', { d: 'M5 12h14', key: '1ays0h' }],\n ['path', { d: 'm12 5 7 7-7 7', key: 'xquz4c' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name ArrowRight\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/arrow-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 ArrowRight = createLucideIcon(__iconData);\n\nexport default ArrowRight;\n","// Manual test report on a task (R043): a `## Manual tests` checklist section at the end of the task file.\n// Pure (no fs): core.ts reads/writes the file; `node src/lib/manual-tests.check.mts` runs the self-check.\n//\n// ## Manual tests\n// _2026-10-01 — ai_\n// ### Steps\n// - [ ] Open /roadmap, click \"Break down\" on R043 → a chat opens titled with the epic\n// ### Regression risk\n// - [ ] Dragging a card between columns still works\n\nexport const MANUAL_TESTS_HEADING = \"## Manual tests\"\n\nexport type ManualTestGroup = \"steps\" | \"regression\"\n\nexport interface ManualTestItem {\n text: string\n checked: boolean\n group: ManualTestGroup\n /** Position among all checklist items in the section (T061 toggles by this) */\n index: number\n}\n\nexport interface ManualTests {\n items: ManualTestItem[]\n total: number\n done: number\n /** From the `_YYYY-MM-DD — actor_` line; null if missing */\n date: string | null\n}\n\nconst ITEM = /^\\s*[-*]\\s+\\[( |x|X)\\]\\s+(.*)$/\nconst BULLET = /^\\s*[-*]\\s+(.*)$/\n\n/** Lines inside ``` fences, so an example section quoted in a task's spec is never taken for the real one. */\nfunction fenced(lines: string[]): boolean[] {\n let inFence = false\n return lines.map((l) => {\n if (/^\\s*```/.test(l)) { inFence = !inFence; return true }\n return inFence\n })\n}\n\n/** [start, end) line range of the section: its heading up to the next `## ` heading or the end of the file. */\nfunction sectionRange(lines: string[]): [number, number] | null {\n const code = fenced(lines)\n const start = lines.findIndex((l, i) => !code[i] && l.trim() === MANUAL_TESTS_HEADING)\n if (start < 0) return null\n const next = lines.findIndex((l, i) => i > start && !code[i] && /^##\\s/.test(l))\n return [start, next < 0 ? lines.length : next]\n}\n\n/**\n * The report body as a checklist: `### ` group headings kept, every other non-empty line becomes `- [ ] …`\n * (plain text and plain bullets alike). Items before any heading go under `### Steps`.\n */\nexport function normalizeReport(report: string): string {\n const out: string[] = []\n for (const raw of report.replace(/\\r\\n/g, \"\\n\").split(\"\\n\")) {\n const line = raw.trimEnd()\n if (!line.trim()) continue\n if (/^\\s*###\\s/.test(line)) { out.push(line.trim()); continue }\n if (/^\\s*##?\\s/.test(line)) continue // a stray \"## Manual tests\" or H1 from the agent\n const item = line.match(ITEM)\n const text = item ? item[2] : (line.match(BULLET)?.[1] ?? line.trim())\n if (!out.some((l) => l.startsWith(\"### \"))) out.push(\"### Steps\")\n out.push(`- [${item && item[1] !== \" \" ? \"x\" : \" \"}] ${text.trim()}`)\n }\n return out.join(\"\\n\")\n}\n\n/** Write the report as the task's `## Manual tests` section, replacing an older one (old ticks no longer apply). */\nexport function setManualTests(raw: string, report: string, actor: \"ai\" | \"human\", date: string): string {\n const body = normalizeReport(report)\n if (!body) throw new Error(\"manualTests is empty: give at least one checklist item\")\n const lines = raw.split(\"\\n\")\n const range = sectionRange(lines)\n const rest = range ? [...lines.slice(0, range[0]), ...lines.slice(range[1])] : lines\n const kept = rest.join(\"\\n\").replace(/\\s+$/, \"\")\n return `${kept}\\n\\n${MANUAL_TESTS_HEADING}\\n_${date} — ${actor}_\\n${body}\\n`\n}\n\n/** The checklist in a task file, or null when it has no `## Manual tests` section (or the section has no items). */\nexport function parseManualTests(raw: string): ManualTests | null {\n const lines = raw.split(\"\\n\")\n const range = sectionRange(lines)\n if (!range) return null\n const items: ManualTestItem[] = []\n let group: ManualTestGroup = \"steps\"\n let date: string | null = null\n for (const line of lines.slice(range[0] + 1, range[1])) {\n const stamp = line.match(/^_(\\d{4}-\\d{2}-\\d{2})\\b/)\n if (stamp && !date && !items.length) { date = stamp[1]; continue }\n if (/^\\s*###\\s/.test(line)) { group = /^\\s*###\\s+regression/i.test(line) ? \"regression\" : \"steps\"; continue }\n const m = line.match(ITEM)\n if (m) items.push({ text: m[2].trim(), checked: m[1] !== \" \", group, index: items.length })\n }\n if (!items.length) return null\n return { items, total: items.length, done: items.filter((i) => i.checked).length, date }\n}\n\n/** Tick or untick the `index`th checklist item of the `## Manual tests` section (file order), nothing else. */\nexport function toggleManualTest(raw: string, index: number, checked: boolean): string {\n const lines = raw.split(\"\\n\")\n const range = sectionRange(lines)\n if (!range) throw new RangeError(\"This task has no manual tests\")\n let n = 0\n for (let i = range[0] + 1; i < range[1]; i++) {\n if (!ITEM.test(lines[i])) continue\n if (n++ === index) {\n lines[i] = lines[i].replace(/\\[( |x|X)\\]/, checked ? \"[x]\" : \"[ ]\")\n return lines.join(\"\\n\")\n }\n }\n throw new RangeError(`No manual test item ${index} (the task has ${n})`)\n}\n"],"names":[],"mappings":"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","ignoreList":[1]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module.exports=[892519,a=>{"use strict";var b=a.i(662145),c=a.i(174897),d=a.i(913975),e=a.i(544394),f=a.i(149350),g=a.i(21215),h=a.i(200382),i=a.i(72551),j=a.i(368114),k=a.i(866718),l=a.i(813722);let m=["convention","gotcha","decision","preference"],n=new Set("a an and are as at be but by can do does for from how i if in into is it its of on or our so that the their then there these this to use used using was we what when where which who why will with you your".split(" "));function o(a){return a.toLowerCase().split(/[^a-z0-9]+/).filter(a=>a.length>1&&!n.has(a)).map(a=>a.length>3&&a.endsWith("s")&&!a.endsWith("ss")?a.slice(0,-1):a)}function p(a){return Math.ceil(a.length/4)}function q({entries:a,selectedId:d,onOpen:e,onNew:f}){let[g,n]=(0,c.useState)(""),[r,s]=(0,c.useState)(null),t=(0,c.useMemo)(()=>{var b,c;let d,e,f;return b=a,e=new Map((d=(c={query:g,type:r}).type?b.filter(a=>a.type===c.type):b).map(a=>[a.id,a])),(o(f=c.query??"").length?function(a,b,c={}){let d=[...new Set(o(b))];if(!d.length)return[];let e=[];for(let b of a){if(c.type&&b.type!==c.type)continue;let a=new Set(o(b.summary)),f=new Set(o(b.body)),g=new Set([b.id.toLowerCase(),...o(b.type)]),h=0;for(let b of d)a.has(b)&&(h+=3),g.has(b)&&(h+=2),f.has(b)&&(h+=1);h>0&&e.push({id:b.id,type:b.type,summary:b.summary,tokens:p(`${b.summary}
|
|
2
|
+
${b.body}`),score:h,updatedAt:b.updatedAt})}return e.sort((a,b)=>b.score-a.score||b.updatedAt.localeCompare(a.updatedAt)),e.slice(0,c.limit??10).map(({updatedAt:a,...b})=>b)}(d,f,{limit:d.length}):[...d].sort((a,b)=>b.updatedAt.localeCompare(a.updatedAt)||a.id.localeCompare(b.id,"en",{numeric:!0})).map(a=>({id:a.id,type:a.type,summary:a.summary,tokens:p(`${a.summary}
|
|
3
|
+
${a.body}`),score:0}))).map(a=>e.get(a.id)).filter(a=>!!a)},[a,g,r]),u=(0,c.useMemo)(()=>{let b={};for(let c of a)b[c.type]=(b[c.type]??0)+1;return b},[a]),v=o(g).length>0,w=(a,c,d)=>(0,b.jsxs)("button",{type:"button","aria-pressed":r===a,onClick:()=>s(a),className:(0,j.cn)("h-6 rounded-[5px] border border-transparent px-2 text-xs font-medium text-muted outline-none transition-colors","hover:bg-surface2 hover:text-txt focus-visible:ring-2 focus-visible:ring-accent",r===a&&"border-border2 bg-surface2 text-txt"),children:[c," ",(0,b.jsx)("span",{className:"font-mono text-[10px] opacity-70",children:d})]},c);return(0,b.jsxs)("section",{"aria-label":"Knowledge entries",className:"flex min-w-0 flex-col gap-3",children:[(0,b.jsxs)("div",{className:"flex items-baseline justify-between",children:[(0,b.jsx)("h2",{className:"font-display text-base font-semibold tracking-tight",children:"Knowledge entries"}),(0,b.jsxs)("button",{type:"button",onClick:f,className:"inline-flex items-center gap-1 rounded-md px-2 py-1 text-xs font-medium text-muted outline-none hover:bg-surface2 hover:text-txt focus-visible:ring-2 focus-visible:ring-accent",children:[(0,b.jsx)(h.Plus,{className:"size-3.5","aria-hidden":!0})," New entry"]})]}),(0,b.jsxs)("div",{className:"relative",children:[(0,b.jsx)(i.Search,{className:"pointer-events-none absolute left-2.5 top-1/2 size-3.5 -translate-y-1/2 text-muted","aria-hidden":!0}),(0,b.jsx)(k.Input,{id:"memory-search",type:"search",value:g,onChange:a=>n(a.target.value),placeholder:"Search entries…","aria-label":"Search entries",className:"h-8 pl-8"})]}),(0,b.jsxs)("div",{role:"group","aria-label":"Filter by type",className:"flex flex-wrap gap-1",children:[w(null,"All",a.length),m.map(a=>w(a,a,u[a]??0))]}),0===a.length?(0,b.jsxs)("p",{className:"rounded-xl border border-dashed border-border p-4 text-sm text-muted",children:["No knowledge entries yet. Agents save them with ",(0,b.jsx)("code",{className:"font-mono text-xs",children:"vibedoc_save_entry"}),"."]}):0===t.length?(0,b.jsxs)("p",{className:"p-2 text-sm text-muted",children:["No entries match ",v?`"${g.trim()}"`:"this filter","."]}):(0,b.jsx)("ul",{className:"flex flex-col divide-y divide-border rounded-xl border border-border bg-surface",children:t.map(a=>(0,b.jsx)("li",{children:(0,b.jsxs)("button",{type:"button",onClick:()=>e(a.id),"aria-current":a.id===d?"true":void 0,className:(0,j.cn)("flex w-full flex-col gap-0.5 px-3 py-2 text-left outline-none transition-colors hover:bg-surface2 focus-visible:bg-surface2",a.id===d&&"bg-surface2 shadow-[inset_2px_0_0_var(--color-accent)]"),children:[(0,b.jsxs)("span",{className:"flex items-center gap-2 font-mono text-[11px] text-muted",children:[(0,b.jsx)("span",{children:a.id}),(0,b.jsx)("span",{children:"·"}),(0,b.jsx)("span",{children:a.type}),(0,b.jsxs)("span",{className:"ml-auto flex items-center gap-2",children:[(0,b.jsx)(l.OwnerChip,{owner:a.by,className:"font-sans"}),a.updatedAt]})]}),(0,b.jsx)("span",{className:"text-sm text-txt",children:a.summary})]})},a.id))})]})}var r=a.i(661661),s=a.i(28386),t=a.i(54165),u=a.i(699570),v=a.i(192698);function w({entry:a,rootParam:d,onSaved:e,onDelete:g,onClose:h,children:i}){let[j,n]=(0,c.useState)(null===a),[o,p]=(0,c.useState)(()=>x(a)),[q,y]=(0,c.useState)(null),[z,A]=(0,c.useState)(!1),B=()=>{a?(n(!1),y(null)):h()},C=async()=>{let b=function(a){let b;if(void 0!==a.id&&!function(a){let b=/^e(\d+)$/i.exec(a.trim());if(!b)return null;let c=Number(b[1]);return c>0?`E${String(c).padStart(3,"0")}`:null}(String(a.id)))return`Invalid id "${a.id}": expected E followed by a number, e.g. E001`;if(b=String(a.type??""),!m.includes(b))return`Invalid type "${a.type??""}": use one of ${m.join(", ")}`;let c=String(a.summary??"").trim();return c?/\n/.test(c)?"summary must be one line":c.length>120?`summary is ${c.length} characters; keep it to 120`:void 0!==a.body&&"string"!=typeof a.body?"body must be a string":null:"summary is required"}({...o,id:a?.id});if(b)return void y(b);A(!0),y(null);try{let b=await fetch(`/api/memory/entries/save${d}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({...a?{id:a.id}:{},...o})}),c=await b.json().catch(()=>({}));if(!b.ok||!c.entry)throw Error(c.error??`Save failed (${b.status})`);n(!1),e(c.entry)}catch(a){y(a instanceof Error?a.message:String(a))}finally{A(!1)}};(0,c.useEffect)(()=>{if(j||!a)return;let b=b=>{if("Backspace"!==b.key&&"Delete"!==b.key||b.metaKey||b.ctrlKey||b.altKey)return;let c=b.target;c&&(c.isContentEditable||["INPUT","TEXTAREA","SELECT"].includes(c.tagName))||(b.preventDefault(),g(a))};return window.addEventListener("keydown",b),()=>window.removeEventListener("keydown",b)},[j,a,g]);let D=(0,b.jsx)("button",{type:"button",onClick:h,"aria-label":"Close entry",className:"rounded p-1 text-muted hover:bg-surface2 hover:text-txt",children:(0,b.jsx)(t.X,{className:"size-3.5"})});return j?(0,b.jsx)("section",{"aria-label":a?`Edit ${a.id}`:"New entry",className:"rounded-xl border border-border bg-surface",children:(0,b.jsxs)("form",{onSubmit:a=>{a.preventDefault(),C()},onKeyDown:a=>{"Escape"===a.key&&(a.preventDefault(),B()),"Enter"===a.key&&(a.metaKey||a.ctrlKey)&&(a.preventDefault(),C())},className:"flex flex-col gap-3 p-5",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between font-mono text-[11px] text-muted",children:[(0,b.jsx)("span",{children:a?`${a.id} \xb7 editing`:"New entry"}),D]}),(0,b.jsxs)("label",{className:"flex flex-col gap-1 text-xs text-muted",children:["Type",(0,b.jsx)("select",{value:o.type,onChange:a=>p({...o,type:a.target.value}),className:"h-8 rounded-md border border-border bg-bg px-2 text-sm text-txt focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent",children:m.map(a=>(0,b.jsx)("option",{value:a,children:a},a))})]}),(0,b.jsxs)("label",{className:"flex flex-col gap-1 text-xs text-muted",children:["Summary (one line)",(0,b.jsx)(k.Input,{autoFocus:!0,value:o.summary,onChange:a=>p({...o,summary:a.target.value}),maxLength:200,className:"h-8 text-txt"})]}),(0,b.jsxs)("label",{className:"flex flex-col gap-1 text-xs text-muted",children:["Details (markdown)",(0,b.jsx)("textarea",{value:o.body,onChange:a=>p({...o,body:a.target.value}),rows:8,className:"w-full resize-y rounded-md border border-border bg-bg px-3 py-2 font-mono text-xs text-txt focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent"})]}),q&&(0,b.jsx)("p",{role:"alert",className:"text-xs text-danger",children:q}),(0,b.jsxs)("div",{className:"flex items-center justify-end gap-2",children:[(0,b.jsx)("span",{className:"mr-auto text-[11px] text-muted",children:"⌘↵ save · Esc cancel"}),(0,b.jsx)(u.Button,{type:"button",variant:"ghost",size:"sm",onClick:B,children:"Cancel"}),(0,b.jsx)(u.Button,{type:"submit",size:"sm",disabled:z,children:z?"Saving…":"Save"})]})]})}):a?(0,b.jsxs)("section",{"aria-label":a.id,className:"rounded-xl border border-border bg-surface",children:[(0,b.jsx)(v.ItemPanelHeader,{kicker:(0,b.jsxs)("span",{children:[a.id," · entry"]}),menu:(0,b.jsxs)("span",{className:"flex items-center gap-1",children:[(0,b.jsxs)(u.Button,{variant:"ghost",size:"sm",onClick:()=>{p(x(a)),y(null),n(!0)},className:"h-7 px-2 text-xs",children:[(0,b.jsx)(r.Pencil,{className:"size-3.5"})," Edit"]}),(0,b.jsxs)(u.Button,{variant:"ghost",size:"sm",onClick:()=>g(a),title:"Delete (⌫)",className:"h-7 px-2 text-xs hover:text-danger",children:[(0,b.jsx)(s.Trash2,{className:"size-3.5"})," Delete"]}),D]}),title:a.summary,properties:[{label:"Type",value:a.type},{label:"Updated",value:a.updatedAt||null},{label:"Changed by",value:a.by?(0,b.jsx)(l.OwnerChip,{owner:a.by,className:"text-xs text-txt"}):null},{label:"File",value:(0,b.jsx)("span",{className:"truncate font-mono text-[11px] text-muted",children:a.file})}]}),(0,b.jsxs)("div",{className:"p-5",children:[a.body?(0,b.jsx)(f.MarkdownRenderer,{content:a.body}):(0,b.jsx)("p",{className:"text-sm text-muted",children:"No details."}),i]})]}):null}function x(a){return a?{type:a.type,summary:a.summary,body:a.body}:{type:"convention",summary:"",body:""}}var y=a.i(508817),z=a.i(926128),A=a.i(256857);let B={name:"flag",size:24,node:[["path",{d:"M4 22V4a1 1 0 0 1 .4-.8A6 6 0 0 1 8 2c3 0 5 2 7.333 2q2 0 3.067-.8A1 1 0 0 1 20 4v10a1 1 0 0 1-.4.8A6 6 0 0 1 16 16c-3 0-5-2-8-2a6 6 0 0 0-4 1.528",key:"1jaruq"}]]};B.node;let C=(0,A.default)(B),D={name:"lightbulb",size:24,node:[["path",{d:"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5",key:"1gvzjb"}],["path",{d:"M9 18h6",key:"x1upvd"}],["path",{d:"M10 22h4",key:"ceow96"}]]};D.node;let E=(0,A.default)(D);var F=a.i(471617),G=a.i(173628),H=a.i(147758);let I=[{kind:"task",label:"Tasks"},{kind:"epic",label:"Epics"},{kind:"adr",label:"ADRs"},{kind:"doc",label:"Docs"},{kind:"entry",label:"Entries"}],J={epic:C,adr:F.Scale,doc:z.FileText,entry:E,task:y.BookOpen};function K(a){let b=(0,d.useRouter)(),{openDoc:c}=(0,e.useApp)();return d=>{"task"===d.kind?b.push(`/board?task=${d.id}`):"epic"===d.kind?b.push(`/roadmap?item=${d.id}`):"entry"===d.kind?a(d.id):c(d.path)}}function L({entryId:a,onOpenEntry:d}){let{rootParam:f,summary:g,board:h}=(0,e.useApp)(),i=K(d),[j,k]=(0,c.useState)(null);(0,c.useEffect)(()=>{let b=!0;return fetch(`/api/memory/graph${f}&entry=${encodeURIComponent(a)}`).then(a=>a.json()).then(a=>{b&&k(a.nodes?a:{nodes:[],edges:[]})}).catch(a=>{console.warn("Loading entry links failed",a),b&&k({nodes:[],edges:[]})}),()=>{b=!1}},[a,f,g]);let l=(0,c.useMemo)(()=>new Map(Object.values(h??{}).flat().map(a=>[a.id,a])),[h]),m=(0,c.useMemo)(()=>new Map((j?.nodes??[]).map(a=>[a.id,a])),[j]),n=a=>a.map(a=>m.get(a)).filter(a=>!!a),o=n((j?.edges??[]).filter(b=>b.from===a).map(a=>a.to)),p=n((j?.edges??[]).filter(b=>b.to===a).map(a=>a.from)),q=a=>{let c="task"===a.kind?l.get(a.id):void 0,d=J[a.kind];return(0,b.jsx)("li",{children:(0,b.jsxs)("button",{type:"button",onClick:()=>i(a),title:a.path,className:"flex w-full items-center gap-2 rounded-md px-2 py-1 text-left text-sm outline-none hover:bg-surface2 focus-visible:ring-2 focus-visible:ring-accent",children:[c?(0,b.jsx)(G.StatusIcon,{status:(0,H.displayStatus)(c),className:"size-3.5 shrink-0"}):(0,b.jsx)(d,{className:"size-3.5 shrink-0 text-muted","aria-hidden":!0}),"doc"!==a.kind&&(0,b.jsx)("span",{className:"shrink-0 font-mono text-[11px] text-muted",children:a.id}),(0,b.jsx)("span",{className:"min-w-0 truncate text-txt",children:a.label})]})},a.id)},r=(a,c)=>(0,b.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,b.jsx)("h4",{className:"text-[11px] font-semibold uppercase tracking-wider text-muted",children:a}),I.map(({kind:a,label:d})=>{let e=c.filter(b=>b.kind===a);return e.length?(0,b.jsxs)("div",{children:[(0,b.jsx)("p",{className:"px-2 text-[11px] text-muted",children:d}),(0,b.jsx)("ul",{children:e.map(q)})]},a):null})]});return(0,b.jsxs)("section",{"aria-label":"Related",className:"mt-5 flex flex-col gap-3 border-t border-border pt-4",children:[(0,b.jsx)("h3",{className:"text-xs font-semibold text-txt",children:"Related"}),null===j?(0,b.jsx)("p",{className:"text-xs text-muted",children:"Loading links…"}):o.length||p.length?(0,b.jsxs)(b.Fragment,{children:[o.length>0&&r("Links to",o),p.length>0&&r("Linked from",p)]}):(0,b.jsx)("p",{className:"text-xs text-muted",children:"No links yet. Mention a task, epic or doc in the entry to link it."})]})}var M=a.i(156298);let N={name:"git-commit-horizontal",size:24,node:[["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}],["line",{x1:"3",x2:"9",y1:"12",y2:"12",key:"1dyftd"}],["line",{x1:"15",x2:"21",y1:"12",y2:"12",key:"oup4p8"}]],aliases:["git-commit"]};N.node;let O=(0,A.default)(N);function P({entryId:a}){let{rootParam:d}=(0,e.useApp)(),[f,g]=(0,c.useState)(!1),[h,i]=(0,c.useState)(null),[k,l]=(0,c.useState)(null),[m,n]=(0,c.useState)(null),o=`/api/memory/history${d}&entry=${encodeURIComponent(a)}`,p=async a=>{let b=await fetch(a),c=await b.json().catch(()=>({}));if(!b.ok)throw Error(c.error??`Request failed (${b.status})`);return c},q=async()=>{let a=!f;if(g(a),a&&!h)try{i(await p(o))}catch(a){l(a instanceof Error?a.message:String(a))}},r=async a=>{try{let{text:b}=await p(`${o}&sha=${a.sha}`);n({commit:a,text:b})}catch(a){l(a instanceof Error?a.message:String(a))}};return(0,b.jsxs)("section",{"aria-label":"History",className:"mt-4 border-t border-border pt-3",children:[(0,b.jsxs)("button",{type:"button",onClick:q,"aria-expanded":f,className:"flex items-center gap-1 rounded text-xs font-semibold text-txt outline-none focus-visible:ring-2 focus-visible:ring-accent",children:[(0,b.jsx)(M.ChevronRight,{className:(0,j.cn)("size-3.5 text-muted transition-transform",f&&"rotate-90"),"aria-hidden":!0}),"History"]}),f&&(0,b.jsxs)("div",{className:"mt-2 flex flex-col gap-2",children:[k&&(0,b.jsx)("p",{role:"alert",className:"text-xs text-danger",children:k}),!h&&!k&&(0,b.jsx)("p",{className:"text-xs text-muted",children:"Loading history…"}),h?.reason==="no-git"&&(0,b.jsx)("p",{className:"text-xs text-muted",children:"History needs git: this project is not a git repository."}),h&&!h.reason&&!h.history.length&&!h.uncommitted&&(0,b.jsx)("p",{className:"text-xs text-muted",children:"Not committed yet."}),h&&(h.uncommitted||h.history.length>0)&&(0,b.jsxs)("ul",{className:"flex flex-col",children:[h.uncommitted&&(0,b.jsxs)("li",{className:"flex items-center gap-2 px-2 py-1 text-xs text-muted",children:[(0,b.jsx)("span",{className:"size-1.5 rounded-full bg-accent","aria-hidden":!0})," Uncommitted changes"]}),h.history.map(a=>(0,b.jsx)("li",{children:(0,b.jsxs)("button",{type:"button",onClick:()=>r(a),"aria-current":m?.commit.sha===a.sha?"true":void 0,className:(0,j.cn)("flex w-full items-center gap-2 rounded-md px-2 py-1 text-left text-xs outline-none hover:bg-surface2 focus-visible:ring-2 focus-visible:ring-accent",m?.commit.sha===a.sha&&"bg-surface2"),children:[(0,b.jsx)(O,{className:"size-3.5 shrink-0 text-muted","aria-hidden":!0}),(0,b.jsx)("span",{className:"shrink-0 font-mono text-[11px] text-muted",children:a.date.slice(0,10)}),(0,b.jsx)("span",{className:"min-w-0 flex-1 truncate text-txt",children:a.subject}),(0,b.jsx)("span",{className:"shrink-0 text-muted",children:a.author})]})},a.sha))]}),m&&(0,b.jsxs)("div",{className:"rounded-md border border-border bg-bg",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between border-b border-border px-3 py-1.5 font-mono text-[11px] text-muted",children:[(0,b.jsxs)("span",{children:[m.commit.sha.slice(0,7)," · ",m.commit.date.slice(0,10)," · read-only"]}),(0,b.jsx)("button",{type:"button",onClick:()=>n(null),"aria-label":"Close version",className:"rounded p-0.5 hover:text-txt",children:(0,b.jsx)(t.X,{className:"size-3.5"})})]}),(0,b.jsx)("pre",{className:"max-h-72 overflow-auto whitespace-pre-wrap p-3 font-mono text-xs text-txt",children:m.text})]})]})]})}var Q=a.i(365465),R=a.i(152716);let S={epic:-2,task:-1,entry:0,adr:1,doc:2},T={"--xy-background-color":"var(--color-bg)"};function U(a){let b=new MutationObserver(a);return b.observe(document.documentElement,{attributes:!0,attributeFilter:["class"]}),()=>b.disconnect()}let V={mem:(0,c.memo)(function({data:a}){let{node:c,status:d,unlinked:e,dim:f,active:g}=a,h=J[c.kind];return(0,b.jsxs)("div",{title:c.path,style:{width:196},className:(0,j.cn)("flex items-center gap-2 rounded-md border bg-surface px-2.5 py-1.5 text-xs transition-opacity","entry"===c.kind?"border-border2":"border-border",g&&"border-accent ring-1 ring-accent",e&&"border-dashed opacity-60",f&&"opacity-25"),children:[["l","r"].map(a=>(0,b.jsxs)("span",{children:[(0,b.jsx)(Q.Handle,{id:a,type:"source",position:"l"===a?R.Position.Left:R.Position.Right,isConnectable:!1,className:"opacity-0"}),(0,b.jsx)(Q.Handle,{id:`${a}-t`,type:"target",position:"l"===a?R.Position.Left:R.Position.Right,isConnectable:!1,className:"opacity-0"})]},a)),d?(0,b.jsx)(G.StatusIcon,{status:d,className:"size-3.5 shrink-0"}):(0,b.jsx)(h,{className:(0,j.cn)("size-3.5 shrink-0","entry"===c.kind?"text-accent":"text-muted"),"aria-hidden":!0}),"doc"!==c.kind&&(0,b.jsx)("span",{className:"shrink-0 font-mono text-[10px] text-muted",children:c.id}),(0,b.jsx)("span",{className:(0,j.cn)("min-w-0 truncate","entry"===c.kind?"text-txt":"text-muted"),children:c.label})]})})};function W({entries:a,selectedId:d,onOpenEntry:f}){let{rootParam:g,summary:h,board:i}=(0,e.useApp)(),j=K(f),[k,l]=(0,c.useState)(null),m=(0,c.useSyncExternalStore)(U,()=>document.documentElement.classList.contains("dark"),()=>!0);(0,c.useEffect)(()=>{let a=!0;return fetch(`/api/memory/graph${g}`).then(a=>a.json()).then(b=>{a&&l(b.nodes?b:{nodes:[],edges:[]})}).catch(b=>{console.warn("Loading the memory graph failed",b),a&&l({nodes:[],edges:[]})}),()=>{a=!1}},[g,h]);let{nodes:n,edges:o}=(0,c.useMemo)(()=>{if(!k)return{nodes:[],edges:[]};let b=function(a,b={}){let c={},d=a=>Number(a.replace(/\D/g,""))||0;a.nodes.filter(a=>"entry"===a.kind).sort((a,c)=>(b[a.id]??"").localeCompare(b[c.id]??"")||d(a.id)-d(c.id)).forEach((a,b)=>{c[a.id]={x:0,y:48*b}});let e=new Map;for(let{from:b,to:d}of a.edges)for(let[a,f]of[[b,d],[d,b]])c[f]&&!c[a]&&e.set(a,[...e.get(a)??[],c[f].y]);for(let b of["epic","task","adr","doc"]){let d=a.nodes.filter(a=>a.kind===b).map(a=>{let b=e.get(a.id)??[0];return{id:a.id,want:b.reduce((a,b)=>a+b,0)/b.length}}).sort((a,b)=>a.want-b.want||a.id.localeCompare(b.id,"en",{numeric:!0})),f=-1/0;for(let{id:a,want:e}of d){let d=Math.max(e,f);c[a]={x:240*S[b],y:d},f=d+48}}return c}(k,Object.fromEntries(a.map(a=>[a.id,a.type]))),c=new Map(Object.values(i??{}).flat().map(a=>[a.id,a])),e=new Set(k.edges.flatMap(a=>[a.from,a.to])),f=d&&b[d]?new Set([d,...k.edges.filter(a=>a.from===d||a.to===d).flatMap(a=>[a.from,a.to])]):null;return{nodes:k.nodes.map(a=>{let g="task"===a.kind?c.get(a.id):void 0;return{id:a.id,type:"mem",position:b[a.id]??{x:0,y:0},data:{node:a,status:g?(0,H.displayStatus)(g):void 0,unlinked:"entry"===a.kind&&!e.has(a.id),dim:!!f&&!f.has(a.id),active:a.id===d},draggable:!1}}),edges:k.edges.map(a=>{let c=b[a.from]?.x??0,e=b[a.to]?.x??0,g=e<c,h=!!f&&(a.from===d||a.to===d);return{id:`${a.from}->${a.to}`,source:a.from,target:a.to,sourceHandle:g?"l":"r",targetHandle:g||e===c?"r-t":"l-t",style:{stroke:h?"var(--color-accent)":"var(--color-border2)",strokeWidth:h?1.75:1,opacity:f&&!h?.15:1}}})}},[k,a,i,d]);return k?k.nodes.length?(0,b.jsx)("div",{"aria-label":"Memory graph",className:"h-[70vh] min-h-[420px] overflow-hidden rounded-xl border border-border",children:(0,b.jsxs)(Q.ReactFlow,{nodes:n,edges:o,nodeTypes:V,onNodeClick:(a,b)=>j(b.data.node),nodesConnectable:!1,nodesDraggable:!1,deleteKeyCode:null,colorMode:m?"dark":"light",onlyRenderVisibleElements:n.length>150,fitView:!0,fitViewOptions:{padding:.1,minZoom:.8,maxZoom:1},minZoom:.1,style:T,children:[(0,b.jsx)(Q.Background,{variant:Q.BackgroundVariant.Dots,gap:20,size:1}),(0,b.jsx)(Q.Controls,{showInteractive:!1})]})}):(0,b.jsx)("p",{className:"rounded-xl border border-dashed border-border p-4 text-sm text-muted",children:"No entries to draw yet."}):(0,b.jsx)("p",{className:"text-sm text-muted",children:"Loading graph…"})}function X({memory:a,entries:c,rootParam:d,selectedId:e,creating:h,onOpen:i,onNew:k,onClose:l,onSaved:m,onDelete:n,view:o,onView:p}){let r=e?c?.find(a=>a.id===e):void 0;return(0,b.jsxs)("div",{className:(0,j.cn)("grid items-start gap-6 p-6","graph"===o?"lg:grid-cols-[minmax(0,1fr)_minmax(0,30rem)]":"lg:grid-cols-[minmax(280px,380px)_minmax(0,42rem)]"),children:[(0,b.jsxs)("div",{className:"flex items-center justify-between gap-4 lg:col-span-2",children:[(0,b.jsx)("h1",{className:"font-display text-xl font-semibold tracking-tight",children:"Memory"}),(0,b.jsx)("div",{role:"group","aria-label":"Entries view",className:"flex rounded-md border border-border p-0.5",children:["list","graph"].map(a=>(0,b.jsx)("button",{type:"button","aria-pressed":o===a,onClick:()=>p(a),className:(0,j.cn)("h-6 rounded-[5px] border border-transparent px-2.5 text-xs font-medium capitalize text-muted outline-none transition-colors","hover:bg-surface2 hover:text-txt focus-visible:ring-2 focus-visible:ring-accent",o===a&&"border-border2 bg-surface2 text-txt"),children:a},a))})]}),c&&"graph"===o?(0,b.jsx)(W,{entries:c,selectedId:e,onOpenEntry:i}):c?(0,b.jsx)(q,{entries:c,selectedId:e,onOpen:i,onNew:k}):(0,b.jsx)("p",{className:"text-sm text-muted",children:"Loading entries…"}),h||r?(0,b.jsx)("div",{className:"min-w-0 lg:sticky lg:top-6",children:(0,b.jsx)(w,{entry:h?null:r??null,rootParam:d,onSaved:m,onDelete:n,onClose:l,children:r&&!h&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(L,{entryId:r.id,onOpenEntry:i}),(0,b.jsx)(P,{entryId:r.id})]})},h?"new":r?.id)}):e&&c?(0,b.jsxs)("div",{role:"alert",className:"min-w-0 rounded-xl border border-dashed border-border p-5 text-sm text-muted",children:["Entry ",e," not found."," ",(0,b.jsx)("button",{type:"button",onClick:l,className:"text-txt underline underline-offset-2",children:"Show the handoff"})]}):(0,b.jsxs)("div",{className:"min-w-0",children:[(0,b.jsxs)("div",{className:"flex items-baseline justify-between mb-3",children:[(0,b.jsx)("h2",{className:"font-display text-base font-semibold tracking-tight",children:"Session handoff"}),(0,b.jsx)("span",{className:"text-xs font-mono text-muted",children:"memory/MEMORY.md"})]}),a?.exists?(0,b.jsx)("div",{className:"bg-surface border border-border rounded-xl p-5",children:(0,b.jsx)(f.MarkdownRenderer,{content:a.content})}):(0,b.jsx)(g.EmptyState,{icon:"🧠",message:"No MEMORY.md yet.",subMessage:"AI will create one at the end of the first session.",bordered:!0}),(0,b.jsxs)("div",{className:"mt-4 p-4 bg-surface2 border border-border rounded-xl",children:[(0,b.jsx)("p",{className:"text-xs font-mono text-muted mb-2",children:"Add to your CLAUDE.md system prompt:"}),(0,b.jsx)("pre",{className:"text-xs font-mono text-accent/80 whitespace-pre-wrap leading-relaxed",children:`At session start:
|
|
4
|
+
1. Call vibedoc_read_memory
|
|
5
|
+
2. Call vibedoc_get_status
|
|
6
|
+
|
|
7
|
+
When you learn a fact that should still hold next week:
|
|
8
|
+
- Call vibedoc_save_entry (convention, gotcha, decision, preference)
|
|
9
|
+
|
|
10
|
+
At session end:
|
|
11
|
+
- Call vibedoc_update_memory with full handoff`})]})]})]})}var Y=a.i(269769);function Z(){let{summary:a,rootParam:f}=(0,e.useApp)(),g=(0,d.useRouter)(),h=(0,d.useSearchParams)(),i=h.get("entry"),j="graph"===h.get("view")?"graph":"list",[k,l]=(0,c.useState)(null),[m,n]=(0,c.useState)(!1),o=(0,c.useCallback)(()=>{let a=!0;return fetch(`/api/memory/entries${f}`).then(a=>a.json()).then(b=>{a&&l(b.entries??[])}).catch(b=>{console.warn("Loading memory entries failed",b),a&&l([])}),()=>{a=!1}},[f]);(0,c.useEffect)(()=>o(),[o,a]);let p=(0,c.useCallback)((a,b)=>{let c=new URLSearchParams;"graph"===b&&c.set("view","graph"),a&&c.set("entry",a),g.replace(c.size?`/memory?${c}`:"/memory",{scroll:!1})},[g]),q=(0,c.useCallback)(a=>{n(!1),p(a,j)},[p,j]),r=(0,c.useCallback)(async a=>{let b=async(a,b)=>{let c=await fetch(`${a}${f}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(b)}),d=await c.json().catch(()=>({}));if(!c.ok)throw Error(d.error??`Request failed (${c.status})`);return d};try{let{file:c,raw:d}=await b("/api/memory/entries/delete",{id:a.id});l(b=>(b??[]).filter(b=>b.id!==a.id)),q(null),(0,Y.undoToast)(`Deleted ${a.id}`,async()=>{await b("/api/memory/entries/restore",{file:c,raw:d}),o(),q(a.id)})}catch(a){(0,Y.toast)(`Delete failed: ${a instanceof Error?a.message:String(a)}`)}},[f,q,o]);return(0,b.jsx)(X,{memory:a?.memory??null,entries:k,rootParam:f,selectedId:m?null:i,creating:m,onOpen:q,onNew:()=>n(!0),onClose:()=>q(null),onDelete:r,view:j,onView:a=>p(i,a),onSaved:a=>{l(b=>[...(b??[]).filter(b=>b.id!==a.id),a]),q(a.id)}})}a.s(["default",0,function(){return(0,b.jsx)(c.Suspense,{children:(0,b.jsx)(Z,{})})}],892519)}];
|
|
12
|
+
|
|
13
|
+
//# sourceMappingURL=src_app_%28app%29_memory_page_tsx_19jhb1c._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/app/%28app%29/memory/page.tsx","../../../../src/components/memory/EntryList.tsx","../../../../src/components/memory/EntryDetail.tsx","../../../../src/components/memory/MemoryTab.tsx","../../../../src/components/memory/EntryRelated.tsx","../../../../src/components/memory/EntryHistory.tsx","../../../../src/components/memory/MemoryGraph.tsx","../../../../src/lib/entries.ts","../../../../src/lib/recall.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/git-commit-horizontal.ts","../../../../src/lib/memory-graph.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/lightbulb.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/flag.ts"],"sourcesContent":["\"use client\"\n\nimport { Suspense, useCallback, useEffect, useState } from \"react\"\nimport { useRouter, useSearchParams } from \"next/navigation\"\nimport { useApp } from \"@/context/AppContext\"\nimport { MemoryTab } from \"@/components/memory/MemoryTab\"\nimport { toast, undoToast } from \"@/components/ui/toast\"\nimport type { Entry } from \"@/lib/entries\"\n\nexport default function MemoryPage() {\n return (\n <Suspense>\n <MemoryPageInner />\n </Suspense>\n )\n}\n\nfunction MemoryPageInner() {\n const { summary, rootParam } = useApp()\n const router = useRouter()\n // ?entry=E012 is the open entry and ?view=graph the Graph view, so a link or a reload keeps both\n const params = useSearchParams()\n const selectedId = params.get(\"entry\")\n const view = params.get(\"view\") === \"graph\" ? \"graph\" : \"list\"\n const [entries, setEntries] = useState<Entry[] | null>(null)\n const [creating, setCreating] = useState(false)\n\n const load = useCallback(() => {\n let live = true\n fetch(`/api/memory/entries${rootParam}`)\n .then((r) => r.json())\n .then((d: { entries?: Entry[] }) => { if (live) setEntries(d.entries ?? []) })\n .catch((e) => {\n console.warn(\"Loading memory entries failed\", e)\n if (live) setEntries([])\n })\n return () => { live = false }\n }, [rootParam])\n\n // AppContext replaces `summary` on every memory_updated SSE event, so refetch the entries with it\n useEffect(() => load(), [load, summary])\n\n const go = useCallback((entry: string | null, v: \"list\" | \"graph\") => {\n const q = new URLSearchParams()\n if (v === \"graph\") q.set(\"view\", \"graph\")\n if (entry) q.set(\"entry\", entry)\n router.replace(q.size ? `/memory?${q}` : \"/memory\", { scroll: false })\n }, [router])\n const select = useCallback((id: string | null) => {\n setCreating(false)\n go(id, view)\n }, [go, view])\n\n // No confirm: delete now, offer Undo (restores the same file), like tasks and docs\n const remove = useCallback(async (entry: Entry) => {\n const post = async (url: string, body: object) => {\n const res = await fetch(`${url}${rootParam}`, { method: \"POST\", headers: { \"content-type\": \"application/json\" }, body: JSON.stringify(body) })\n const data = await res.json().catch(() => ({}))\n if (!res.ok) throw new Error(data.error ?? `Request failed (${res.status})`)\n return data\n }\n try {\n const { file, raw } = await post(\"/api/memory/entries/delete\", { id: entry.id })\n setEntries((list) => (list ?? []).filter((e) => e.id !== entry.id))\n select(null)\n undoToast(`Deleted ${entry.id}`, async () => {\n await post(\"/api/memory/entries/restore\", { file, raw })\n load()\n select(entry.id)\n })\n } catch (e) {\n toast(`Delete failed: ${e instanceof Error ? e.message : String(e)}`)\n }\n }, [rootParam, select, load])\n\n return (\n <MemoryTab\n memory={summary?.memory ?? null}\n entries={entries}\n rootParam={rootParam}\n selectedId={creating ? null : selectedId}\n creating={creating}\n onOpen={select}\n onNew={() => setCreating(true)}\n onClose={() => select(null)}\n onDelete={remove}\n view={view}\n onView={(v) => go(selectedId, v)}\n onSaved={(entry) => {\n // show the saved text now; the SSE refetch confirms it\n setEntries((list) => [...(list ?? []).filter((e) => e.id !== entry.id), entry])\n select(entry.id)\n }}\n />\n )\n}\n","\"use client\"\n\nimport { useMemo, useState } from \"react\"\nimport { Plus, Search } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\nimport { Input } from \"@/components/ui/input\"\nimport { OwnerChip } from \"@/components/shared/OwnerChip\"\nimport { ENTRY_TYPES, type Entry, type EntryType } from \"@/lib/entries\"\nimport { filterEntries, tokenize } from \"@/lib/recall\"\n\n/** Knowledge entries (R046) with search (ranked like vibedoc_recall) and a type filter. */\nexport function EntryList({ entries, selectedId, onOpen, onNew }: {\n entries: Entry[]\n selectedId?: string | null\n onOpen: (id: string) => void\n onNew: () => void\n}) {\n const [query, setQuery] = useState(\"\")\n const [type, setType] = useState<EntryType | null>(null)\n const shown = useMemo(() => filterEntries(entries, { query, type }), [entries, query, type])\n const counts = useMemo(() => {\n const c: Record<string, number> = {}\n for (const e of entries) c[e.type] = (c[e.type] ?? 0) + 1\n return c\n }, [entries])\n const searching = tokenize(query).length > 0\n\n const chip = (value: EntryType | null, label: string, count: number) => (\n <button\n key={label}\n type=\"button\"\n aria-pressed={type === value}\n onClick={() => setType(value)}\n className={cn(\n \"h-6 rounded-[5px] border border-transparent px-2 text-xs font-medium text-muted outline-none transition-colors\",\n \"hover:bg-surface2 hover:text-txt focus-visible:ring-2 focus-visible:ring-accent\",\n type === value && \"border-border2 bg-surface2 text-txt\",\n )}\n >\n {label} <span className=\"font-mono text-[10px] opacity-70\">{count}</span>\n </button>\n )\n\n return (\n <section aria-label=\"Knowledge entries\" className=\"flex min-w-0 flex-col gap-3\">\n <div className=\"flex items-baseline justify-between\">\n <h2 className=\"font-display text-base font-semibold tracking-tight\">Knowledge entries</h2>\n <button\n type=\"button\"\n onClick={onNew}\n className=\"inline-flex items-center gap-1 rounded-md px-2 py-1 text-xs font-medium text-muted outline-none hover:bg-surface2 hover:text-txt focus-visible:ring-2 focus-visible:ring-accent\"\n >\n <Plus className=\"size-3.5\" aria-hidden /> New entry\n </button>\n </div>\n\n <div className=\"relative\">\n <Search className=\"pointer-events-none absolute left-2.5 top-1/2 size-3.5 -translate-y-1/2 text-muted\" aria-hidden />\n <Input\n id=\"memory-search\"\n type=\"search\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder=\"Search entries…\"\n aria-label=\"Search entries\"\n className=\"h-8 pl-8\"\n />\n </div>\n\n <div role=\"group\" aria-label=\"Filter by type\" className=\"flex flex-wrap gap-1\">\n {chip(null, \"All\", entries.length)}\n {ENTRY_TYPES.map((t) => chip(t, t, counts[t] ?? 0))}\n </div>\n\n {entries.length === 0 ? (\n <p className=\"rounded-xl border border-dashed border-border p-4 text-sm text-muted\">\n No knowledge entries yet. Agents save them with <code className=\"font-mono text-xs\">vibedoc_save_entry</code>.\n </p>\n ) : shown.length === 0 ? (\n <p className=\"p-2 text-sm text-muted\">\n No entries match {searching ? `\"${query.trim()}\"` : \"this filter\"}.\n </p>\n ) : (\n <ul className=\"flex flex-col divide-y divide-border rounded-xl border border-border bg-surface\">\n {shown.map((e) => (\n <li key={e.id}>\n <button\n type=\"button\"\n onClick={() => onOpen(e.id)}\n aria-current={e.id === selectedId ? \"true\" : undefined}\n className={cn(\n \"flex w-full flex-col gap-0.5 px-3 py-2 text-left outline-none transition-colors hover:bg-surface2 focus-visible:bg-surface2\",\n e.id === selectedId && \"bg-surface2 shadow-[inset_2px_0_0_var(--color-accent)]\",\n )}\n >\n <span className=\"flex items-center gap-2 font-mono text-[11px] text-muted\">\n <span>{e.id}</span>\n <span>·</span>\n <span>{e.type}</span>\n <span className=\"ml-auto flex items-center gap-2\">\n <OwnerChip owner={e.by} className=\"font-sans\" />\n {e.updatedAt}\n </span>\n </span>\n <span className=\"text-sm text-txt\">{e.summary}</span>\n </button>\n </li>\n ))}\n </ul>\n )}\n </section>\n )\n}\n","\"use client\"\n\nimport { useEffect, useState, type ReactNode } from \"react\"\nimport { Pencil, Trash2, X } from \"lucide-react\"\nimport { Button } from \"@/components/ui/button\"\nimport { Input } from \"@/components/ui/input\"\nimport { ItemPanelHeader } from \"@/components/shared/ItemPanelHeader\"\nimport { OwnerChip } from \"@/components/shared/OwnerChip\"\nimport { MarkdownRenderer } from \"@/components/docs/MarkdownRenderer\"\nimport { ENTRY_TYPES, validateEntryInput, type Entry, type EntryType } from \"@/lib/entries\"\n\ntype Draft = { type: EntryType; summary: string; body: string }\n\n/**\n * One knowledge entry: read view with Edit, or the edit form. `entry` null = a new entry (form only).\n * R053 adds its panels (Related, History) under the body via `children`.\n */\nexport function EntryDetail({ entry, rootParam, onSaved, onDelete, onClose, children }: {\n entry: Entry | null\n rootParam: string\n onSaved: (entry: Entry) => void\n onDelete: (entry: Entry) => void\n onClose: () => void\n children?: ReactNode\n}) {\n const [editing, setEditing] = useState(entry === null)\n const [draft, setDraft] = useState<Draft>(() => toDraft(entry))\n const [error, setError] = useState<string | null>(null)\n const [saving, setSaving] = useState(false)\n\n const startEdit = () => { setDraft(toDraft(entry)); setError(null); setEditing(true) }\n const cancel = () => { if (entry) { setEditing(false); setError(null) } else onClose() }\n\n const save = async () => {\n // same rules as the server, so a bad summary never costs a request\n const invalid = validateEntryInput({ ...draft, id: entry?.id })\n if (invalid) { setError(invalid); return }\n setSaving(true)\n setError(null)\n try {\n const res = await fetch(`/api/memory/entries/save${rootParam}`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ ...(entry ? { id: entry.id } : {}), ...draft }),\n })\n const data = (await res.json().catch(() => ({}))) as { entry?: Entry; error?: string }\n if (!res.ok || !data.entry) throw new Error(data.error ?? `Save failed (${res.status})`)\n setEditing(false)\n onSaved(data.entry)\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e))\n } finally {\n setSaving(false)\n }\n }\n\n // ⌫ / Delete deletes the open entry, unless the user is typing somewhere\n useEffect(() => {\n if (editing || !entry) return\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== \"Backspace\" && e.key !== \"Delete\") return\n if (e.metaKey || e.ctrlKey || e.altKey) return\n const t = e.target as HTMLElement | null\n if (t && (t.isContentEditable || [\"INPUT\", \"TEXTAREA\", \"SELECT\"].includes(t.tagName))) return\n e.preventDefault()\n onDelete(entry)\n }\n window.addEventListener(\"keydown\", onKey)\n return () => window.removeEventListener(\"keydown\", onKey)\n }, [editing, entry, onDelete])\n\n const closeButton = (\n <button type=\"button\" onClick={onClose} aria-label=\"Close entry\" className=\"rounded p-1 text-muted hover:bg-surface2 hover:text-txt\">\n <X className=\"size-3.5\" />\n </button>\n )\n\n if (editing) {\n return (\n <section aria-label={entry ? `Edit ${entry.id}` : \"New entry\"} className=\"rounded-xl border border-border bg-surface\">\n <form\n onSubmit={(e) => { e.preventDefault(); void save() }}\n onKeyDown={(e) => {\n if (e.key === \"Escape\") { e.preventDefault(); cancel() }\n if (e.key === \"Enter\" && (e.metaKey || e.ctrlKey)) { e.preventDefault(); void save() }\n }}\n className=\"flex flex-col gap-3 p-5\"\n >\n <div className=\"flex items-center justify-between font-mono text-[11px] text-muted\">\n <span>{entry ? `${entry.id} · editing` : \"New entry\"}</span>\n {closeButton}\n </div>\n <label className=\"flex flex-col gap-1 text-xs text-muted\">\n Type\n <select\n value={draft.type}\n onChange={(e) => setDraft({ ...draft, type: e.target.value as EntryType })}\n className=\"h-8 rounded-md border border-border bg-bg px-2 text-sm text-txt focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent\"\n >\n {ENTRY_TYPES.map((t) => <option key={t} value={t}>{t}</option>)}\n </select>\n </label>\n <label className=\"flex flex-col gap-1 text-xs text-muted\">\n Summary (one line)\n <Input\n autoFocus\n value={draft.summary}\n onChange={(e) => setDraft({ ...draft, summary: e.target.value })}\n maxLength={200}\n className=\"h-8 text-txt\"\n />\n </label>\n <label className=\"flex flex-col gap-1 text-xs text-muted\">\n Details (markdown)\n <textarea\n value={draft.body}\n onChange={(e) => setDraft({ ...draft, body: e.target.value })}\n rows={8}\n className=\"w-full resize-y rounded-md border border-border bg-bg px-3 py-2 font-mono text-xs text-txt focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent\"\n />\n </label>\n {error && <p role=\"alert\" className=\"text-xs text-danger\">{error}</p>}\n <div className=\"flex items-center justify-end gap-2\">\n <span className=\"mr-auto text-[11px] text-muted\">⌘↵ save · Esc cancel</span>\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={cancel}>Cancel</Button>\n <Button type=\"submit\" size=\"sm\" disabled={saving}>{saving ? \"Saving…\" : \"Save\"}</Button>\n </div>\n </form>\n </section>\n )\n }\n\n if (!entry) return null\n return (\n <section aria-label={entry.id} className=\"rounded-xl border border-border bg-surface\">\n <ItemPanelHeader\n kicker={<span>{entry.id} · entry</span>}\n menu={\n <span className=\"flex items-center gap-1\">\n <Button variant=\"ghost\" size=\"sm\" onClick={startEdit} className=\"h-7 px-2 text-xs\">\n <Pencil className=\"size-3.5\" /> Edit\n </Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => onDelete(entry)} title=\"Delete (⌫)\" className=\"h-7 px-2 text-xs hover:text-danger\">\n <Trash2 className=\"size-3.5\" /> Delete\n </Button>\n {closeButton}\n </span>\n }\n title={entry.summary}\n properties={[\n { label: \"Type\", value: entry.type },\n { label: \"Updated\", value: entry.updatedAt || null },\n { label: \"Changed by\", value: entry.by ? <OwnerChip owner={entry.by} className=\"text-xs text-txt\" /> : null },\n { label: \"File\", value: <span className=\"truncate font-mono text-[11px] text-muted\">{entry.file}</span> },\n ]}\n />\n <div className=\"p-5\">\n {entry.body ? <MarkdownRenderer content={entry.body} /> : <p className=\"text-sm text-muted\">No details.</p>}\n {children}\n </div>\n </section>\n )\n}\n\nfunction toDraft(entry: Entry | null): Draft {\n return entry ? { type: entry.type, summary: entry.summary, body: entry.body } : { type: \"convention\", summary: \"\", body: \"\" }\n}\n","import { MarkdownRenderer } from \"@/components/docs/MarkdownRenderer\"\r\nimport { EmptyState } from \"@/components/shared/EmptyState\"\r\nimport type { Entry } from \"@/lib/entries\"\r\nimport { EntryList } from \"./EntryList\"\r\nimport { EntryDetail } from \"./EntryDetail\"\r\nimport { EntryRelated } from \"./EntryRelated\"\r\nimport { EntryHistory } from \"./EntryHistory\"\r\nimport { MemoryGraph } from \"./MemoryGraph\"\r\nimport { cn } from \"@/lib/utils\"\r\n\r\ninterface MemoryTabProps {\r\n memory: { content: string; exists: boolean } | null\r\n /** null while loading */\r\n entries: Entry[] | null\r\n rootParam: string\r\n /** The open entry id (from ?entry=), or null */\r\n selectedId: string | null\r\n /** The New entry form is open */\r\n creating: boolean\r\n onOpen: (id: string) => void\r\n onNew: () => void\r\n onClose: () => void\r\n onSaved: (entry: Entry) => void\r\n onDelete: (entry: Entry) => void\r\n view: \"list\" | \"graph\"\r\n onView: (view: \"list\" | \"graph\") => void\r\n}\r\n\r\nexport function MemoryTab({ memory, entries, rootParam, selectedId, creating, onOpen, onNew, onClose, onSaved, onDelete, view, onView }: MemoryTabProps) {\r\n const selected = selectedId ? entries?.find((e) => e.id === selectedId) : undefined\r\n return (\r\n <div className={cn(\r\n \"grid items-start gap-6 p-6\",\r\n view === \"graph\" ? \"lg:grid-cols-[minmax(0,1fr)_minmax(0,30rem)]\" : \"lg:grid-cols-[minmax(280px,380px)_minmax(0,42rem)]\",\r\n )}>\r\n <div className=\"flex items-center justify-between gap-4 lg:col-span-2\">\r\n <h1 className=\"font-display text-xl font-semibold tracking-tight\">Memory</h1>\r\n <div role=\"group\" aria-label=\"Entries view\" className=\"flex rounded-md border border-border p-0.5\">\r\n {([\"list\", \"graph\"] as const).map((v) => (\r\n <button\r\n key={v}\r\n type=\"button\"\r\n aria-pressed={view === v}\r\n onClick={() => onView(v)}\r\n className={cn(\r\n \"h-6 rounded-[5px] border border-transparent px-2.5 text-xs font-medium capitalize text-muted outline-none transition-colors\",\r\n \"hover:bg-surface2 hover:text-txt focus-visible:ring-2 focus-visible:ring-accent\",\r\n view === v && \"border-border2 bg-surface2 text-txt\",\r\n )}\r\n >\r\n {v}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n {entries && view === \"graph\" ? (\r\n <MemoryGraph entries={entries} selectedId={selectedId} onOpenEntry={onOpen} />\r\n ) : entries ? (\r\n <EntryList entries={entries} selectedId={selectedId} onOpen={onOpen} onNew={onNew} />\r\n ) : (\r\n <p className=\"text-sm text-muted\">Loading entries…</p>\r\n )}\r\n {creating || selected ? (\r\n <div className=\"min-w-0 lg:sticky lg:top-6\">\r\n <EntryDetail key={creating ? \"new\" : selected?.id} entry={creating ? null : selected ?? null} rootParam={rootParam} onSaved={onSaved} onDelete={onDelete} onClose={onClose}>\r\n {selected && !creating && (\r\n <>\r\n <EntryRelated entryId={selected.id} onOpenEntry={onOpen} />\r\n <EntryHistory entryId={selected.id} />\r\n </>\r\n )}\r\n </EntryDetail>\r\n </div>\r\n ) : selectedId && entries ? (\r\n <div role=\"alert\" className=\"min-w-0 rounded-xl border border-dashed border-border p-5 text-sm text-muted\">\r\n Entry {selectedId} not found.{\" \"}\r\n <button type=\"button\" onClick={onClose} className=\"text-txt underline underline-offset-2\">Show the handoff</button>\r\n </div>\r\n ) : (\r\n <div className=\"min-w-0\">\r\n <div className=\"flex items-baseline justify-between mb-3\">\r\n <h2 className=\"font-display text-base font-semibold tracking-tight\">Session handoff</h2>\r\n <span className=\"text-xs font-mono text-muted\">memory/MEMORY.md</span>\r\n </div>\r\n\r\n {memory?.exists ? (\r\n <div className=\"bg-surface border border-border rounded-xl p-5\">\r\n <MarkdownRenderer content={memory.content} />\r\n </div>\r\n ) : (\r\n <EmptyState\r\n icon=\"🧠\"\r\n message=\"No MEMORY.md yet.\"\r\n subMessage=\"AI will create one at the end of the first session.\"\r\n bordered\r\n />\r\n )}\r\n\r\n <div className=\"mt-4 p-4 bg-surface2 border border-border rounded-xl\">\r\n <p className=\"text-xs font-mono text-muted mb-2\">\r\n Add to your CLAUDE.md system prompt:\r\n </p>\r\n <pre className=\"text-xs font-mono text-accent/80 whitespace-pre-wrap leading-relaxed\">{`At session start:\r\n1. Call vibedoc_read_memory\r\n2. Call vibedoc_get_status\r\n\r\nWhen you learn a fact that should still hold next week:\r\n- Call vibedoc_save_entry (convention, gotcha, decision, preference)\r\n\r\nAt session end:\r\n- Call vibedoc_update_memory with full handoff`}</pre>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}\r\n","\"use client\"\n\nimport { useEffect, useMemo, useState } from \"react\"\nimport { useRouter } from \"next/navigation\"\nimport { BookOpen, FileText, Flag, Lightbulb, Scale } from \"lucide-react\"\nimport { useApp } from \"@/context/AppContext\"\nimport { StatusIcon } from \"@/components/shared/StatusIcon\"\nimport { displayStatus } from \"@/lib/statuses\"\nimport type { GraphNode, MemoryGraph, NodeKind } from \"@/lib/memory-graph\"\n\nconst GROUPS: { kind: NodeKind; label: string }[] = [\n { kind: \"task\", label: \"Tasks\" },\n { kind: \"epic\", label: \"Epics\" },\n { kind: \"adr\", label: \"ADRs\" },\n { kind: \"doc\", label: \"Docs\" },\n { kind: \"entry\", label: \"Entries\" },\n]\nexport const KIND_ICON = { epic: Flag, adr: Scale, doc: FileText, entry: Lightbulb, task: BookOpen } as const\n\n/** Open a graph node where it lives: a task on /board, an epic on /roadmap, a doc or ADR in Docs, an entry here. */\nexport function useOpenNode(onOpenEntry: (id: string) => void) {\n const router = useRouter()\n const { openDoc } = useApp()\n return (n: GraphNode) => {\n if (n.kind === \"task\") router.push(`/board?task=${n.id}`)\n else if (n.kind === \"epic\") router.push(`/roadmap?item=${n.id}`)\n else if (n.kind === \"entry\") onOpenEntry(n.id)\n else void openDoc(n.path)\n }\n}\n\n/**\n * What an entry links to and what links back (R053), from GET /api/memory/graph?entry=.\n * Links are inferred from text, so the way to change them is to edit the entry.\n */\nexport function EntryRelated({ entryId, onOpenEntry }: { entryId: string; onOpenEntry: (id: string) => void }) {\n const { rootParam, summary, board } = useApp()\n const open = useOpenNode(onOpenEntry)\n const [graph, setGraph] = useState<MemoryGraph | null>(null)\n\n // refetch when the entry changes and on every memory_updated SSE event (AppContext replaces `summary`)\n useEffect(() => {\n let live = true\n fetch(`/api/memory/graph${rootParam}&entry=${encodeURIComponent(entryId)}`)\n .then((r) => r.json())\n .then((g: MemoryGraph) => { if (live) setGraph(g.nodes ? g : { nodes: [], edges: [] }) })\n .catch((e) => {\n console.warn(\"Loading entry links failed\", e)\n if (live) setGraph({ nodes: [], edges: [] })\n })\n return () => { live = false }\n }, [entryId, rootParam, summary])\n\n const tasks = useMemo(() => new Map(Object.values(board ?? {}).flat().map((t) => [t.id, t])), [board])\n const byId = useMemo(() => new Map((graph?.nodes ?? []).map((n) => [n.id, n])), [graph])\n const pick = (ids: string[]) => ids.map((id) => byId.get(id)).filter((n): n is GraphNode => !!n)\n const linksTo = pick((graph?.edges ?? []).filter((e) => e.from === entryId).map((e) => e.to))\n const linkedFrom = pick((graph?.edges ?? []).filter((e) => e.to === entryId).map((e) => e.from))\n\n const row = (n: GraphNode) => {\n const task = n.kind === \"task\" ? tasks.get(n.id) : undefined\n const Icon = KIND_ICON[n.kind]\n return (\n <li key={n.id}>\n <button\n type=\"button\"\n onClick={() => open(n)}\n title={n.path}\n className=\"flex w-full items-center gap-2 rounded-md px-2 py-1 text-left text-sm outline-none hover:bg-surface2 focus-visible:ring-2 focus-visible:ring-accent\"\n >\n {task ? <StatusIcon status={displayStatus(task)} className=\"size-3.5 shrink-0\" /> : <Icon className=\"size-3.5 shrink-0 text-muted\" aria-hidden />}\n {n.kind !== \"doc\" && <span className=\"shrink-0 font-mono text-[11px] text-muted\">{n.id}</span>}\n <span className=\"min-w-0 truncate text-txt\">{n.label}</span>\n </button>\n </li>\n )\n }\n\n const section = (title: string, nodes: GraphNode[]) => (\n <div className=\"flex flex-col gap-1.5\">\n <h4 className=\"text-[11px] font-semibold uppercase tracking-wider text-muted\">{title}</h4>\n {GROUPS.map(({ kind, label }) => {\n const group = nodes.filter((n) => n.kind === kind)\n if (!group.length) return null\n return (\n <div key={kind}>\n <p className=\"px-2 text-[11px] text-muted\">{label}</p>\n <ul>{group.map(row)}</ul>\n </div>\n )\n })}\n </div>\n )\n\n return (\n <section aria-label=\"Related\" className=\"mt-5 flex flex-col gap-3 border-t border-border pt-4\">\n <h3 className=\"text-xs font-semibold text-txt\">Related</h3>\n {graph === null ? (\n <p className=\"text-xs text-muted\">Loading links…</p>\n ) : !linksTo.length && !linkedFrom.length ? (\n <p className=\"text-xs text-muted\">No links yet. Mention a task, epic or doc in the entry to link it.</p>\n ) : (\n <>\n {linksTo.length > 0 && section(\"Links to\", linksTo)}\n {linkedFrom.length > 0 && section(\"Linked from\", linkedFrom)}\n </>\n )}\n </section>\n )\n}\n","\"use client\"\n\nimport { useState } from \"react\"\nimport { ChevronRight, GitCommitHorizontal, X } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\nimport { useApp } from \"@/context/AppContext\"\nimport type { FileCommit, FileHistory } from \"@/lib/core\"\n\n/**\n * How an entry changed over time (R053): the commits that touched its file, from git.\n * Collapsed by default; nothing is fetched until it is opened. A row shows that version read-only.\n */\nexport function EntryHistory({ entryId }: { entryId: string }) {\n const { rootParam } = useApp()\n const [open, setOpen] = useState(false)\n const [data, setData] = useState<FileHistory | null>(null)\n const [error, setError] = useState<string | null>(null)\n const [version, setVersion] = useState<{ commit: FileCommit; text: string } | null>(null)\n const base = `/api/memory/history${rootParam}&entry=${encodeURIComponent(entryId)}`\n\n const get = async <T,>(url: string): Promise<T> => {\n const res = await fetch(url)\n const body = await res.json().catch(() => ({}))\n if (!res.ok) throw new Error(body.error ?? `Request failed (${res.status})`)\n return body as T\n }\n\n const toggle = async () => {\n const next = !open\n setOpen(next)\n if (!next || data) return\n try {\n setData(await get<FileHistory>(base))\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e))\n }\n }\n\n const show = async (commit: FileCommit) => {\n try {\n const { text } = await get<{ text: string }>(`${base}&sha=${commit.sha}`)\n setVersion({ commit, text })\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e))\n }\n }\n\n return (\n <section aria-label=\"History\" className=\"mt-4 border-t border-border pt-3\">\n <button\n type=\"button\"\n onClick={toggle}\n aria-expanded={open}\n className=\"flex items-center gap-1 rounded text-xs font-semibold text-txt outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n >\n <ChevronRight className={cn(\"size-3.5 text-muted transition-transform\", open && \"rotate-90\")} aria-hidden />\n History\n </button>\n\n {open && (\n <div className=\"mt-2 flex flex-col gap-2\">\n {error && <p role=\"alert\" className=\"text-xs text-danger\">{error}</p>}\n {!data && !error && <p className=\"text-xs text-muted\">Loading history…</p>}\n {data?.reason === \"no-git\" && <p className=\"text-xs text-muted\">History needs git: this project is not a git repository.</p>}\n {data && !data.reason && !data.history.length && !data.uncommitted && (\n <p className=\"text-xs text-muted\">Not committed yet.</p>\n )}\n {data && (data.uncommitted || data.history.length > 0) && (\n <ul className=\"flex flex-col\">\n {data.uncommitted && (\n <li className=\"flex items-center gap-2 px-2 py-1 text-xs text-muted\">\n <span className=\"size-1.5 rounded-full bg-accent\" aria-hidden /> Uncommitted changes\n </li>\n )}\n {data.history.map((c) => (\n <li key={c.sha}>\n <button\n type=\"button\"\n onClick={() => show(c)}\n aria-current={version?.commit.sha === c.sha ? \"true\" : undefined}\n className={cn(\n \"flex w-full items-center gap-2 rounded-md px-2 py-1 text-left text-xs outline-none hover:bg-surface2 focus-visible:ring-2 focus-visible:ring-accent\",\n version?.commit.sha === c.sha && \"bg-surface2\",\n )}\n >\n <GitCommitHorizontal className=\"size-3.5 shrink-0 text-muted\" aria-hidden />\n <span className=\"shrink-0 font-mono text-[11px] text-muted\">{c.date.slice(0, 10)}</span>\n <span className=\"min-w-0 flex-1 truncate text-txt\">{c.subject}</span>\n <span className=\"shrink-0 text-muted\">{c.author}</span>\n </button>\n </li>\n ))}\n </ul>\n )}\n {version && (\n <div className=\"rounded-md border border-border bg-bg\">\n <div className=\"flex items-center justify-between border-b border-border px-3 py-1.5 font-mono text-[11px] text-muted\">\n <span>{version.commit.sha.slice(0, 7)} · {version.commit.date.slice(0, 10)} · read-only</span>\n <button type=\"button\" onClick={() => setVersion(null)} aria-label=\"Close version\" className=\"rounded p-0.5 hover:text-txt\">\n <X className=\"size-3.5\" />\n </button>\n </div>\n <pre className=\"max-h-72 overflow-auto whitespace-pre-wrap p-3 font-mono text-xs text-txt\">{version.text}</pre>\n </div>\n )}\n </div>\n )}\n </section>\n )\n}\n","\"use client\"\n\nimport { memo, useEffect, useMemo, useState, useSyncExternalStore } from \"react\"\nimport { Background, BackgroundVariant, Controls, Handle, Position, ReactFlow, type Edge, type Node, type NodeProps } from \"@xyflow/react\"\nimport \"@xyflow/react/dist/style.css\"\nimport { cn } from \"@/lib/utils\"\nimport { useApp } from \"@/context/AppContext\"\nimport { StatusIcon } from \"@/components/shared/StatusIcon\"\nimport { displayStatus } from \"@/lib/statuses\"\nimport type { Entry } from \"@/lib/entries\"\nimport { GRAPH_COL_W, graphLayout, type GraphNode, type MemoryGraph as Graph } from \"@/lib/memory-graph\"\nimport { KIND_ICON, useOpenNode } from \"./EntryRelated\"\n\ntype MemNodeData = { node: GraphNode; status?: string; unlinked: boolean; dim: boolean; active: boolean }\ntype MemNode = Node<MemNodeData, \"mem\">\n\nconst NODE_W = GRAPH_COL_W - 44\nconst FLOW_STYLE = { \"--xy-background-color\": \"var(--color-bg)\" } as React.CSSProperties\n// ponytail: above this many nodes only the ones on screen render; measured smooth at 240 entries either way\nconst VIRTUALIZE_OVER = 150\n// fitting a wide graph shrinks the text past reading; below this zoom, centre it and let the user pan\nconst FIT_MIN_ZOOM = 0.8\n\nfunction subscribeTheme(cb: () => void) {\n const mo = new MutationObserver(cb)\n mo.observe(document.documentElement, { attributes: true, attributeFilter: [\"class\"] })\n return () => mo.disconnect()\n}\n\n/** One node: kind icon (or task status), id, label. Handles left and right; edges pick a side by column. */\nconst MemNodeView = memo(function MemNodeView({ data }: NodeProps<MemNode>) {\n const { node, status, unlinked, dim, active } = data\n const Icon = KIND_ICON[node.kind]\n return (\n <div\n title={node.path}\n style={{ width: NODE_W }}\n className={cn(\n \"flex items-center gap-2 rounded-md border bg-surface px-2.5 py-1.5 text-xs transition-opacity\",\n node.kind === \"entry\" ? \"border-border2\" : \"border-border\",\n active && \"border-accent ring-1 ring-accent\",\n unlinked && \"border-dashed opacity-60\",\n dim && \"opacity-25\",\n )}\n >\n {[\"l\", \"r\"].map((side) => (\n <span key={side}>\n <Handle id={side} type=\"source\" position={side === \"l\" ? Position.Left : Position.Right} isConnectable={false} className=\"opacity-0\" />\n <Handle id={`${side}-t`} type=\"target\" position={side === \"l\" ? Position.Left : Position.Right} isConnectable={false} className=\"opacity-0\" />\n </span>\n ))}\n {status ? <StatusIcon status={status} className=\"size-3.5 shrink-0\" /> : <Icon className={cn(\"size-3.5 shrink-0\", node.kind === \"entry\" ? \"text-accent\" : \"text-muted\")} aria-hidden />}\n {node.kind !== \"doc\" && <span className=\"shrink-0 font-mono text-[10px] text-muted\">{node.id}</span>}\n <span className={cn(\"min-w-0 truncate\", node.kind === \"entry\" ? \"text-txt\" : \"text-muted\")}>{node.label}</span>\n </div>\n )\n})\nconst nodeTypes = { mem: MemNodeView }\n\n/**\n * Entries and the tasks, epics, ADRs and docs they link to (R053). Deterministic layout from graphLayout();\n * selecting an entry highlights it and its neighbours. Refetches on every memory_updated SSE event.\n */\nexport function MemoryGraph({ entries, selectedId, onOpenEntry }: { entries: Entry[]; selectedId: string | null; onOpenEntry: (id: string) => void }) {\n const { rootParam, summary, board } = useApp()\n const open = useOpenNode(onOpenEntry)\n const [graph, setGraph] = useState<Graph | null>(null)\n const isDark = useSyncExternalStore(subscribeTheme, () => document.documentElement.classList.contains(\"dark\"), () => true)\n\n useEffect(() => {\n let live = true\n fetch(`/api/memory/graph${rootParam}`)\n .then((r) => r.json())\n .then((g: Graph) => { if (live) setGraph(g.nodes ? g : { nodes: [], edges: [] }) })\n .catch((e) => {\n console.warn(\"Loading the memory graph failed\", e)\n if (live) setGraph({ nodes: [], edges: [] })\n })\n return () => { live = false }\n }, [rootParam, summary])\n\n const { nodes, edges } = useMemo(() => {\n if (!graph) return { nodes: [] as MemNode[], edges: [] as Edge[] }\n const types = Object.fromEntries(entries.map((e) => [e.id, e.type]))\n const pos = graphLayout(graph, types)\n const tasks = new Map(Object.values(board ?? {}).flat().map((t) => [t.id, t]))\n const linked = new Set(graph.edges.flatMap((e) => [e.from, e.to]))\n const focus = selectedId && pos[selectedId]\n ? new Set([selectedId, ...graph.edges.filter((e) => e.from === selectedId || e.to === selectedId).flatMap((e) => [e.from, e.to])])\n : null\n const nodes: MemNode[] = graph.nodes.map((n) => {\n const task = n.kind === \"task\" ? tasks.get(n.id) : undefined\n return {\n id: n.id,\n type: \"mem\",\n position: pos[n.id] ?? { x: 0, y: 0 },\n data: {\n node: n,\n status: task ? displayStatus(task) : undefined,\n unlinked: n.kind === \"entry\" && !linked.has(n.id),\n dim: !!focus && !focus.has(n.id),\n active: n.id === selectedId,\n },\n draggable: false,\n }\n })\n const edges: Edge[] = graph.edges.map((e) => {\n const fx = pos[e.from]?.x ?? 0, tx = pos[e.to]?.x ?? 0\n const leftward = tx < fx\n const hot = !!focus && (e.from === selectedId || e.to === selectedId)\n return {\n id: `${e.from}->${e.to}`,\n source: e.from,\n target: e.to,\n // same column (entry → entry) loops out and back on the right\n sourceHandle: leftward ? \"l\" : \"r\",\n targetHandle: leftward ? \"r-t\" : tx === fx ? \"r-t\" : \"l-t\",\n style: { stroke: hot ? \"var(--color-accent)\" : \"var(--color-border2)\", strokeWidth: hot ? 1.75 : 1, opacity: focus && !hot ? 0.15 : 1 },\n }\n })\n return { nodes, edges }\n }, [graph, entries, board, selectedId])\n\n if (!graph) return <p className=\"text-sm text-muted\">Loading graph…</p>\n if (!graph.nodes.length) return <p className=\"rounded-xl border border-dashed border-border p-4 text-sm text-muted\">No entries to draw yet.</p>\n\n return (\n <div aria-label=\"Memory graph\" className=\"h-[70vh] min-h-[420px] overflow-hidden rounded-xl border border-border\">\n <ReactFlow<MemNode>\n nodes={nodes}\n edges={edges}\n nodeTypes={nodeTypes}\n onNodeClick={(_, n) => open(n.data.node)}\n nodesConnectable={false}\n nodesDraggable={false}\n deleteKeyCode={null}\n colorMode={isDark ? \"dark\" : \"light\"}\n onlyRenderVisibleElements={nodes.length > VIRTUALIZE_OVER}\n fitView\n fitViewOptions={{ padding: 0.1, minZoom: FIT_MIN_ZOOM, maxZoom: 1 }}\n minZoom={0.1}\n style={FLOW_STYLE}\n >\n <Background variant={BackgroundVariant.Dots} gap={20} size={1} />\n <Controls showInteractive={false} />\n </ReactFlow>\n </div>\n )\n}\n","// Pure knowledge-entry parsing and formatting (R046, no fs). Self-check: node src/lib/entries.check.mts\n// One long-lived fact per file: memory/entries/E001-<slug>.md\n\nexport const ENTRY_TYPES = ['convention', 'gotcha', 'decision', 'preference'] as const\nexport type EntryType = typeof ENTRY_TYPES[number]\n\n/**\n * updatedAt = the `**Updated:**` date (YYYY-MM-DD); by = `**By:**` who saved it last (\"human\" | \"ai:<agent>\",\n * null in files from before R047); file = path relative to root.\n */\nexport type Entry = { id: string; type: EntryType; summary: string; body: string; updatedAt: string; by: string | null; file: string }\nexport type EntryInput = { id?: string; type: string; summary: string; body?: string }\n\nexport const SUMMARY_MAX = 120\n\nconst isEntryType = (s: string): s is EntryType => (ENTRY_TYPES as readonly string[]).includes(s)\n\n/** \"e1\" / \"E01\" / \"E001\" → \"E001\"; anything else → null. */\nexport function normalizeEntryId(s: string): string | null {\n const m = /^e(\\d+)$/i.exec(s.trim())\n if (!m) return null\n const n = Number(m[1])\n return n > 0 ? `E${String(n).padStart(3, '0')}` : null\n}\n\n/** One past the highest id: [] → \"E001\"; [\"E001\",\"E007\"] → \"E008\". */\nexport function nextEntryId(ids: string[]): string {\n const max = Math.max(0, ...ids.map(id => Number(normalizeEntryId(id)?.slice(1) ?? 0)))\n return `E${String(max + 1).padStart(3, '0')}`\n}\n\nexport function entrySlug(summary: string): string {\n return summary.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '').slice(0, 40).replace(/-$/, '')\n}\n\n/** null when the `# E001: summary` H1 or a known `**Type:**` is missing. */\nexport function parseEntry(raw: string, file: string): Entry | null {\n const lines = raw.replace(/\\r\\n/g, '\\n').split('\\n')\n const h1 = /^#\\s+(E\\d+):\\s*(.+?)\\s*$/i.exec(lines[0] ?? '')\n const id = h1 && normalizeEntryId(h1[1])\n if (!h1 || !id) return null\n // Contiguous **Key:** Value block under the H1, like task files\n const meta: Record<string, string> = {}\n let i = 1\n for (; i < lines.length; i++) {\n const m = /^\\*\\*(\\w+):\\*\\*\\s*(.*)$/.exec(lines[i])\n if (!m) break\n meta[m[1].toLowerCase()] = m[2].trim()\n }\n const type = meta.type ?? ''\n if (!isEntryType(type)) return null\n return { id, type, summary: h1[2], body: lines.slice(i).join('\\n').trim(), updatedAt: meta.updated ?? '', by: meta.by || null, file }\n}\n\nexport function formatEntry(e: Omit<Entry, 'file'>): string {\n const head = `# ${e.id}: ${e.summary}\\n**Type:** ${e.type}\\n**Updated:** ${e.updatedAt}\\n${e.by ? `**By:** ${e.by}\\n` : ''}`\n return e.body.trim() ? `${head}\\n${e.body.trim()}\\n` : head\n}\n\n/** Error message, or null when valid. Does not check whether an id exists. */\nexport function validateEntryInput(i: EntryInput): string | null {\n if (i.id !== undefined && !normalizeEntryId(String(i.id))) return `Invalid id \"${i.id}\": expected E followed by a number, e.g. E001`\n if (!isEntryType(String(i.type ?? ''))) return `Invalid type \"${i.type ?? ''}\": use one of ${ENTRY_TYPES.join(', ')}`\n const summary = String(i.summary ?? '').trim()\n if (!summary) return 'summary is required'\n if (/\\n/.test(summary)) return 'summary must be one line'\n if (summary.length > SUMMARY_MAX) return `summary is ${summary.length} characters; keep it to ${SUMMARY_MAX}`\n if (i.body !== undefined && typeof i.body !== 'string') return 'body must be a string'\n return null\n}\n","// Pure keyword recall over knowledge entries (R048, no fs). Self-check: node src/lib/recall.check.mts\n// Index first, bodies on request: agents get compact lines here and fetch bodies with vibedoc_get_entries.\n\nexport type RecallEntry = { id: string; type: string; summary: string; body: string; updatedAt: string }\nexport type RecallHit = { id: string; type: string; summary: string; tokens: number; score: number }\n\nconst STOPWORDS = new Set(('a an and are as at be but by can do does for from how i if in into is it its of on or ' +\n 'our so that the their then there these this to use used using was we what when where which who why will with you your').split(' '))\n\n/** Lowercase, split on non-alphanumerics, drop stopwords and 1-char tokens, naive plural strip (\"events\" → \"event\"). */\nexport function tokenize(s: string): string[] {\n return s.toLowerCase().split(/[^a-z0-9]+/)\n .filter(t => t.length > 1 && !STOPWORDS.has(t))\n // ponytail: plural strip only, no real stemmer; add one if recall misses obvious matches\n .map(t => (t.length > 3 && t.endsWith('s') && !t.endsWith('ss') ? t.slice(0, -1) : t))\n}\n\nexport function estimateTokens(s: string): number {\n return Math.ceil(s.length / 4)\n}\n\n/** Per query token: +3 in summary, +2 matches id or type, +1 in body. Score 0 dropped; ties → newest first. */\nexport function rankEntries(entries: RecallEntry[], query: string, opts: { type?: string; limit?: number } = {}): RecallHit[] {\n const q = [...new Set(tokenize(query))]\n if (!q.length) return []\n const hits: (RecallHit & { updatedAt: string })[] = []\n for (const e of entries) {\n if (opts.type && e.type !== opts.type) continue\n const summary = new Set(tokenize(e.summary))\n const body = new Set(tokenize(e.body))\n const idType = new Set([e.id.toLowerCase(), ...tokenize(e.type)])\n let score = 0\n for (const t of q) {\n if (summary.has(t)) score += 3\n if (idType.has(t)) score += 2\n if (body.has(t)) score += 1\n }\n if (score > 0) {\n hits.push({ id: e.id, type: e.type, summary: e.summary, tokens: estimateTokens(`${e.summary}\\n${e.body}`), score, updatedAt: e.updatedAt })\n }\n }\n hits.sort((a, b) => b.score - a.score || b.updatedAt.localeCompare(a.updatedAt))\n return hits.slice(0, opts.limit ?? 10).map(({ updatedAt: _, ...h }) => h)\n}\n\n/** \"E012 · convention · Only core.ts touches fs (~120 tok)\" */\nexport function formatCompactLine(h: RecallHit): string {\n return `${h.id} · ${h.type} · ${h.summary} (~${h.tokens} tok)`\n}\n\n/** Every entry as a compact hit, newest first: the session-start index order. */\nexport function indexHits(entries: RecallEntry[]): RecallHit[] {\n return [...entries].sort((a, b) => b.updatedAt.localeCompare(a.updatedAt) || a.id.localeCompare(b.id, 'en', { numeric: true }))\n .map(e => ({ id: e.id, type: e.type, summary: e.summary, tokens: estimateTokens(`${e.summary}\\n${e.body}`), score: 0 }))\n}\n\nexport const DEFAULT_SESSION_BUDGET = 2000\nconst INDEX_HINT = 'Save new facts with vibedoc_save_entry; fetch bodies with vibedoc_get_entries.'\n\n/**\n * Session start = the whole handoff + as many index lines (in the order given) as fit `budget` tokens,\n * then \"+N more\" when some were left out. Header, footer and hint count toward the budget. The handoff is never cut.\n */\nexport function fitToBudget(handoff: string, index: RecallHit[], budget: number):\n { text: string; shown: number; omitted: number; tokens: number } {\n const render = (n: number, warning?: string) => [\n handoff.trimEnd(), '',\n ...(warning ? [warning] : []),\n `## Knowledge entries (${index.length})`,\n ...index.slice(0, n).map(formatCompactLine),\n ...(n < index.length ? [`+${index.length - n} more entries — use vibedoc_recall { query }`] : []),\n INDEX_HINT,\n ].join('\\n')\n const fits = (n: number) => estimateTokens(render(n)) <= budget\n let text: string\n let shown = 0\n if (!fits(0)) {\n text = render(0, `⚠️ The handoff alone is ~${estimateTokens(handoff)} tokens, over the ${budget}-token session budget: trim memory/MEMORY.md.`)\n } else {\n // ponytail: re-renders per line (O(n²) chars); fine for hundreds of entries\n while (shown < index.length && fits(shown + 1)) shown++\n text = render(shown)\n }\n return { text, shown, omitted: index.length - shown, tokens: estimateTokens(text) }\n}\n\nexport const RELATED_MIN_SCORE = 3\nconst GOAL_CHARS = 500\n\n/** Recall query for a task: its title, the first 500 chars of its Goal, and the Phase epic title (id dropped). */\nexport function taskQuery(task: { title: string; phase?: string; raw?: string }): string {\n const goal = /^## Goal[ \\t]*\\n([\\s\\S]*?)(?=^## |(?![\\s\\S]))/m.exec(task.raw ?? '')?.[1].trim() ?? ''\n const epic = (task.phase ?? '').replace(/^R\\d+\\s*[—–-]\\s*/, '')\n return [task.title, goal.slice(0, GOAL_CHARS), epic].filter(Boolean).join(' ')\n}\n\n/** Only strong matches (at least one summary hit) → \"## Related memory\" block; '' when none qualify. */\nexport function formatRelated(hits: RecallHit[], limit = 3): string {\n const strong = hits.filter(h => h.score >= RELATED_MIN_SCORE).slice(0, limit)\n if (!strong.length) return ''\n return `## Related memory\\n${strong.map(formatCompactLine).join('\\n')}\\nFetch with vibedoc_get_entries`\n}\n\n/**\n * The Memory tab list (R047). No searchable words → the entries of `type`, newest first (session-start order).\n * Otherwise ranked like vibedoc_recall, so the UI and agents agree on the first hit. Returns the full entries.\n */\nexport function filterEntries<T extends RecallEntry>(entries: T[], opts: { query?: string; type?: string | null }): T[] {\n const pool = opts.type ? entries.filter(e => e.type === opts.type) : entries\n const byId = new Map(pool.map(e => [e.id, e]))\n const query = opts.query ?? ''\n const hits = tokenize(query).length ? rankEntries(pool, query, { limit: pool.length }) : indexHits(pool)\n return hits.map(h => byId.get(h.id)).filter((e): e is T => !!e)\n}\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'git-commit-horizontal',\n size: 24,\n node: [\n ['circle', { cx: '12', cy: '12', r: '3', key: '1v7zrd' }],\n ['line', { x1: '3', x2: '9', y1: '12', y2: '12', key: '1dyftd' }],\n ['line', { x1: '15', x2: '21', y1: '12', y2: '12', key: 'oup4p8' }],\n ],\n aliases: ['git-commit'],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name GitCommitHorizontal\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/git-commit-horizontal\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 GitCommitHorizontal = createLucideIcon(__iconData);\n\nexport default GitCommitHorizontal;\n","// Pure memory link graph (R053, no fs): links are inferred from text, never stored. Self-check: node src/lib/memory-graph.check.mts\n// Outgoing edges come from entry text; incoming edges from task, roadmap and doc files that mention an entry id.\n\nexport type NodeKind = 'entry' | 'task' | 'epic' | 'adr' | 'doc'\nexport type GraphNode = { id: string; kind: NodeKind; label: string; path: string }\nexport type GraphEdge = { from: string; to: string } // from mentions to\nexport type MemoryGraph = { nodes: GraphNode[]; edges: GraphEdge[] }\n/** A node plus the text scanned for its refs. */\nexport type GraphItem = GraphNode & { text: string }\n\n// Upper case only, whole tokens: \"XT0651\", \"e2e\" and \"T0651a\" don't match\nconst ID_RE = /(?<![A-Za-z0-9_-])(E\\d+|T\\d{3,}|R\\d{3,}|ADR-\\d+)(?![A-Za-z0-9_])/g\nconst BACKTICK_MD_RE = /`([^`\\s]+\\.md)`/g\nconst LINK_MD_RE = /\\]\\(\\s*<?([^)\\s>#]+\\.md)(?:#[^)\\s]*)?>?\\s*\\)/g\n\nconst pad3 = (n: string) => String(Number(n)).padStart(3, '0')\n\n/** \"E1\" → \"E001\", \"ADR-4\" → \"ADR-004\"; task and roadmap ids are already padded. */\nfunction normalizeId(id: string): string {\n if (id.startsWith('ADR-')) return `ADR-${pad3(id.slice(4))}`\n if (id.startsWith('E')) return `E${pad3(id.slice(1))}`\n return id\n}\n\nconst normalizePath = (p: string) => p.replace(/\\\\/g, '/').replace(/^\\.?\\//, '')\n\n/** Item ids (E/T/R/ADR) and `*.md` paths (in backticks or as link targets) mentioned in `text`, deduplicated. */\nexport function extractRefs(text: string): { ids: string[]; paths: string[] } {\n const ids = new Set<string>()\n for (const m of text.matchAll(ID_RE)) {\n if (/^E0+$/.test(m[1])) continue // E0 is not an entry id\n ids.add(normalizeId(m[1]))\n }\n const paths = new Set<string>()\n for (const re of [BACKTICK_MD_RE, LINK_MD_RE]) {\n for (const m of text.matchAll(re)) {\n if (/^[a-z]+:\\/\\//i.test(m[1])) continue // external URL\n paths.add(normalizePath(m[1]))\n }\n }\n return { ids: [...ids], paths: [...paths] }\n}\n\n/** Classify a non-entry markdown file by path. Label = its H1 without the \"ID: \" prefix, else the file name. */\nexport function fileNode(relPath: string, raw: string): GraphNode {\n const p = normalizePath(relPath)\n const name = p.split('/').pop() ?? p\n const h1 = /^#\\s+(.+?)\\s*$/m.exec(raw)?.[1] ?? ''\n const label = (id: string) => h1.replace(new RegExp(`^${id}\\\\s*[:—–-]\\\\s*`), '') || name.replace(/\\.md$/, '')\n let m: RegExpExecArray | null\n if ((m = /^plans\\/tasks\\/(T\\d{3,})[^/]*\\.md$/.exec(p))) return { id: m[1], kind: 'task', label: label(m[1]), path: p }\n if ((m = /^plans\\/roadmap\\/(R\\d{3,})[^/]*\\.md$/.exec(p))) return { id: m[1], kind: 'epic', label: label(m[1]), path: p }\n if ((m = /(?:^|\\/)(ADR-\\d+)[^/]*\\.md$/.exec(p))) {\n const id = normalizeId(m[1])\n return { id, kind: 'adr', label: label(m[1]), path: p }\n }\n return { id: p, kind: 'doc', label: h1 || name.replace(/\\.md$/, ''), path: p }\n}\n\n/**\n * Resolve refs into a graph. Unresolved refs, self-links and duplicate edges are dropped.\n * Nodes = every entry + every other item that touches an entry.\n */\nexport function buildGraph(entries: GraphItem[], others: GraphItem[]): MemoryGraph {\n const all = [...entries, ...others]\n const byId = new Map(all.map(n => [n.id, n]))\n const byPath = new Map(all.map(n => [n.path, n]))\n const entryIds = new Set(entries.map(e => e.id))\n const edges = new Map<string, GraphEdge>()\n const add = (from: string, to: string) => { if (from !== to) edges.set(`${from}\\u0000${to}`, { from, to }) }\n\n for (const e of entries) {\n const { ids, paths } = extractRefs(e.text)\n for (const id of ids) if (byId.has(id)) add(e.id, id)\n for (const p of paths) { const n = byPath.get(p); if (n) add(e.id, n.id) }\n }\n // incoming: other files that mention an entry id (not the whole doc-to-doc graph)\n for (const o of others) {\n for (const id of extractRefs(o.text).ids) if (entryIds.has(id)) add(o.id, id)\n }\n\n const touched = new Set(entryIds)\n for (const e of edges.values()) { touched.add(e.from); touched.add(e.to) }\n const nodes = all.filter(n => touched.has(n.id)).map(({ text: _, ...n }) => n)\n return { nodes, edges: [...edges.values()] }\n}\n\n/** One entry, its direct neighbours and the edges between it and them. Unknown id → empty graph. */\nexport function neighbourhood(graph: MemoryGraph, id: string): MemoryGraph {\n if (!graph.nodes.some(n => n.id === id)) return { nodes: [], edges: [] }\n const edges = graph.edges.filter(e => e.from === id || e.to === id)\n const keep = new Set([id, ...edges.flatMap(e => [e.from, e.to])])\n return { nodes: graph.nodes.filter(n => keep.has(n.id)), edges }\n}\n\n/**\n * \"Links: …\" / \"Linked from: …\" lines for one entry (vibedoc_get_entries). A line with nothing is left out;\n * each is capped at `cap` items plus \"+N more\", so a hub entry stays short.\n */\nexport function formatEntryLinks(graph: MemoryGraph, id: string, cap = 10): string[] {\n const line = (label: string, ids: string[]) => {\n if (!ids.length) return []\n const more = ids.length > cap ? `, +${ids.length - cap} more` : ''\n return [`${label}: ${ids.slice(0, cap).join(', ')}${more}`]\n }\n return [\n ...line('Links', graph.edges.filter(e => e.from === id).map(e => e.to)),\n ...line('Linked from', graph.edges.filter(e => e.to === id).map(e => e.from)),\n ]\n}\n\nexport const GRAPH_COL_W = 240\nexport const GRAPH_ROW_H = 48\n/** Column per kind: epics and tasks left of the entries, ADRs and docs right of them. */\nconst GRAPH_COL: Record<NodeKind, number> = { epic: -2, task: -1, entry: 0, adr: 1, doc: 2 }\n\n/**\n * Deterministic positions for the graph view (no layout library, no saved positions): entries stacked in the\n * centre column (sorted by type, then id), every other node in its kind's column at the average y of the\n * entries it links with, pushed down to keep one row of space. Same graph → same positions on every load.\n */\nexport function graphLayout(graph: MemoryGraph, entryType: Record<string, string> = {}): Record<string, { x: number; y: number }> {\n const pos: Record<string, { x: number; y: number }> = {}\n const num = (id: string) => Number(id.replace(/\\D/g, '')) || 0\n const entries = graph.nodes.filter(n => n.kind === 'entry')\n .sort((a, b) => (entryType[a.id] ?? '').localeCompare(entryType[b.id] ?? '') || num(a.id) - num(b.id))\n entries.forEach((e, i) => { pos[e.id] = { x: 0, y: i * GRAPH_ROW_H } })\n\n const neighbourYs = new Map<string, number[]>()\n for (const { from, to } of graph.edges) {\n for (const [other, entry] of [[from, to], [to, from]]) {\n if (pos[entry] && !pos[other]) neighbourYs.set(other, [...(neighbourYs.get(other) ?? []), pos[entry].y])\n }\n }\n for (const kind of ['epic', 'task', 'adr', 'doc'] as const) {\n const col = graph.nodes.filter(n => n.kind === kind).map(n => {\n const ys = neighbourYs.get(n.id) ?? [0]\n return { id: n.id, want: ys.reduce((a, b) => a + b, 0) / ys.length }\n }).sort((a, b) => a.want - b.want || a.id.localeCompare(b.id, 'en', { numeric: true }))\n let next = -Infinity\n for (const { id, want } of col) {\n const y = Math.max(want, next)\n pos[id] = { x: GRAPH_COL[kind] * GRAPH_COL_W, y }\n next = y + GRAPH_ROW_H\n }\n }\n return pos\n}\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'lightbulb',\n size: 24,\n node: [\n [\n 'path',\n {\n d: 'M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5',\n key: '1gvzjb',\n },\n ],\n ['path', { d: 'M9 18h6', key: 'x1upvd' }],\n ['path', { d: 'M10 22h4', key: 'ceow96' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name Lightbulb\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/lightbulb\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 Lightbulb = createLucideIcon(__iconData);\n\nexport default Lightbulb;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'flag',\n size: 24,\n node: [\n [\n 'path',\n {\n d: 'M4 22V4a1 1 0 0 1 .4-.8A6 6 0 0 1 8 2c3 0 5 2 7.333 2q2 0 3.067-.8A1 1 0 0 1 20 4v10a1 1 0 0 1-.4.8A6 6 0 0 1 16 16c-3 0-5-2-8-2a6 6 0 0 0-4 1.528',\n key: '1jaruq',\n },\n ],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name Flag\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/flag\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 Flag = createLucideIcon(__iconData);\n\nexport default Flag;\n"],"names":["ENTRY_TYPES","s","SUMMARY_MAX","n","isEntryType","includes","normalizeEntryId","Number","m","exec","trim","nextEntryId","String","padStart","replace","id","ids","max","Math","map","slice","h1","entrySlug","summary","toLowerCase","file","meta","parseEntry","raw","lines","split","i","length","type","e","formatEntry","by","body","join","head","updatedAt","updated","undefined","validateEntryInput","test"],"mappings":"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","ignoreList":[9,11,12]}
|