vibedoc 1.7.0 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-path-routes-manifest.json +9 -0
- package/.next/build-manifest.json +3 -3
- package/.next/prerender-manifest.json +42 -14
- package/.next/routes-manifest.json +54 -0
- package/.next/server/app/(app)/activity/page.js.nft.json +1 -1
- package/.next/server/app/(app)/activity/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/board/page.js.nft.json +1 -1
- package/.next/server/app/(app)/board/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/chat/page.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.nft.json +1 -1
- package/.next/server/app/(app)/docs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/explorer/page.js.nft.json +1 -1
- package/.next/server/app/(app)/explorer/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/manual-tests/page/app-paths-manifest.json +3 -0
- package/.next/server/app/(app)/manual-tests/page/build-manifest.json +20 -0
- package/.next/server/app/(app)/manual-tests/page/next-font-manifest.json +11 -0
- package/.next/server/app/(app)/manual-tests/page/react-loadable-manifest.json +1 -0
- package/.next/server/app/(app)/manual-tests/page/server-reference-manifest.json +4 -0
- package/.next/server/app/(app)/manual-tests/page.js +15 -0
- package/.next/server/app/(app)/manual-tests/page.js.map +5 -0
- package/.next/server/app/(app)/manual-tests/page.js.nft.json +1 -0
- package/.next/server/app/(app)/manual-tests/page_client-reference-manifest.js +3 -0
- package/.next/server/app/(app)/memory/page.js.nft.json +1 -1
- package/.next/server/app/(app)/memory/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/roadmap/page.js.nft.json +1 -1
- package/.next/server/app/(app)/roadmap/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/settings/page.js.nft.json +1 -1
- package/.next/server/app/(app)/settings/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/setup/page.js.nft.json +1 -1
- package/.next/server/app/(app)/setup/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +3 -2
- package/.next/server/app/_not-found.segments/_full.segment.rsc +3 -2
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +3 -2
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +3 -2
- package/.next/server/app/activity.html +1 -1
- package/.next/server/app/activity.rsc +20 -18
- package/.next/server/app/activity.segments/!KGFwcCk/activity/__PAGE__.segment.rsc +7 -6
- package/.next/server/app/activity.segments/_full.segment.rsc +20 -18
- package/.next/server/app/activity.segments/_tree.segment.rsc +3 -2
- package/.next/server/app/api/activity/route.js +2 -2
- package/.next/server/app/api/activity/route.js.nft.json +1 -1
- package/.next/server/app/api/backlinks/route.js +2 -2
- package/.next/server/app/api/backlinks/route.js.nft.json +1 -1
- package/.next/server/app/api/chat/route.js +1 -1
- package/.next/server/app/api/chat/route.js.nft.json +1 -1
- package/.next/server/app/api/context/route.js +2 -2
- package/.next/server/app/api/context/route.js.nft.json +1 -1
- package/.next/server/app/api/conversations/route.js +2 -2
- package/.next/server/app/api/conversations/route.js.nft.json +1 -1
- package/.next/server/app/api/decisions/route.js +2 -2
- package/.next/server/app/api/decisions/route.js.nft.json +1 -1
- package/.next/server/app/api/docs/route.js +1 -1
- package/.next/server/app/api/docs/route.js.nft.json +1 -1
- package/.next/server/app/api/explorer/route.js +2 -2
- package/.next/server/app/api/explorer/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/route.js +1 -1
- package/.next/server/app/api/mcp/route.js.nft.json +1 -1
- package/.next/server/app/api/memory/route.js +2 -2
- package/.next/server/app/api/memory/route.js.nft.json +1 -1
- package/.next/server/app/api/plan/apply/route.js +3 -3
- package/.next/server/app/api/plan/apply/route.js.nft.json +1 -1
- package/.next/server/app/api/projects/route.js +2 -2
- package/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/.next/server/app/api/registry/route.js +2 -2
- package/.next/server/app/api/registry/route.js.nft.json +1 -1
- package/.next/server/app/api/roadmap/create/route.js +3 -3
- package/.next/server/app/api/roadmap/create/route.js.nft.json +1 -1
- package/.next/server/app/api/roadmap/delete/route.js +3 -3
- package/.next/server/app/api/roadmap/delete/route.js.nft.json +1 -1
- package/.next/server/app/api/roadmap/generate/route.js +3 -3
- package/.next/server/app/api/roadmap/generate/route.js.nft.json +1 -1
- package/.next/server/app/api/roadmap/layout/route.js +3 -3
- package/.next/server/app/api/roadmap/layout/route.js.nft.json +1 -1
- package/.next/server/app/api/roadmap/restore/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/roadmap/restore/route/build-manifest.json +12 -0
- package/.next/server/app/api/roadmap/restore/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/roadmap/restore/route.js +9 -0
- package/.next/server/app/api/roadmap/restore/route.js.map +5 -0
- package/.next/server/app/api/roadmap/restore/route.js.nft.json +1 -0
- package/.next/server/app/api/roadmap/restore/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/roadmap/route.js +3 -3
- package/.next/server/app/api/roadmap/route.js.nft.json +1 -1
- package/.next/server/app/api/roadmap/update/route.js +3 -3
- package/.next/server/app/api/roadmap/update/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/route.js +2 -2
- package/.next/server/app/api/sessions/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/route.js +3 -3
- package/.next/server/app/api/settings/route.js.nft.json +1 -1
- package/.next/server/app/api/setup/generate/route.js +1 -1
- package/.next/server/app/api/setup/generate/route.js.nft.json +1 -1
- package/.next/server/app/api/setup/write/route.js +2 -2
- package/.next/server/app/api/setup/write/route.js.nft.json +1 -1
- package/.next/server/app/api/summary/route.js +2 -2
- package/.next/server/app/api/summary/route.js.nft.json +1 -1
- package/.next/server/app/api/tasks/bulk/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/tasks/bulk/route/build-manifest.json +12 -0
- package/.next/server/app/api/tasks/bulk/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/tasks/bulk/route.js +9 -0
- package/.next/server/app/api/tasks/bulk/route.js.map +5 -0
- package/.next/server/app/api/tasks/bulk/route.js.nft.json +1 -0
- package/.next/server/app/api/tasks/bulk/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/tasks/create/route.js +2 -2
- package/.next/server/app/api/tasks/create/route.js.nft.json +1 -1
- package/.next/server/app/api/tasks/delete/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/tasks/delete/route/build-manifest.json +12 -0
- package/.next/server/app/api/tasks/delete/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/tasks/delete/route.js +9 -0
- package/.next/server/app/api/tasks/delete/route.js.map +5 -0
- package/.next/server/app/api/tasks/delete/route.js.nft.json +1 -0
- package/.next/server/app/api/tasks/delete/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/tasks/manual-tests/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/tasks/manual-tests/route/build-manifest.json +12 -0
- package/.next/server/app/api/tasks/manual-tests/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/tasks/manual-tests/route.js +8 -0
- package/.next/server/app/api/tasks/manual-tests/route.js.map +5 -0
- package/.next/server/app/api/tasks/manual-tests/route.js.nft.json +1 -0
- package/.next/server/app/api/tasks/manual-tests/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/tasks/restore/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/tasks/restore/route/build-manifest.json +12 -0
- package/.next/server/app/api/tasks/restore/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/tasks/restore/route.js +9 -0
- package/.next/server/app/api/tasks/restore/route.js.map +5 -0
- package/.next/server/app/api/tasks/restore/route.js.nft.json +1 -0
- package/.next/server/app/api/tasks/restore/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/tasks/review/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/tasks/review/route/build-manifest.json +12 -0
- package/.next/server/app/api/tasks/review/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/tasks/review/route.js +9 -0
- package/.next/server/app/api/tasks/review/route.js.map +5 -0
- package/.next/server/app/api/tasks/review/route.js.nft.json +1 -0
- package/.next/server/app/api/tasks/review/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/tasks/route.js +2 -2
- package/.next/server/app/api/tasks/route.js.nft.json +1 -1
- package/.next/server/app/api/tasks/update/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/tasks/update/route/build-manifest.json +12 -0
- package/.next/server/app/api/tasks/update/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/tasks/update/route.js +9 -0
- package/.next/server/app/api/tasks/update/route.js.map +5 -0
- package/.next/server/app/api/tasks/update/route.js.nft.json +1 -0
- package/.next/server/app/api/tasks/update/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/views/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/views/route/build-manifest.json +12 -0
- package/.next/server/app/api/views/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/views/route.js +9 -0
- package/.next/server/app/api/views/route.js.map +5 -0
- package/.next/server/app/api/views/route.js.nft.json +1 -0
- package/.next/server/app/api/views/route_client-reference-manifest.js +3 -0
- package/.next/server/app/board.html +1 -1
- package/.next/server/app/board.rsc +20 -18
- package/.next/server/app/board.segments/!KGFwcCk/board/__PAGE__.segment.rsc +7 -6
- package/.next/server/app/board.segments/_full.segment.rsc +20 -18
- 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 +20 -18
- package/.next/server/app/chat.segments/!KGFwcCk/chat/__PAGE__.segment.rsc +12 -9
- package/.next/server/app/chat.segments/_full.segment.rsc +20 -18
- 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 +20 -18
- package/.next/server/app/docs.segments/!KGFwcCk/docs/__PAGE__.segment.rsc +6 -5
- package/.next/server/app/docs.segments/_full.segment.rsc +20 -18
- 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 +20 -18
- package/.next/server/app/explorer.segments/!KGFwcCk/explorer/__PAGE__.segment.rsc +11 -9
- package/.next/server/app/explorer.segments/_full.segment.rsc +20 -18
- package/.next/server/app/explorer.segments/_tree.segment.rsc +3 -2
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +3 -2
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +3 -2
- package/.next/server/app/index.segments/_full.segment.rsc +3 -2
- package/.next/server/app/index.segments/_tree.segment.rsc +3 -2
- package/.next/server/app/manual-tests.html +1 -0
- package/.next/server/app/manual-tests.meta +31 -0
- package/.next/server/app/manual-tests.rsc +31 -0
- package/.next/server/app/manual-tests.segments/!KGFwcCk/manual-tests/__PAGE__.segment.rsc +33 -0
- package/.next/server/app/manual-tests.segments/_full.segment.rsc +31 -0
- package/.next/server/app/manual-tests.segments/_tree.segment.rsc +5 -0
- package/.next/server/app/memory.html +1 -1
- package/.next/server/app/memory.rsc +20 -18
- package/.next/server/app/memory.segments/!KGFwcCk/memory/__PAGE__.segment.rsc +11 -9
- package/.next/server/app/memory.segments/_full.segment.rsc +20 -18
- package/.next/server/app/memory.segments/_tree.segment.rsc +3 -2
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/roadmap.html +1 -1
- package/.next/server/app/roadmap.rsc +20 -18
- package/.next/server/app/roadmap.segments/!KGFwcCk/roadmap/__PAGE__.segment.rsc +6 -5
- package/.next/server/app/roadmap.segments/_full.segment.rsc +20 -18
- 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 +20 -18
- package/.next/server/app/settings.segments/!KGFwcCk/settings/__PAGE__.segment.rsc +7 -6
- package/.next/server/app/settings.segments/_full.segment.rsc +20 -18
- 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 +20 -18
- package/.next/server/app/setup.segments/!KGFwcCk/setup/__PAGE__.segment.rsc +11 -9
- package/.next/server/app/setup.segments/_full.segment.rsc +20 -18
- package/.next/server/app/setup.segments/_tree.segment.rsc +3 -2
- package/.next/server/app-paths-manifest.json +9 -0
- package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0-5bkpj._.js → 11mp_@anthropic-ai_sdk_00p3fu1._.js} +1 -1
- package/.next/server/chunks/{11mp_@anthropic-ai_sdk_01l5h3i._.js → 11mp_@anthropic-ai_sdk_01amtux._.js} +1 -1
- package/.next/server/chunks/{11mp_@anthropic-ai_sdk_00psb_y._.js → 11mp_@anthropic-ai_sdk_01jjl08._.js} +1 -1
- package/.next/server/chunks/{11mp_@anthropic-ai_sdk_072r2bd._.js → 11mp_@anthropic-ai_sdk_071zfm8._.js} +1 -1
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_07v3boe._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_09iva72._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0bom1b1._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0dvji7p._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0dzo8jn._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0hvqsqq._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0i7i-jw._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0k0iop5._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0l3-6aq._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0oegm3y._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0p5cyes._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0qw8i6_._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0yk-a7v._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_11fsqvb._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_143_7ez._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_14a4-64._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_17d_oma._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_18qwuyb._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_19au8y6._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1ak_hy5._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1cqa0nq._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1i-x_q0._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1jmtliz._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1jmtliz._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1jouwlj._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1jouwlj._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1r_q5um._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1r_q5um._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1t959xd._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1t959xd._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1vkprw9._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1vkprw9._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1y95ax9._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1y95ax9._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1y9misr._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1y9misr._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_21b8wwy._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_21b8wwy._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_08ecfgc._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_09--sd6._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0e3mwc6._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0go4301._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0iq9dmt._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0n9ijke._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0szcyrx._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0xy2s3x._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0yaujn7._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0z9ly74._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1hmq3al._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1tqk4bp._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1x-hr6f._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1zsdhg0._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_20t__fe._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__1u_q61h._.js → [root-of-the-server]__0-pmfg2._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__02co2yq._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__02co2yq._.js.map +1 -0
- package/.next/server/chunks/{[root-of-the-server]__1y3u5ud._.js → [root-of-the-server]__04tibmn._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__17xb02p._.js → [root-of-the-server]__05g5cgo._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__0aynzrb._.js → [root-of-the-server]__0b5pwze._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__142icjb._.js → [root-of-the-server]__0druay_._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__106gpvh._.js → [root-of-the-server]__0p6ja6l._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__0q3-t8a._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0q3-t8a._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0vcsqzd._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0vcsqzd._.js.map +1 -0
- package/.next/server/chunks/{[root-of-the-server]__0nfvvy9._.js → [root-of-the-server]__1-e3i_5._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__1-ic3af._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1-ic3af._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__11a4ptn._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__11a4ptn._.js.map +1 -0
- package/.next/server/chunks/{[root-of-the-server]__0e59y5j._.js → [root-of-the-server]__11c8641._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__12nzy_6._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__12nzy_6._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__15ck1wv._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__15ck1wv._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__1613hjb._.js +30 -19
- package/.next/server/chunks/[root-of-the-server]__1613hjb._.js.map +1 -1
- package/.next/server/chunks/{[root-of-the-server]__06zf_sh._.js → [root-of-the-server]__197vw9g._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__1j0rrps._.js → [root-of-the-server]__19k8t87._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__0eqd-tw._.js → [root-of-the-server]__1ezzeji._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__1mrmaf9._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__17p0rkn._.js → [root-of-the-server]__1n68akx._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__1n68akx._.js.map +1 -0
- package/.next/server/chunks/{[root-of-the-server]__11s76m8._.js → [root-of-the-server]__1npya5q._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__1npya5q._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__1qusy4g._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1qusy4g._.js.map +1 -0
- package/.next/server/chunks/{[root-of-the-server]__1q4ahvz._.js → [root-of-the-server]__1umrorf._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__093hlkh._.js → [root-of-the-server]__1vh9g2o._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__1y-tt29._.js → [root-of-the-server]__1vq38ov._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__1xb0fmp._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__1xb0fmp._.js.map +1 -1
- package/.next/server/chunks/_04byth9._.js +24 -19
- package/.next/server/chunks/_04byth9._.js.map +1 -1
- package/.next/server/chunks/_1au4syj._.js +1 -1
- package/.next/server/chunks/_1au4syj._.js.map +1 -1
- package/.next/server/chunks/_1b5fqxy._.js.map +1 -1
- package/.next/server/chunks/_1ivswa9._.js +3 -0
- package/.next/server/chunks/_1ivswa9._.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_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]__0xt_0w2._.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/_09b02z-._.js +3 -0
- package/.next/server/chunks/ssr/_09b02z-._.js.map +1 -0
- package/.next/server/chunks/ssr/_0d0f1s1._.js +3 -0
- package/.next/server/chunks/ssr/_0d0f1s1._.js.map +1 -0
- package/.next/server/chunks/ssr/_0idb-vo._.js +151 -0
- package/.next/server/chunks/ssr/_0idb-vo._.js.map +1 -0
- package/.next/server/chunks/ssr/_0lnt_va._.js +4 -0
- package/.next/server/chunks/ssr/_0lnt_va._.js.map +1 -0
- package/.next/server/chunks/ssr/_0qlymco._.js +3 -0
- package/.next/server/chunks/ssr/_0qlymco._.js.map +1 -0
- package/.next/server/chunks/ssr/_0qp3gu7._.js +3 -0
- package/.next/server/chunks/ssr/_0qp3gu7._.js.map +1 -0
- package/.next/server/chunks/ssr/_0sg1oeq._.js +3 -0
- package/.next/server/chunks/ssr/_0sg1oeq._.js.map +1 -0
- package/.next/server/chunks/ssr/_14emfpq._.js +3 -0
- package/.next/server/chunks/ssr/_14emfpq._.js.map +1 -0
- package/.next/server/chunks/ssr/_1ftruw6._.js +4 -0
- package/.next/server/chunks/ssr/_1ftruw6._.js.map +1 -0
- package/.next/server/chunks/ssr/_1gxjjvh._.js +1 -1
- package/.next/server/chunks/ssr/_1gxjjvh._.js.map +1 -1
- package/.next/server/chunks/ssr/_1ncdakv._.js +4 -0
- package/.next/server/chunks/ssr/_1ncdakv._.js.map +1 -0
- package/.next/server/chunks/ssr/_1t76zdx._.js +3 -0
- package/.next/server/chunks/ssr/_1t76zdx._.js.map +1 -0
- package/.next/server/chunks/ssr/_1x7ggg5._.js +4 -0
- package/.next/server/chunks/ssr/_1x7ggg5._.js.map +1 -0
- package/.next/server/chunks/ssr/_next-internal_server_app_(app)_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_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_1q89l7p._.js +3 -0
- package/.next/server/chunks/ssr/node_modules__pnpm_1q89l7p._.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules__pnpm_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)_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_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/0mgifb98wbesa.js +1 -0
- package/.next/static/chunks/0p1-hkgnm2ll2.js +1 -0
- package/.next/static/chunks/0pgu5q5vodev6.js +1 -0
- package/.next/static/chunks/0rqzvayflendx.js +2 -0
- package/.next/static/chunks/0vcfs7dii85tw.js +21 -0
- package/.next/static/chunks/13l4l-boqg8fx.js +1 -0
- package/.next/static/chunks/14hxe1qiaram9.js +1 -0
- package/.next/static/chunks/150y5rwg6gwvx.css +1 -0
- package/.next/static/chunks/16k196zyl-n9q.js +1 -0
- package/.next/static/chunks/18b5l8p0vd9f8.js +1 -0
- package/.next/static/chunks/1c_8t2kecjnua.js +1 -0
- package/.next/static/chunks/1fd43t9y42wd3.js +1 -0
- package/.next/static/chunks/1q50zh5z-fq2k.js +2 -0
- package/.next/static/chunks/1tu8lforstp1o.js +1 -0
- package/.next/static/chunks/23-xknrz6o748.js +1 -0
- package/.next/static/chunks/2_xpm7qhr69n8.js +2 -0
- package/.next/static/chunks/2ls_yp4-qgb42.js +1 -0
- package/.next/static/chunks/2zz0ip2l_29c3.js +3 -0
- package/.next/static/chunks/3ly7b47esdb7j.js +1 -0
- package/.next/static/chunks/3ruw8lu2_re-h.js +1 -0
- package/.next/static/chunks/3vf5nnd4xjo5_.js +1 -0
- package/.next/static/chunks/40jaenrnspnlh.js +68 -0
- package/.next/static/chunks/41oxcdcw-pcwt.js +1 -0
- package/README.md +2 -1
- 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]__1o4a-4j._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1o4a-4j._.js.map +0 -1
- package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_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/_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_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/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_00p3fu1._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_00psb_y._.js.map → 11mp_@anthropic-ai_sdk_01amtux._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_01l5h3i._.js.map → 11mp_@anthropic-ai_sdk_01jjl08._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_072r2bd._.js.map → 11mp_@anthropic-ai_sdk_071zfm8._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0am8bw2._.js.map → 11mp_@anthropic-ai_sdk_07v3boe._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0enefn6._.js.map → 11mp_@anthropic-ai_sdk_09iva72._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0k3n_5f._.js.map → 11mp_@anthropic-ai_sdk_0bom1b1._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0lcfjm4._.js.map → 11mp_@anthropic-ai_sdk_0dvji7p._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0lfx9av._.js.map → 11mp_@anthropic-ai_sdk_0dzo8jn._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0qau3qw._.js.map → 11mp_@anthropic-ai_sdk_0hvqsqq._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0r1pmvm._.js.map → 11mp_@anthropic-ai_sdk_0i7i-jw._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_11t-z2t._.js.map → 11mp_@anthropic-ai_sdk_0k0iop5._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_15hyn79._.js.map → 11mp_@anthropic-ai_sdk_0l3-6aq._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1_qk07x._.js.map → 11mp_@anthropic-ai_sdk_0oegm3y._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1b2929e._.js.map → 11mp_@anthropic-ai_sdk_0p5cyes._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1e72c89._.js.map → 11mp_@anthropic-ai_sdk_0qw8i6_._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1eq7asn._.js.map → 11mp_@anthropic-ai_sdk_0yk-a7v._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1fhdojs._.js.map → 11mp_@anthropic-ai_sdk_11fsqvb._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1htgzmb._.js.map → 11mp_@anthropic-ai_sdk_143_7ez._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1lh_vwq._.js.map → 11mp_@anthropic-ai_sdk_14a4-64._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1ludf-o._.js.map → 11mp_@anthropic-ai_sdk_17d_oma._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1m3luz3._.js.map → 11mp_@anthropic-ai_sdk_18qwuyb._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1x1iz3d._.js.map → 11mp_@anthropic-ai_sdk_19au8y6._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1xsmwlh._.js.map → 11mp_@anthropic-ai_sdk_1ak_hy5._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_202spah._.js.map → 11mp_@anthropic-ai_sdk_1cqa0nq._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_215hw9u._.js.map → 11mp_@anthropic-ai_sdk_1i-x_q0._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_0d2_lq6._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_08ecfgc._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_0n-i0pd._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_09--sd6._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_13pos4j._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0e3mwc6._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_17b4pqr._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0go4301._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1bkcmom._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0iq9dmt._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1hlj_3l._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0n9ijke._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1ip-sor._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0szcyrx._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1pex5o1._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0xy2s3x._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1s8lc8_._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0yaujn7._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__0e59y5j._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0z9ly74._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__11s76m8._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1hmq3al._.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_1tqk4bp._.js.map} +0 -0
- /package/.next/server/chunks/{ssr/1u84_katex_dist_katex_mjs_1z0p1bs._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1x-hr6f._.js.map} +0 -0
- /package/.next/server/chunks/{ssr/node_modules__pnpm_09_i2jk._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1zsdhg0._.js.map} +0 -0
- /package/.next/server/chunks/{ssr/node_modules__pnpm_0dwi7mu._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_20t__fe._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__1u_q61h._.js.map → [root-of-the-server]__0-pmfg2._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__1y3u5ud._.js.map → [root-of-the-server]__04tibmn._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__17xb02p._.js.map → [root-of-the-server]__05g5cgo._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__0aynzrb._.js.map → [root-of-the-server]__0b5pwze._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__142icjb._.js.map → [root-of-the-server]__0druay_._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__106gpvh._.js.map → [root-of-the-server]__0p6ja6l._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__0nfvvy9._.js.map → [root-of-the-server]__1-e3i_5._.js.map} +0 -0
- /package/.next/server/chunks/{ssr/node_modules__pnpm_1yq90z7._.js.map → [root-of-the-server]__11c8641._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__06zf_sh._.js.map → [root-of-the-server]__197vw9g._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__1j0rrps._.js.map → [root-of-the-server]__19k8t87._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__0eqd-tw._.js.map → [root-of-the-server]__1ezzeji._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__17p0rkn._.js.map → [root-of-the-server]__1mrmaf9._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__1q4ahvz._.js.map → [root-of-the-server]__1umrorf._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__093hlkh._.js.map → [root-of-the-server]__1vh9g2o._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__1y-tt29._.js.map → [root-of-the-server]__1vq38ov._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_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 → fGPda81_8-K4GmaNUE6KA}/_buildManifest.js +0 -0
- /package/.next/static/{uJ5RYxgFnE5svAvnuLDXN → fGPda81_8-K4GmaNUE6KA}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{uJ5RYxgFnE5svAvnuLDXN → fGPda81_8-K4GmaNUE6KA}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/context/ChatContext.tsx","../../../../src/components/chat/QuestionCard.tsx","../../../../src/lib/plan.ts","../../../../src/lib/chats.ts"],"sourcesContent":["\"use client\"\n\n/**\n * Agent chats: one store for the sidebar list, the chat modal, the /chat page and the roadmap/board markers.\n * Each chat is its own `claude -p` session (POST /api/chat per turn); chats are saved to\n * .vibedoc/chats/<id>.json (/api/conversations) at turn end, card resolution and attach changes.\n */\n\nimport { createContext, useContext, useEffect, useMemo, useRef, useState, type ReactNode } from \"react\"\nimport { usePathname, useRouter } from \"next/navigation\"\nimport { useApp } from \"@/context/AppContext\"\nimport type { Proposal, ProposalStatus } from \"@/components/chat/ProposalCard\"\nimport type { PlanCreated, PlanProposal, PlanStatus } from \"@/components/chat/PlanCard\"\nimport { formatAnswers, isRenderableQuestions, type Question, type QuestionSet } from \"@/components/chat/QuestionCard\"\nimport { asRenderablePlan, planTarget } from \"@/lib/plan\"\nimport type { TextEdit } from \"@/lib/diff\"\nimport { ASK_AGENT_EVENT, OPEN_CHAT_EVENT, openAgentChat, type AskAgentDetail } from \"@/lib/ask-agent\"\nimport {\n addChat, attachContext, attachKey, chatFor, chatStatus, chatTitle, defaultChat, epicOf, fromSaved, isWaiting,\n itemAgents, newChatId, newlyWaiting, patchChat, pendingReviews, routeAsk, toSaved, waitingTitle,\n type Attach, type Chat, type ChatStatus, type ItemAgent,\n} from \"@/lib/chats\"\n\nexport interface ChatMessage {\n role: \"user\" | \"assistant\"\n text: string\n tools: string[]\n proposals: Proposal[]\n plans: PlanProposal[]\n questions: QuestionSet[]\n error?: string\n}\n\nexport type ChatTab = Chat<ChatMessage>\n\nconst blank = (role: ChatMessage[\"role\"], text = \"\"): ChatMessage =>\n ({ role, text, tools: [], proposals: [], plans: [], questions: [] })\n\ninterface ChatApi {\n chats: ChatTab[]\n loaded: boolean\n /** Chat shown in the modal; null = closed */\n modalId: string | null\n /** keep: don't drop an empty chat (it is moving to the /chat page) */\n closeModal: (opts?: { keep?: boolean }) => void\n /** Open a chat: in the modal, or selected in place when already on /chat */\n show: (chatId: string) => void\n /** Header button / `c`: the most urgent or newest chat, else a fresh one */\n showDefault: () => void\n /** Resume the chat attached to `a`, or start one */\n showAbout: (a: Attach) => void\n /** A new empty chat (not saved until its first message); returns its id */\n create: (attach?: Attach | null) => string\n send: (chatId: string, text: string) => void\n stop: (chatId: string) => void\n /** Delete a chat (asks first when cards are unreviewed); returns false if the user cancelled */\n remove: (chatId: string) => boolean\n resolveProposal: (chatId: string, id: string, path: string, status: ProposalStatus) => void\n resolvePlan: (chatId: string, p: PlanProposal, status: PlanStatus, created: PlanCreated[], unchecked: string[]) => void\n answerQuestions: (chatId: string, set: QuestionSet, answers: string[]) => void\n /** attachKey → the most urgent chat working on that epic/task */\n agents: Record<string, ItemAgent>\n runningCount: number\n waitingCount: number\n /** An askAgent() refused at the running-chat cap */\n notice: string | null\n dismissNotice: () => void\n}\n\nconst ChatContext = createContext<ChatApi | null>(null)\n// Split out so roadmap nodes and board cards re-render only when some item's status flips, not per stream delta\nconst ItemAgentsContext = createContext<Record<string, ItemAgent>>({})\n\nexport function useChats(): ChatApi {\n const ctx = useContext(ChatContext)\n if (!ctx) throw new Error(\"useChats() must be used inside <ChatProvider>\")\n return ctx\n}\n\n/** The chat working on an epic/task, if any (roadmap nodes, sheets, board cards). */\nexport function useItemAgent(a: Attach): ItemAgent | undefined {\n return useContext(ItemAgentsContext)[attachKey(a)]\n}\n\nexport function ChatProvider({ children }: { children: ReactNode }) {\n const { rootParam, activeProject, selectedDoc } = useApp()\n const pathname = usePathname()\n const router = useRouter()\n const [chats, setChats] = useState<ChatTab[]>([])\n const [loaded, setLoaded] = useState(false)\n const [modalId, setModalId] = useState<string | null>(null)\n // The chat last shown (modal or page): where an askAgent() goes when that chat is idle\n const [currentId, setCurrentId] = useState<string | null>(null)\n const [notice, setNotice] = useState<string | null>(null)\n // One in-flight request per chat; a stream only ever writes into the chat id it was started for\n const abortsRef = useRef(new Map<string, AbortController>())\n // Chats changed since their last save; saved by the effect below once they aren't busy\n const dirtyRef = useRef(new Set<string>())\n const notifiedRef = useRef<Record<string, ChatStatus>>({})\n\n const onChatPage = pathname === \"/chat\"\n const docPath = pathname === \"/docs\" ? selectedDoc?.path : undefined\n\n // A Claude session belongs to one project: stop everything and load that project's chats\n useEffect(() => {\n for (const ac of abortsRef.current.values()) ac.abort()\n abortsRef.current.clear()\n dirtyRef.current.clear()\n let cancelled = false\n fetch(`/api/conversations${rootParam}`)\n .then((r) => (r.ok ? r.json() : { chats: [] }))\n .then((d: { chats?: unknown[] }) => {\n if (cancelled) return\n const loadedChats = (d.chats ?? []).map((c) => fromSaved<ChatMessage>(c)).filter((c): c is ChatTab => !!c)\n notifiedRef.current = Object.fromEntries(loadedChats.map((c) => [c.id, chatStatus(c)]))\n setChats(loadedChats)\n setModalId(null)\n setCurrentId(null)\n setLoaded(true)\n })\n .catch((e) => {\n console.warn(\"[vibedoc] could not load chats:\", e)\n if (!cancelled) { setChats([]); setLoaded(true) }\n })\n return () => { cancelled = true }\n }, [activeProject, rootParam])\n\n // Save chats marked dirty: at turn start (so a reload shows it as interrupted), turn end and card resolution.\n // Never per stream delta: nothing marks a chat dirty while it streams.\n useEffect(() => {\n for (const id of [...dirtyRef.current]) {\n const chat = chats.find((c) => c.id === id)\n dirtyRef.current.delete(id)\n const saved = chat && toSaved(chat)\n if (!saved) continue\n fetch(`/api/conversations${rootParam}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ chat: saved }),\n }).catch((e) => console.warn(`[vibedoc] could not save chat ${id}:`, e))\n }\n }, [chats, rootParam])\n\n // Reference-stable while no item's status changes (streaming text changes `chats` many times a second)\n const agentsRef = useRef<{ key: string; value: Record<string, ItemAgent> }>({ key: \"{}\", value: {} })\n const agents = useMemo(() => {\n const next = itemAgents(chats)\n const key = JSON.stringify(next)\n if (key !== agentsRef.current.key) agentsRef.current = { key, value: next }\n return agentsRef.current.value\n }, [chats])\n const runningCount = chats.filter((c) => c.busy).length\n const waitingCount = chats.filter((c) => isWaiting(chatStatus(c))).length\n\n // \"(n) VibeDoc\" in the browser tab; pathname is a dep because a navigation can put Next's metadata title back\n useEffect(() => { document.title = waitingTitle(document.title, waitingCount) }, [waitingCount, pathname])\n\n // Desktop notification when a chat starts waiting while this browser tab is in the background\n useEffect(() => {\n const fresh = newlyWaiting(notifiedRef.current, chats)\n notifiedRef.current = Object.fromEntries(chats.map((c) => [c.id, chatStatus(c)]))\n if (!fresh.length || !document.hidden || !(\"Notification\" in window) || Notification.permission !== \"granted\") return\n for (const { chat, status } of fresh) {\n const n = new Notification(status === \"needs-answer\" ? \"Agent needs your answer\" : \"Plan ready to review\", { body: chat.title, tag: chat.id })\n n.onclick = () => { window.focus(); openAgentChat(chat.id); n.close() }\n }\n }, [chats])\n\n function markDirty(id: string) { dirtyRef.current.add(id) }\n\n // A chat closed before its first message was never saved; drop it so empty chats don't pile up\n function closeModal(opts: { keep?: boolean } = {}) {\n if (!opts.keep) setChats((cs) => cs.filter((c) => c.id !== modalId || c.messages.length > 0))\n setModalId(null)\n }\n\n function show(chatId: string) {\n setCurrentId(chatId)\n if (onChatPage) {\n setModalId(null)\n router.replace(`/chat?id=${encodeURIComponent(chatId)}`, { scroll: false })\n } else {\n setModalId(chatId)\n }\n }\n\n function create(attach: Attach | null = null) {\n const id = newChatId(Date.now())\n setChats((cs) => addChat(cs, id, { attach }))\n return id\n }\n\n function showDefault() {\n const c = defaultChat(chats)\n show(c ? c.id : create())\n }\n\n function showAbout(a: Attach) {\n const c = chatFor(chats, a)\n show(c ? c.id : create(a))\n }\n\n // askAgent() from anywhere: into the current chat when it is idle, otherwise into a new one; then show it.\n // No deps on purpose: re-subscribes each render so the handler sees the current `chats`/`send`.\n useEffect(() => {\n function onAsk(e: Event) {\n const { message, newChat } = (e as CustomEvent<AskAgentDetail>).detail ?? {}\n if (!message) return\n // abortsRef is updated synchronously by send(), so it counts asks fired earlier in this same tick\n const route = routeAsk(chats, currentId, { newChat, running: abortsRef.current.size })\n if (\"refused\" in route) return setNotice(route.refused)\n setNotice(null)\n const epic = epicOf(message)\n const id = \"chatId\" in route ? route.chatId : create(epic ? { kind: \"epic\", id: epic } : null)\n send(id, message)\n // newChat asks (the multi-epic breakdown dialog) run in the background: the sidebar and roadmap show them\n if (!newChat) show(id)\n }\n function onOpen(e: Event) {\n const chatId = (e as CustomEvent<{ chatId: string }>).detail?.chatId\n if (chatId && chats.some((c) => c.id === chatId)) show(chatId)\n }\n window.addEventListener(ASK_AGENT_EVENT, onAsk)\n window.addEventListener(OPEN_CHAT_EVENT, onOpen)\n return () => {\n window.removeEventListener(ASK_AGENT_EVENT, onAsk)\n window.removeEventListener(OPEN_CHAT_EVENT, onOpen)\n }\n })\n\n function patchLast(chatId: string, fn: (m: ChatMessage) => ChatMessage) {\n setChats((cs) => patchChat(cs, chatId, (c) => ({ ...c, messages: [...c.messages.slice(0, -1), fn(c.messages[c.messages.length - 1])] })))\n }\n\n // Handles one line of `claude -p --output-format stream-json` for chat `chatId`\n function handleEvent(chatId: string, ev: any) {\n if (ev.session_id) setChats((cs) => patchChat(cs, chatId, (c) => (c.sessionId === ev.session_id ? c : { ...c, sessionId: ev.session_id })))\n if (ev.type === \"stream_event\") {\n const e = ev.event\n if (e?.type === \"message_start\") {\n patchLast(chatId, (m) => (m.text && !m.text.endsWith(\"\\n\\n\") ? { ...m, text: m.text + \"\\n\\n\" } : m))\n } else if (e?.type === \"content_block_delta\" && e.delta?.type === \"text_delta\") {\n patchLast(chatId, (m) => ({ ...m, text: m.text + e.delta.text }))\n }\n } else if (ev.type === \"assistant\") {\n const uses: { type: string; id: string; name: string; input: Record<string, unknown> }[] =\n (ev.message?.content ?? []).filter((b: { type: string }) => b.type === \"tool_use\")\n const proposals: Proposal[] = uses\n .filter((b) => b.name.endsWith(\"vibedoc_propose_edit\") && typeof b.input?.path === \"string\" && Array.isArray(b.input?.edits))\n .map((b) => ({\n id: b.id,\n path: b.input.path as string,\n edits: b.input.edits as TextEdit[],\n summary: typeof b.input.summary === \"string\" ? b.input.summary : undefined,\n status: \"pending\",\n }))\n // Cards render before the server validates the input, so drop shapes they can't draw instead of crashing\n const plans: PlanProposal[] = uses\n .filter((b) => b.name.endsWith(\"vibedoc_propose_plan\"))\n .flatMap((b) => {\n const plan = asRenderablePlan(b.input?.plan)\n return plan ? [{ id: b.id, plan, status: \"pending\" as const }] : []\n })\n const questions: QuestionSet[] = uses\n .filter((b) => b.name.endsWith(\"vibedoc_ask_questions\") && isRenderableQuestions(b.input?.questions))\n .map((b) => ({ id: b.id, questions: b.input.questions as Question[] }))\n const cards = [\"vibedoc_propose_edit\", \"vibedoc_propose_plan\", \"vibedoc_ask_questions\"]\n const tools = uses\n .filter((b) => !cards.some((c) => b.name.endsWith(c)))\n .map((b) => b.name.replace(/^mcp__vibedoc__vibedoc_/, \"\"))\n if (tools.length || proposals.length || plans.length || questions.length) {\n patchLast(chatId, (m) => ({\n ...m,\n tools: [...m.tools, ...tools],\n proposals: [...m.proposals, ...proposals],\n plans: [...m.plans, ...plans],\n questions: [...m.questions, ...questions],\n }))\n }\n } else if (ev.type === \"user\") {\n // A proposal the server rejected (bad old_string) is retried by the agent; don't show it\n const failed = new Set(\n (ev.message?.content ?? [])\n .filter((b: { type: string; is_error?: boolean }) => b.type === \"tool_result\" && b.is_error)\n .map((b: { tool_use_id: string }) => b.tool_use_id),\n )\n if (failed.size) {\n patchLast(chatId, (m) => ({\n ...m,\n proposals: m.proposals.filter((p) => !failed.has(p.id)),\n plans: m.plans.filter((p) => !failed.has(p.id)),\n questions: m.questions.filter((q) => !failed.has(q.id)),\n }))\n }\n } else if (ev.type === \"result\" && ev.is_error) {\n patchLast(chatId, (m) => ({ ...m, error: ev.result ?? ev.subtype ?? \"Agent error\" }))\n } else if (ev.type === \"error\") {\n patchLast(chatId, (m) => ({ ...m, error: ev.message }))\n }\n }\n\n // `chatId` may be a chat create() just queued, so a missing chat means a fresh one.\n async function send(chatId: string, text: string) {\n const message = text.trim()\n const chat = chats.find((c) => c.id === chatId)\n if (!message || chat?.busy) return\n // Ask once, from this click/Enter (browsers want a user gesture), so waiting chats can notify later\n if (\"Notification\" in window && Notification.permission === \"default\") void Notification.requestPermission().catch(() => {})\n const first = !chat?.messages.length\n const epic = epicOf(message)\n const attach: Attach | null = chat?.attach ?? (epic ? { kind: \"epic\", id: epic } : null)\n setChats((cs) => patchChat(cs, chatId, (c) => ({\n ...c,\n // An attached chat keeps its item title until the first message names what it's for\n title: c.messages.length ? c.title : chatTitle(message),\n attach: c.attach ?? attach,\n busy: true,\n notes: [],\n updatedAt: new Date().toISOString(),\n messages: [...c.messages, blank(\"user\", message), blank(\"assistant\")],\n })))\n markDirty(chatId)\n // Context only for a chat opened from an epic/task (showAbout); an ask like \"Break down epic R004…\" names it already\n const prefix = [\n ...(first && chat?.attach ? [attachContext(chat.attach)] : []),\n ...(chat?.notes.length ? [`[${chat.notes.join(\" \")}]`] : []),\n ]\n const outgoing = prefix.length ? `${prefix.join(\"\\n\")}\\n\\n${message}` : message\n const ac = new AbortController()\n abortsRef.current.set(chatId, ac)\n try {\n const res = await fetch(`/api/chat${rootParam}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ message: outgoing, sessionId: chat?.sessionId ?? null, docPath }),\n signal: ac.signal,\n })\n if (!res.ok || !res.body) {\n const data = await res.json().catch(() => null)\n throw new Error(data?.error ?? `Request failed (${res.status})`)\n }\n const reader = res.body.getReader()\n const decoder = new TextDecoder()\n let buf = \"\"\n for (;;) {\n const { done, value } = await reader.read()\n if (done) break\n buf += decoder.decode(value, { stream: true })\n const lines = buf.split(\"\\n\")\n buf = lines.pop() ?? \"\"\n for (const line of lines) {\n if (!line.trim()) continue\n try { handleEvent(chatId, JSON.parse(line)) } catch { /* partial or non-JSON line */ }\n }\n }\n } catch (e) {\n if (!ac.signal.aborted) patchLast(chatId, (m) => ({ ...m, error: (e as Error).message }))\n else patchLast(chatId, (m) => (m.text || m.error ? m : { ...m, error: \"Stopped.\" }))\n } finally {\n // Only save a turn that is still ours: a project switch or delete clears the map first,\n // and saving then would write this chat into the next project (or resurrect a deleted one)\n if (abortsRef.current.get(chatId) === ac) {\n abortsRef.current.delete(chatId)\n markDirty(chatId)\n }\n setChats((cs) => patchChat(cs, chatId, (c) => ({ ...c, busy: false, updatedAt: new Date().toISOString() })))\n }\n }\n\n // Aborting the fetch makes /api/chat kill its `claude -p` child\n function stop(chatId: string) {\n abortsRef.current.get(chatId)?.abort()\n }\n\n function remove(chatId: string) {\n const chat = chats.find((c) => c.id === chatId)\n const n = chat ? pendingReviews(chat) : 0\n if (n && !window.confirm(`Discard ${n} unreviewed proposal${n === 1 ? \"\" : \"s\"}?`)) return false\n stop(chatId)\n abortsRef.current.delete(chatId)\n dirtyRef.current.delete(chatId)\n // Functional update so a stream chunk queued since this render isn't dropped from the other chats\n setChats((cs) => cs.filter((c) => c.id !== chatId))\n if (modalId === chatId) setModalId(null)\n if (currentId === chatId) setCurrentId(null)\n fetch(`/api/conversations${rootParam}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ delete: chatId }),\n }).catch((e) => console.warn(`[vibedoc] could not delete chat ${chatId}:`, e))\n return true\n }\n\n function mapMessages(chatId: string, fn: (m: ChatMessage) => ChatMessage, note?: string) {\n setChats((cs) => patchChat(cs, chatId, (c) => ({\n ...c,\n notes: note ? [...c.notes, note] : c.notes,\n messages: c.messages.map(fn),\n })))\n markDirty(chatId)\n }\n\n function resolveProposal(chatId: string, id: string, path: string, status: ProposalStatus) {\n mapMessages(chatId, (m) => ({\n ...m,\n proposals: m.proposals.map((p) => (p.id === id ? { ...p, status } : p)),\n }), `User ${status} your proposed edit to ${path}.`)\n }\n\n function resolvePlan(chatId: string, p: PlanProposal, status: PlanStatus, created: PlanCreated[], unchecked: string[]) {\n const epic = p.plan.kind === \"breakdown\" ? planTarget(p.plan) : \"the roadmap\"\n mapMessages(chatId, (m) => ({\n ...m,\n plans: m.plans.map((x) => (x.id === p.id ? { ...x, status, created } : x)),\n }), status === \"accepted\"\n ? `User accepted plan for ${epic}: created ${created.map((c) => c.id).join(\", \")}${unchecked.length ? ` (unchecked: ${unchecked.join(\", \")})` : \"\"}.`\n : `User rejected the plan for ${epic}.`)\n }\n\n function answerQuestions(chatId: string, set: QuestionSet, answers: string[]) {\n if (chats.find((c) => c.id === chatId)?.busy) return\n mapMessages(chatId, (m) => ({\n ...m,\n questions: m.questions.map((q) => (q.id === set.id ? { ...q, answers } : q)),\n }))\n send(chatId, formatAnswers(set.questions, answers))\n }\n\n const api: ChatApi = {\n chats, loaded, modalId,\n closeModal,\n show, showDefault, showAbout, create, send, stop, remove,\n resolveProposal, resolvePlan, answerQuestions,\n agents, runningCount, waitingCount,\n notice, dismissNotice: () => setNotice(null),\n }\n return (\n <ChatContext.Provider value={api}>\n <ItemAgentsContext.Provider value={agents}>{children}</ItemAgentsContext.Provider>\n </ChatContext.Provider>\n )\n}\n","\"use client\"\n\nimport { useState } from \"react\"\nimport { cn } from \"@/lib/utils\"\n\nexport interface QuestionOption { label: string; description?: string }\nexport interface Question { question: string; header: string; multiSelect: boolean; options: QuestionOption[] }\n\nexport interface QuestionSet {\n id: string\n questions: Question[]\n /** Set once submitted: one answer string per question, in the same order */\n answers?: string[]\n}\n\n/** Just enough shape to render, checked before the server has validated the tool input. */\nexport function isRenderableQuestions(v: unknown): v is Question[] {\n const isStr = (x: unknown) => typeof x === \"string\"\n return Array.isArray(v) && v.length > 0 && v.every((q) =>\n !!q && typeof q === \"object\" && isStr(q.question) && isStr(q.header) && Array.isArray(q.options) &&\n q.options.every((o: unknown) => !!o && typeof o === \"object\" && isStr((o as QuestionOption).label)))\n}\n\nconst OTHER = \"\\u0000other\"\n\n/** Answer message format the agent parses: one line per question, keyed by header, labels verbatim. */\nexport function formatAnswers(questions: Question[], answers: string[]): string {\n return [\"Answers:\", ...questions.map((q, i) => `- ${q.header}: ${answers[i]}`)].join(\"\\n\")\n}\n\nexport function QuestionCard({ set, disabled, onSubmit }: {\n set: QuestionSet\n disabled?: boolean\n onSubmit: (answers: string[]) => void\n}) {\n const [picked, setPicked] = useState<string[][]>(() => set.questions.map(() => []))\n const [other, setOther] = useState<string[]>(() => set.questions.map(() => \"\"))\n const done = !!set.answers\n\n function toggle(qi: number, value: string, multi: boolean) {\n setPicked((prev) => prev.map((p, i) => {\n if (i !== qi) return p\n if (!multi) return [value]\n return p.includes(value) ? p.filter((v) => v !== value) : [...p, value]\n }))\n }\n\n // Keep the order the options were offered in, with Other last\n const answers = set.questions.map((q, i) => {\n const labels = q.options.map((o) => o.label).filter((l) => picked[i].includes(l))\n if (picked[i].includes(OTHER) && other[i].trim()) labels.push(`Other: \"${other[i].trim()}\"`)\n return labels.join(\", \")\n })\n const complete = answers.every(Boolean)\n\n return (\n <div className=\"my-2 rounded-md border border-border overflow-hidden\" data-question-card>\n <div className=\"flex items-center gap-2 px-2 py-1.5 bg-surface2 border-b border-border\">\n <span className=\"text-[10px] font-mono uppercase tracking-widest text-muted\">Questions</span>\n {done && <span className=\"ml-auto text-[10px] font-mono text-accent\">✓ Answered</span>}\n </div>\n <div className=\"p-2 space-y-3\">\n {set.questions.map((q, qi) => (\n <fieldset key={qi} disabled={done} className=\"space-y-1\">\n <legend className=\"mb-1\">\n <span className=\"text-[10px] font-mono px-1.5 py-0.5 rounded-sm bg-surface2 border border-border text-accent mr-1.5\">{q.header}</span>\n <span className=\"text-xs text-txt\">{q.question}</span>\n </legend>\n {done ? (\n <p className=\"text-xs text-txt pl-1\">{set.answers?.[qi]}</p>\n ) : (\n <>\n {[...q.options, { label: \"Other\", value: OTHER }].map((o) => {\n const value = \"value\" in o ? o.value : o.label\n const checked = picked[qi].includes(value)\n return (\n <label key={value} className={cn(\"flex gap-2 items-start rounded-sm px-1 py-0.5 cursor-pointer hover:bg-surface2\", checked && \"bg-surface2\")}>\n <input\n type={q.multiSelect ? \"checkbox\" : \"radio\"}\n name={`${set.id}-${qi}`}\n checked={checked}\n onChange={() => toggle(qi, value, q.multiSelect)}\n className=\"mt-0.5 accent-accent\"\n />\n <span className=\"text-xs\">\n <span className=\"text-txt\">{o.label}</span>\n {\"description\" in o && o.description && <span className=\"block text-muted\">{o.description}</span>}\n </span>\n </label>\n )\n })}\n {picked[qi].includes(OTHER) && (\n <input\n value={other[qi]}\n onChange={(e) => setOther((prev) => prev.map((v, i) => (i === qi ? e.target.value : v)))}\n placeholder=\"Your answer\"\n aria-label={`Other answer for ${q.header}`}\n className=\"ml-6 w-[calc(100%-1.5rem)] rounded-sm bg-surface2 border border-border px-2 py-1 text-xs text-txt placeholder:text-muted focus:outline-hidden focus:border-accent\"\n />\n )}\n </>\n )}\n </fieldset>\n ))}\n {!done && (\n <button\n onClick={() => onSubmit(answers)}\n disabled={!complete || disabled}\n className=\"text-xs px-2 py-0.5 rounded-sm bg-accent/20 text-accent hover:bg-accent/30 disabled:opacity-50\"\n >\n Submit\n </button>\n )}\n </div>\n </div>\n )\n}\n","// Pure plan model for \"plan from the chat\": the agent proposes, the user reviews, the server applies.\n// No fs here; core.applyPlan() does the writing. Self-check: node src/lib/plan.check.mts\nimport type { RoadmapItem, RoadmapStatus } from './core'\n\nexport interface PlanTask {\n key: string // stable within the plan, e.g. \"t1\"; becomes a T id on apply\n title: string\n size?: string // \"S (~1 hr)\" | \"M (2–3 hrs)\" | \"L (half day)\"\n dependsOn?: string[] // keys in this plan, or existing task ids (\"T030\")\n due?: string // YYYY-MM-DD\n body: string // full markdown below the meta block: Goal, Context, Scope, Files, …\n}\nexport interface PlanHorizon { key: string; title: string; body?: string }\nexport interface PlanEpic { key: string; title: string; parent: string; status?: RoadmapStatus; body: string } // parent: existing horizon id or a horizon key\nexport interface PlanNewEpic { title: string; parent: string; body: string } // parent: existing horizon id\n/** breakdown: exactly one of `epic` (existing) or `newEpic`, or neither (loose tasks, no Phase). */\nexport type Plan =\n | { kind: 'breakdown'; epic?: string; newEpic?: PlanNewEpic; tasks: PlanTask[] }\n | { kind: 'roadmap'; horizons: PlanHorizon[]; epics: PlanEpic[] }\n\nexport interface PlanContext { roadmap: RoadmapItem[]; taskIds: string[] }\n\n/** A real calendar date \"YYYY-MM-DD\" (rejects 2026-02-30), else null. Same rule as core's parseDue. */\nfunction isDate(raw: string): boolean {\n const m = raw.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/)\n if (!m) return false\n return new Date(Date.UTC(+m[1], +m[2] - 1, +m[3])).toISOString().slice(0, 10) === raw\n}\n\nconst isObj = (v: unknown): v is Record<string, unknown> => !!v && typeof v === 'object' && !Array.isArray(v)\nconst str = (v: unknown) => (typeof v === 'string' ? v.trim() : '')\n\n/** Where a breakdown's tasks go, for one-line summaries: \"R002\", `new epic \"X\"`, or \"no epic\". */\nexport function planTarget(plan: Extract<Plan, { kind: 'breakdown' }>): string {\n if (str(plan.epic)) return str(plan.epic).toUpperCase()\n return plan.newEpic ? `new epic \"${str(plan.newEpic.title)}\"` : 'no epic'\n}\n\n/** An existing roadmap item that can parent an epic (a horizon), else the reason it can't. */\nfunction resolveHorizon(parent: string, roadmap: RoadmapItem[], missing = 'is not an existing roadmap item'): { id: string } | { error: string } {\n const p = roadmap.find(r => r.id === parent.toUpperCase())\n if (!p) return { error: `parent \"${parent}\" ${missing}` }\n if (p.parent !== null) return { error: `parent ${p.id} is an epic, not a horizon (max depth is 2)` }\n return { id: p.id }\n}\n\n/** Id of an existing item with this title under `parent` ('' = horizon level), case-insensitive. */\nconst titleTaken = (roadmap: RoadmapItem[], parent: string, title: string) =>\n roadmap.find(i => (i.parent ?? '') === parent && i.title.trim().toLowerCase() === title.toLowerCase())?.id\n\n/**\n * Just enough shape for the chat UI to render a proposal before the server has validated it\n * (the tool_use streams in before its tool_result). Returns null for anything a card can't draw.\n */\nexport function asRenderablePlan(p: unknown): Plan | null {\n if (!isObj(p)) return null\n const items = (v: unknown, need: string[]) => Array.isArray(v) && v.every(x =>\n isObj(x) && need.every(k => typeof x[k] === 'string') && (x.dependsOn === undefined || Array.isArray(x.dependsOn)))\n if (p.kind === 'breakdown') {\n const target = p.epic === undefined || typeof p.epic === 'string'\n const newEpic = p.newEpic === undefined || (isObj(p.newEpic) && typeof p.newEpic.title === 'string' && typeof p.newEpic.parent === 'string')\n return target && newEpic && items(p.tasks, ['key', 'title']) && (p.tasks as unknown[]).length > 0\n ? (p as unknown as Plan) : null\n }\n if (p.kind === 'roadmap') {\n const horizons = p.horizons ?? [], epics = p.epics ?? []\n return items(horizons, ['key', 'title']) && items(epics, ['key', 'title', 'parent'])\n ? ({ kind: 'roadmap', horizons, epics } as Plan) : null\n }\n return null\n}\n\n/** Every problem with the plan against the current files; [] = valid. */\nexport function validatePlan(plan: unknown, ctx: PlanContext): string[] {\n if (!isObj(plan)) return ['plan must be an object']\n if (plan.kind === 'roadmap') return validateRoadmapPlan(plan, ctx)\n if (plan.kind !== 'breakdown') return [`plan.kind must be \"breakdown\" or \"roadmap\" (got ${JSON.stringify(plan.kind)})`]\n\n const errors: string[] = []\n const epicId = str(plan.epic).toUpperCase()\n if (plan.epic !== undefined && typeof plan.epic !== 'string') errors.push('epic must be a string (an epic id)')\n else if (epicId && plan.newEpic !== undefined) errors.push('pass either epic (an existing epic) or newEpic, not both')\n else if (epicId) {\n const epic = ctx.roadmap.find(i => i.id === epicId)\n if (!epic) errors.push(`Epic ${JSON.stringify(plan.epic)} not found`)\n else if (!epic.parent) errors.push(`${epic.id} is a horizon, not an epic; pass an epic id`)\n } else if (plan.newEpic !== undefined) {\n const e = plan.newEpic\n if (!isObj(e)) errors.push('newEpic must be an object { title, parent, body }')\n else {\n const title = str(e.title), parent = str(e.parent)\n if (!title) errors.push('newEpic: title is required')\n if (typeof e.body !== 'string') errors.push('newEpic: body must be a markdown string')\n if (!parent) errors.push('newEpic: parent is required (an existing horizon id)')\n else {\n const h = resolveHorizon(parent, ctx.roadmap)\n if ('error' in h) errors.push(`newEpic: ${h.error}`)\n else if (title) {\n const other = titleTaken(ctx.roadmap, h.id, title)\n if (other) errors.push(`newEpic: \"${title}\" already exists under ${h.id} (${other})`)\n }\n }\n }\n }\n\n if (!Array.isArray(plan.tasks) || plan.tasks.length === 0) {\n errors.push('tasks must be a non-empty array')\n return errors\n }\n const tasks = plan.tasks as unknown[]\n const existing = new Set(ctx.taskIds.map(t => t.toUpperCase()))\n\n const index = new Map<string, number>()\n tasks.forEach((t, i) => {\n const key = isObj(t) ? str(t.key) : ''\n if (!key) errors.push(`task #${i + 1}: key is required`)\n else if (index.has(key)) errors.push(`duplicate key \"${key}\"`)\n else index.set(key, i)\n })\n\n const deps = new Map<string, string[]>() // key → plan keys it depends on\n tasks.forEach((t, i) => {\n if (!isObj(t)) { errors.push(`task #${i + 1} must be an object`); return }\n const label = str(t.key) || `task #${i + 1}`\n if (!str(t.title)) errors.push(`${label}: title is required`)\n if (typeof t.body !== 'string') errors.push(`${label}: body must be a markdown string`)\n if (t.size !== undefined && typeof t.size !== 'string') errors.push(`${label}: size must be a string`)\n if (t.due !== undefined && !(typeof t.due === 'string' && isDate(t.due))) {\n errors.push(`${label}: due must be a date YYYY-MM-DD (got ${JSON.stringify(t.due)})`)\n }\n if (t.dependsOn === undefined) return\n if (!Array.isArray(t.dependsOn)) { errors.push(`${label}: dependsOn must be an array`); return }\n const own: string[] = []\n for (const d of t.dependsOn) {\n const dep = str(d)\n if (index.has(dep)) own.push(dep)\n else if (!existing.has(dep.toUpperCase())) {\n errors.push(`${label}: dependsOn \"${String(d)}\" is neither a key in this plan nor an existing task`)\n }\n }\n if (str(t.key)) deps.set(str(t.key), own)\n })\n\n // Cycles (DFS, report each once), then forward references: apply creates in order,\n // so a dependency must come earlier in the list to already have its T id.\n const state = new Map<string, 'open' | 'done'>()\n const cyclic = new Set<string>()\n const visit = (k: string, stack: string[]) => {\n if (state.get(k) === 'done') return\n if (state.get(k) === 'open') {\n const cycle = [...stack.slice(stack.indexOf(k)), k]\n if (!cycle.some(c => cyclic.has(c))) errors.push(`dependency cycle: ${cycle.join(' → ')}`)\n cycle.forEach(c => cyclic.add(c))\n return\n }\n state.set(k, 'open')\n for (const d of deps.get(k) ?? []) visit(d, [...stack, k])\n state.set(k, 'done')\n }\n for (const k of deps.keys()) visit(k, [])\n for (const [k, ds] of deps) {\n if (cyclic.has(k)) continue\n for (const d of ds) {\n if ((index.get(d) ?? 0) > (index.get(k) ?? 0)) errors.push(`${k} depends on ${d}, which comes later; list ${d} first`)\n }\n }\n return errors\n}\n\nconst STATUSES = ['planned', 'in-progress', 'done']\n\nfunction validateRoadmapPlan(plan: Record<string, unknown>, ctx: PlanContext): string[] {\n const errors: string[] = []\n const horizons = plan.horizons ?? []\n const epics = plan.epics ?? []\n if (!Array.isArray(horizons)) errors.push('horizons must be an array')\n if (!Array.isArray(epics)) errors.push('epics must be an array')\n if (errors.length > 0) return errors\n const hs = horizons as unknown[]\n const es = epics as unknown[]\n if (hs.length + es.length === 0) return ['a roadmap plan needs at least one horizon or epic']\n\n const keys = new Set<string>()\n const horizonKeys = new Set<string>()\n const checkKey = (v: unknown, label: string, isHorizon: boolean) => {\n const key = isObj(v) ? str(v.key) : ''\n if (!key) errors.push(`${label}: key is required`)\n else if (keys.has(key)) errors.push(`duplicate key \"${key}\"`)\n else { keys.add(key); if (isHorizon) horizonKeys.add(key) }\n }\n hs.forEach((h, i) => checkKey(h, `horizon #${i + 1}`, true))\n es.forEach((e, i) => checkKey(e, `epic #${i + 1}`, false))\n\n // Titles are unique per level (spine, or one horizon), against existing items and within the plan.\n const seen = new Map<string, string>() // \"parent\\0title\" → who in this plan has it\n const claimTitle = (parent: string, title: string, label: string) => {\n const k = `${parent}\\0${title.toLowerCase()}`\n const other = titleTaken(ctx.roadmap, parent, title) ?? seen.get(k)\n if (other) errors.push(`${label}: \"${title}\" already exists ${parent ? `under ${parent}` : 'as a horizon'} (${other})`)\n else seen.set(k, label)\n }\n\n hs.forEach((h, i) => {\n if (!isObj(h)) { errors.push(`horizon #${i + 1} must be an object`); return }\n const label = str(h.key) || `horizon #${i + 1}`\n const title = str(h.title)\n if (!title) errors.push(`${label}: title is required`)\n else claimTitle('', title, label)\n if (h.body !== undefined && typeof h.body !== 'string') errors.push(`${label}: body must be a markdown string`)\n })\n\n es.forEach((e, i) => {\n if (!isObj(e)) { errors.push(`epic #${i + 1} must be an object`); return }\n const label = str(e.key) || `epic #${i + 1}`\n const title = str(e.title)\n if (!title) errors.push(`${label}: title is required`)\n if (typeof e.body !== 'string') errors.push(`${label}: body must be a markdown string`)\n if (e.status !== undefined && !STATUSES.includes(e.status as string)) {\n errors.push(`${label}: status must be one of ${STATUSES.join(', ')} (got ${JSON.stringify(e.status)})`)\n }\n const parent = str(e.parent)\n let parentId = ''\n if (!parent) errors.push(`${label}: parent is required (an existing horizon id or a horizon key in this plan)`)\n else if (horizonKeys.has(parent)) parentId = parent\n else if (keys.has(parent)) errors.push(`${label}: parent \"${parent}\" is an epic in this plan; an epic's parent must be a horizon`)\n else {\n const h = resolveHorizon(parent, ctx.roadmap, 'is neither a horizon key in this plan nor an existing roadmap item')\n if ('id' in h) parentId = h.id\n else errors.push(`${label}: ${h.error}`)\n }\n if (title && parentId) claimTitle(parentId, title, label)\n })\n return errors\n}\n\n/** Keep only the selected items. A kept item depending on an unchecked one is an error. */\nexport function selectPlan(plan: Plan, selected: string[]): { plan: Plan; errors: string[] } {\n if (plan.kind === 'roadmap') return selectRoadmapPlan(plan, selected)\n const errors: string[] = []\n // Trim like validatePlan/applyPlan do, or \" t1 \" vs \"t1\" slips past the unchecked-dependency check\n const keys = new Set(plan.tasks.map(t => t.key.trim()))\n const sel = new Set(selected.map(k => k.trim()))\n for (const k of sel) if (!keys.has(k)) errors.push(`unknown key \"${k}\"`)\n const tasks = plan.tasks.filter(t => sel.has(t.key.trim()))\n if (tasks.length === 0) errors.push('nothing selected')\n for (const t of tasks) {\n for (const d of (t.dependsOn ?? []).map(d => d.trim())) {\n if (keys.has(d) && !sel.has(d)) errors.push(`${t.key.trim()} depends on ${d}, which you unchecked`)\n }\n }\n return { plan: { ...plan, tasks }, errors }\n}\n\nfunction selectRoadmapPlan(plan: Extract<Plan, { kind: 'roadmap' }>, selected: string[]): { plan: Plan; errors: string[] } {\n const errors: string[] = []\n const horizons = plan.horizons ?? []\n const epics = plan.epics ?? []\n const hKeys = new Set(horizons.map(h => h.key))\n const keys = new Set([...hKeys, ...epics.map(e => e.key)])\n const sel = new Set(selected)\n for (const k of sel) if (!keys.has(k)) errors.push(`unknown key \"${k}\"`)\n const keptH = horizons.filter(h => sel.has(h.key))\n const keptE = epics.filter(e => sel.has(e.key))\n if (keptH.length + keptE.length === 0) errors.push('nothing selected')\n for (const e of keptE) {\n const p = e.parent.trim()\n if (hKeys.has(p) && !sel.has(p)) errors.push(`${e.key} is under ${p}, which you unchecked; check ${p} or uncheck ${e.key}`)\n }\n return { plan: { ...plan, horizons: keptH, epics: keptE }, errors }\n}\n","// Pure helpers for agent chats (ChatContext, ChatView, sidebar, /chat page). No React, no fs:\n// `node src/lib/chats.check.mts` runs them.\n\n/** What a chat is about: the roadmap/board show its status there, and the first turn tells the agent. */\nexport interface Attach { kind: \"epic\" | \"task\"; id: string }\n\nexport interface Chat<M = unknown> {\n id: string\n title: string\n messages: M[]\n /** Claude session to `--resume`; set by the first `session_id` in the stream */\n sessionId: string | null\n busy: boolean\n /** Accept/reject outcomes the agent hasn't heard about yet; sent with this chat's next message */\n notes: string[]\n attach: Attach | null\n createdAt: string\n updatedAt: string\n}\n\nexport function newChatId(now: number, salt = Math.random()): string {\n return `c-${now.toString(36)}${salt.toString(36).slice(2, 6)}`\n}\n\nexport function addChat<M>(chats: Chat<M>[], id: string, opts: { title?: string; attach?: Attach | null; now?: string } = {}): Chat<M>[] {\n const now = opts.now ?? new Date().toISOString()\n const title = opts.title ?? (opts.attach ? attachTitle(opts.attach) : \"New chat\")\n return [...chats, { id, title, messages: [], sessionId: null, busy: false, notes: [], attach: opts.attach ?? null, createdAt: now, updatedAt: now }]\n}\n\n/** A missing id (e.g. a closed chat whose stream is still unwinding) is a no-op. */\nexport function patchChat<M>(chats: Chat<M>[], id: string, fn: (c: Chat<M>) => Chat<M>): Chat<M>[] {\n return chats.map((c) => (c.id === id ? fn(c) : c))\n}\n\n/** The fields of a chat message the status reads (ChatContext's ChatMessage has more). */\nexport interface StatusMessage {\n role: \"user\" | \"assistant\"\n text?: string\n tools?: unknown[]\n questions: { answers?: unknown }[]\n proposals: { status: string }[]\n plans: { status: string }[]\n error?: string\n}\n\nexport type ChatStatus = \"running\" | \"needs-answer\" | \"review\" | \"idle\" | \"error\"\n\nexport const STATUS_LABEL: Record<ChatStatus, string> = {\n running: \"Running\",\n \"needs-answer\": \"Waiting for your answers\",\n review: \"Plan or edit to review\",\n error: \"Error\",\n idle: \"Idle\",\n}\n\n/** Plan and edit cards the user hasn't accepted or rejected yet, across the whole chat. */\nexport function pendingReviews(chat: Chat<StatusMessage>): number {\n return chat.messages.reduce(\n (n, m) => n + m.plans.filter((p) => p.status === \"pending\").length + m.proposals.filter((p) => p.status === \"pending\").length,\n 0,\n )\n}\n\n/** Precedence: running > needs-answer > review > error > idle. */\nexport function chatStatus(chat: Chat<StatusMessage>): ChatStatus {\n if (chat.busy) return \"running\"\n const last = chat.messages[chat.messages.length - 1]\n // Same rule as the composer hint: only the latest reply's questions block\n if (last?.questions.some((q) => !q.answers)) return \"needs-answer\"\n if (pendingReviews(chat)) return \"review\"\n const lastReply = chat.messages.findLast((m) => m.role === \"assistant\")\n return lastReply?.error ? \"error\" : \"idle\"\n}\n\nexport const isWaiting = (s: ChatStatus): s is \"needs-answer\" | \"review\" => s === \"needs-answer\" || s === \"review\"\n\n/** Each running chat is one `claude -p` process. */\nexport const MAX_RUNNING_CHATS = 4\nexport const TOO_MANY_CHATS = `Too many agents running (${MAX_RUNNING_CHATS}). Stop or close a chat, or wait.`\n\n/**\n * Where an askAgent() message goes: the current chat when it is idle, otherwise a new chat.\n * Refused at the cap. `running` overrides the busy count when `chats` may be stale (several asks in one tick).\n */\nexport function routeAsk(\n chats: Chat[],\n currentId: string | null,\n opts: { newChat?: boolean; running?: number } = {},\n): { chatId: string } | { newChat: true } | { refused: string } {\n if ((opts.running ?? chats.filter((c) => c.busy).length) >= MAX_RUNNING_CHATS) return { refused: TOO_MANY_CHATS }\n const current = chats.find((c) => c.id === currentId)\n return current && !current.busy && !opts.newChat ? { chatId: current.id } : { newChat: true }\n}\n\n// ─── Attachments ──────────────────────────────────────────────────────────────\n\nexport const attachKey = (a: Attach) => `${a.kind}:${a.id}`\nexport const sameAttach = (a: Attach | null, b: Attach | null) => !!a && !!b && a.kind === b.kind && a.id === b.id\n\nexport function attachTitle(a: Attach): string {\n return a.kind === \"epic\" ? `Epic ${a.id}` : `Task ${a.id}`\n}\n\n/** The epic a message asks to break down: the roadmap's \"Break down with agent\" wording, or the same typed by hand. */\nexport function epicOf(message: string): string | null {\n return message.trim().match(/^Break down epic (R\\d+)/i)?.[1].toUpperCase() ?? null\n}\n\n/** The chat to resume for `a`: the most recently updated one attached to it. */\nexport function chatFor<C extends Chat>(chats: C[], a: Attach): C | undefined {\n return chats.filter((c) => sameAttach(c.attach, a)).sort((x, y) => y.updatedAt.localeCompare(x.updatedAt))[0]\n}\n\n/** What the roadmap/board show on an item while a chat works on it. Idle and errored chats show nothing. */\nexport interface ItemAgent { status: \"running\" | \"needs-answer\" | \"review\"; chatId: string }\n\nconst RANK = { running: 3, \"needs-answer\": 2, review: 1 } as const\n\n/** attachKey → the most urgent chat on it (running > needs-answer > review). */\nexport function itemAgents(chats: Chat<StatusMessage>[]): Record<string, ItemAgent> {\n const out: Record<string, ItemAgent> = {}\n for (const c of chats) {\n const status = chatStatus(c)\n if (!c.attach || status === \"idle\" || status === \"error\") continue\n const key = attachKey(c.attach)\n const cur = out[key]\n if (!cur || RANK[status] > RANK[cur.status]) out[key] = { status, chatId: c.id }\n }\n return out\n}\n\n/** First-turn context for an attached chat; later turns resume the Claude session, which remembers it. */\nexport function attachContext(a: Attach): string {\n return a.kind === \"epic\"\n ? `[This chat is about epic ${a.id}. Read it with vibedoc_get_roadmap (and its tasks with vibedoc_get_task) before answering.]`\n : `[This chat is about task ${a.id}. Read it with vibedoc_get_task before answering.]`\n}\n\n/** Starter prompts shown in an empty chat. Each is something the agent can do with only the vibedoc_* tools. */\nexport function suggestions(a: Attach | null): string[] {\n if (!a) return [\"What should I work on next?\", \"Plan a roadmap for this project.\", \"What is blocked right now?\"]\n if (a.kind === \"epic\") return [`Break down epic ${a.id} into tasks.`, \"Summarize this epic's progress.\", \"What is at risk in this epic?\"]\n return [\"Refine this task's spec.\", \"Split this task into smaller tasks.\", \"What blocks this task?\"]\n}\n\n// ─── Lists ────────────────────────────────────────────────────────────────────\n\nexport interface ChatGroups<C> { needsYou: C[]; running: C[]; recent: C[] }\n\n/** Sidebar and /chat list order: waiting on you, then running, then the rest; newest first within a group. */\nexport function groupChats<C extends Chat<StatusMessage>>(chats: C[]): ChatGroups<C> {\n const byNew = [...chats].sort((a, b) => b.updatedAt.localeCompare(a.updatedAt))\n const groups: ChatGroups<C> = { needsYou: [], running: [], recent: [] }\n for (const c of byNew) {\n const s = chatStatus(c)\n if (isWaiting(s)) groups.needsYou.push(c)\n else if (s === \"running\") groups.running.push(c)\n else groups.recent.push(c)\n }\n return groups\n}\n\n/** The chat the header button / `c` opens: the most urgent, else the newest, else none. */\nexport function defaultChat<C extends Chat<StatusMessage>>(chats: C[]): C | undefined {\n const g = groupChats(chats)\n return g.needsYou[0] ?? g.running[0] ?? g.recent[0]\n}\n\n// ─── Persistence (.vibedoc/chats/<id>.json via /api/conversations) ───────────\n\n/** What gets saved: never busy (a running turn can't survive a reload). Empty chats aren't saved. */\nexport function toSaved<M>(c: Chat<M>): Chat<M> | null {\n return c.messages.length ? { ...c, busy: false } : null\n}\n\n/** A saved chat as loaded: a turn that was cut off (empty last reply, no error) gets an \"interrupted\" error. */\nexport function fromSaved<M extends StatusMessage>(raw: unknown): Chat<M> | null {\n const c = raw as Chat<M> | null\n if (!c || typeof c.id !== \"string\" || !Array.isArray(c.messages)) return null\n const last = c.messages[c.messages.length - 1]\n const cut = last?.role === \"assistant\" && !last.text && !last.error && !last.tools?.length && !last.plans?.length && !last.proposals?.length && !last.questions?.length\n const messages = cut ? [...c.messages.slice(0, -1), { ...last, error: \"Interrupted: the page reloaded while the agent was working.\" }] : c.messages\n const at = c.updatedAt ?? c.createdAt ?? new Date(0).toISOString()\n return { ...c, messages, busy: false, notes: c.notes ?? [], attach: c.attach ?? null, createdAt: c.createdAt ?? at, updatedAt: at }\n}\n\n// ─── Waiting on the user: header badge, page title, desktop notification ─────\n\n/** Chats that became waiting since `prev` (id → last status), so each one notifies once per change. */\nexport function newlyWaiting<C extends Chat<StatusMessage>>(prev: Record<string, ChatStatus>, chats: C[]): { chat: C; status: \"needs-answer\" | \"review\" }[] {\n return chats.flatMap((chat) => {\n const status = chatStatus(chat)\n return isWaiting(status) && prev[chat.id] !== status ? [{ chat, status }] : []\n })\n}\n\n/** \"(2) VibeDoc\" while 2 chats wait; the plain title otherwise. Idempotent. */\nexport function waitingTitle(title: string, n: number): string {\n const base = title.replace(/^\\(\\d+\\) /, \"\")\n return n > 0 ? `(${n}) ${base}` : base\n}\n\nexport function chatTitle(firstMessage: string): string {\n const epic = epicOf(firstMessage)\n if (epic) return `Break down ${epic}`\n const line = firstMessage.trim().split(\"\\n\")[0]\n return line.length > 40 ? `${line.slice(0, 40).trimEnd()}…` : line\n}\n\n/** \"now\", \"5m\", \"3h\", \"2d\" since `iso` (list rows). */\nexport function ago(iso: string, nowMs: number): string {\n const min = Math.max(0, Math.floor((nowMs - Date.parse(iso)) / 60_000))\n if (min < 1) return \"now\"\n if (min < 60) return `${min}m`\n if (min < 60 * 24) return `${Math.floor(min / 60)}h`\n return `${Math.floor(min / (60 * 24))}d`\n}\n"],"names":["isRenderableQuestions","v","isStr","x","Array","isArray","length","every","q","question","header","options","o","label","OTHER","formatAnswers","questions","answers","map","i","join","QuestionCard","set","disabled","onSubmit","picked","setPicked","other","setOther","done","toggle","qi","value","multi","prev","p","includes","filter","labels","l","trim","push","complete","Boolean","className","checked","type","multiSelect","name","id","onChange","description","e","target","placeholder","onClick"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/chat/QuestionCard.tsx","../../../../src/context/ChatContext.tsx","../../../../src/components/chat/StatusMarker.tsx","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/square-check.ts","../../../../src/lib/plan.ts","../../../../src/lib/chats.ts"],"sourcesContent":["\"use client\"\n\nimport { useState } from \"react\"\nimport { cn } from \"@/lib/utils\"\n\nexport interface QuestionOption { label: string; description?: string }\nexport interface Question { question: string; header: string; multiSelect: boolean; options: QuestionOption[] }\n\nexport interface QuestionSet {\n id: string\n questions: Question[]\n /** Set once submitted: one answer string per question, in the same order */\n answers?: string[]\n}\n\n/** Just enough shape to render, checked before the server has validated the tool input. */\nexport function isRenderableQuestions(v: unknown): v is Question[] {\n const isStr = (x: unknown) => typeof x === \"string\"\n return Array.isArray(v) && v.length > 0 && v.every((q) =>\n !!q && typeof q === \"object\" && isStr(q.question) && isStr(q.header) && Array.isArray(q.options) &&\n q.options.every((o: unknown) => !!o && typeof o === \"object\" && isStr((o as QuestionOption).label)))\n}\n\nconst OTHER = \"\\u0000other\"\n\n/** Answer message format the agent parses: one line per question, keyed by header, labels verbatim. */\nexport function formatAnswers(questions: Question[], answers: string[]): string {\n return [\"Answers:\", ...questions.map((q, i) => `- ${q.header}: ${answers[i]}`)].join(\"\\n\")\n}\n\nexport function QuestionCard({ set, disabled, onSubmit }: {\n set: QuestionSet\n disabled?: boolean\n onSubmit: (answers: string[]) => void\n}) {\n const [picked, setPicked] = useState<string[][]>(() => set.questions.map(() => []))\n const [other, setOther] = useState<string[]>(() => set.questions.map(() => \"\"))\n const done = !!set.answers\n\n function toggle(qi: number, value: string, multi: boolean) {\n setPicked((prev) => prev.map((p, i) => {\n if (i !== qi) return p\n if (!multi) return [value]\n return p.includes(value) ? p.filter((v) => v !== value) : [...p, value]\n }))\n }\n\n // Keep the order the options were offered in, with Other last\n const answers = set.questions.map((q, i) => {\n const labels = q.options.map((o) => o.label).filter((l) => picked[i].includes(l))\n if (picked[i].includes(OTHER) && other[i].trim()) labels.push(`Other: \"${other[i].trim()}\"`)\n return labels.join(\", \")\n })\n const complete = answers.every(Boolean)\n\n return (\n <div className=\"my-2 rounded-md border border-border overflow-hidden\" data-question-card>\n <div className=\"flex items-center gap-2 px-2 py-1.5 bg-surface2 border-b border-border\">\n <span className=\"text-[10px] font-mono uppercase tracking-widest text-muted\">Questions</span>\n {done && <span className=\"ml-auto text-[10px] font-mono text-accent\">✓ Answered</span>}\n </div>\n <div className=\"p-2 space-y-3\">\n {set.questions.map((q, qi) => (\n <fieldset key={qi} disabled={done} className=\"space-y-1\">\n <legend className=\"mb-1\">\n <span className=\"text-[10px] font-mono px-1.5 py-0.5 rounded-sm bg-surface2 border border-border text-accent mr-1.5\">{q.header}</span>\n <span className=\"text-xs text-txt\">{q.question}</span>\n </legend>\n {done ? (\n <p className=\"text-xs text-txt pl-1\">{set.answers?.[qi]}</p>\n ) : (\n <>\n {[...q.options, { label: \"Other\", value: OTHER }].map((o) => {\n const value = \"value\" in o ? o.value : o.label\n const checked = picked[qi].includes(value)\n return (\n <label key={value} className={cn(\"flex gap-2 items-start rounded-sm px-1 py-0.5 cursor-pointer hover:bg-surface2\", checked && \"bg-surface2\")}>\n <input\n type={q.multiSelect ? \"checkbox\" : \"radio\"}\n name={`${set.id}-${qi}`}\n checked={checked}\n onChange={() => toggle(qi, value, q.multiSelect)}\n className=\"mt-0.5 accent-accent\"\n />\n <span className=\"text-xs\">\n <span className=\"text-txt\">{o.label}</span>\n {\"description\" in o && o.description && <span className=\"block text-muted\">{o.description}</span>}\n </span>\n </label>\n )\n })}\n {picked[qi].includes(OTHER) && (\n <input\n value={other[qi]}\n onChange={(e) => setOther((prev) => prev.map((v, i) => (i === qi ? e.target.value : v)))}\n placeholder=\"Your answer\"\n aria-label={`Other answer for ${q.header}`}\n className=\"ml-6 w-[calc(100%-1.5rem)] rounded-sm bg-surface2 border border-border px-2 py-1 text-xs text-txt placeholder:text-muted focus:outline-hidden focus:border-accent\"\n />\n )}\n </>\n )}\n </fieldset>\n ))}\n {!done && (\n <button\n onClick={() => onSubmit(answers)}\n disabled={!complete || disabled}\n className=\"text-xs px-2 py-0.5 rounded-sm bg-accent/20 text-accent hover:bg-accent/30 disabled:opacity-50\"\n >\n Submit\n </button>\n )}\n </div>\n </div>\n )\n}\n","\"use client\"\n\n/**\n * Agent chats: one store for the sidebar list, the chat modal, the /chat page and the roadmap/board markers.\n * Each chat is its own `claude -p` session (POST /api/chat per turn); chats are saved to\n * .vibedoc/chats/<id>.json (/api/conversations) at turn end, card resolution and attach changes.\n */\n\nimport { createContext, useContext, useEffect, useMemo, useRef, useState, type ReactNode } from \"react\"\nimport { usePathname, useRouter } from \"next/navigation\"\nimport { useApp } from \"@/context/AppContext\"\nimport type { Proposal, ProposalStatus } from \"@/components/chat/ProposalCard\"\nimport type { PlanCreated, PlanProposal, PlanStatus } from \"@/components/chat/PlanCard\"\nimport { formatAnswers, isRenderableQuestions, type Question, type QuestionSet } from \"@/components/chat/QuestionCard\"\nimport { asRenderablePlan, planTarget } from \"@/lib/plan\"\nimport type { TextEdit } from \"@/lib/diff\"\nimport { ASK_AGENT_EVENT, OPEN_CHAT_EVENT, openAgentChat, type AskAgentDetail } from \"@/lib/ask-agent\"\nimport {\n addChat, attachContext, attachKey, attentionQueue, chatFor, chatStatus, chatTitle, defaultChat, epicOf, fromSaved, isActionableError, isWaiting,\n itemAgents, newChatId, newlyWaiting, nextInQueue, patchChat, pendingReviews, routeAsk, toSaved, waitingTitle,\n type Attach, type Chat, type ChatStatus, type ItemAgent,\n} from \"@/lib/chats\"\n\nexport interface ChatMessage {\n role: \"user\" | \"assistant\"\n text: string\n tools: string[]\n proposals: Proposal[]\n plans: PlanProposal[]\n questions: QuestionSet[]\n error?: string\n}\n\nexport type ChatTab = Chat<ChatMessage>\n\nconst blank = (role: ChatMessage[\"role\"], text = \"\"): ChatMessage =>\n ({ role, text, tools: [], proposals: [], plans: [], questions: [] })\n\ninterface ChatApi {\n chats: ChatTab[]\n loaded: boolean\n /** Chat shown in the modal; null = closed */\n modalId: string | null\n /** keep: don't drop an empty chat (it is moving to the /chat page) */\n closeModal: (opts?: { keep?: boolean }) => void\n /** Open a chat: in the modal, or selected in place when already on /chat */\n show: (chatId: string) => void\n /**\n * Header button / `c`: walks the attention queue (the open chat's next item, else its head); past its end closes\n * the modal; with nothing open and nothing queued, the running or newest chat, else a fresh one.\n */\n showDefault: () => void\n /** Resume the chat attached to `a`, or start one */\n showAbout: (a: Attach) => void\n /** A new empty chat (not saved until its first message); returns its id */\n create: (attach?: Attach | null) => string\n send: (chatId: string, text: string) => void\n stop: (chatId: string) => void\n /** Stop counting an errored chat in the header / rail (saved; the next turn clears it) */\n dismiss: (chatId: string) => void\n /** Delete a chat (asks first when cards are unreviewed); returns false if the user cancelled */\n remove: (chatId: string) => boolean\n resolveProposal: (chatId: string, id: string, path: string, status: ProposalStatus) => void\n resolvePlan: (chatId: string, p: PlanProposal, status: PlanStatus, created: PlanCreated[], unchecked: string[]) => void\n answerQuestions: (chatId: string, set: QuestionSet, answers: string[]) => void\n /** attachKey → the most urgent chat working on that epic/task */\n agents: Record<string, ItemAgent>\n runningCount: number\n waitingCount: number\n /** Errored chats worth an alarm: recent and not dismissed (isActionableError) */\n errorCount: number\n /** Chats that need the user: waiting, then actionable errors (attentionQueue) */\n queue: ChatTab[]\n /** Minute clock the error counts use; pass to isActionableError for per-row checks */\n now: number\n /** An askAgent() refused at the running-chat cap */\n notice: string | null\n dismissNotice: () => void\n}\n\nconst ChatContext = createContext<ChatApi | null>(null)\n// Split out so roadmap nodes and board cards re-render only when some item's status flips, not per stream delta\nconst ItemAgentsContext = createContext<Record<string, ItemAgent>>({})\n\nexport function useChats(): ChatApi {\n const ctx = useContext(ChatContext)\n if (!ctx) throw new Error(\"useChats() must be used inside <ChatProvider>\")\n return ctx\n}\n\n/** The chat working on an epic/task, if any (roadmap nodes, sheets, board cards). */\nexport function useItemAgent(a: Attach): ItemAgent | undefined {\n return useContext(ItemAgentsContext)[attachKey(a)]\n}\n\nexport function ChatProvider({ children }: { children: ReactNode }) {\n const { rootParam, activeProject, selectedDoc } = useApp()\n const pathname = usePathname()\n const router = useRouter()\n const [chats, setChats] = useState<ChatTab[]>([])\n const [loaded, setLoaded] = useState(false)\n const [modalId, setModalId] = useState<string | null>(null)\n // The chat last shown (modal or page): where an askAgent() goes when that chat is idle\n const [currentId, setCurrentId] = useState<string | null>(null)\n const [notice, setNotice] = useState<string | null>(null)\n // One in-flight request per chat; a stream only ever writes into the chat id it was started for\n const abortsRef = useRef(new Map<string, AbortController>())\n // Chats changed since their last save; saved by the effect below once they aren't busy\n const dirtyRef = useRef(new Set<string>())\n const notifiedRef = useRef<Record<string, ChatStatus>>({})\n // Re-read each minute so a day-old error drops out of the alarm counts without a reload\n const [now, setNow] = useState(() => Date.now())\n useEffect(() => {\n const t = setInterval(() => setNow(Date.now()), 60_000)\n return () => clearInterval(t)\n }, [])\n\n const onChatPage = pathname === \"/chat\"\n const docPath = pathname === \"/docs\" ? selectedDoc?.path : undefined\n\n // A Claude session belongs to one project: stop everything and load that project's chats\n useEffect(() => {\n for (const ac of abortsRef.current.values()) ac.abort()\n abortsRef.current.clear()\n dirtyRef.current.clear()\n let cancelled = false\n fetch(`/api/conversations${rootParam}`)\n .then((r) => (r.ok ? r.json() : { chats: [] }))\n .then((d: { chats?: unknown[] }) => {\n if (cancelled) return\n const loadedChats = (d.chats ?? []).map((c) => fromSaved<ChatMessage>(c)).filter((c): c is ChatTab => !!c)\n notifiedRef.current = Object.fromEntries(loadedChats.map((c) => [c.id, chatStatus(c)]))\n setChats(loadedChats)\n setModalId(null)\n setCurrentId(null)\n setLoaded(true)\n })\n .catch((e) => {\n console.warn(\"[vibedoc] could not load chats:\", e)\n if (!cancelled) { setChats([]); setLoaded(true) }\n })\n return () => { cancelled = true }\n }, [activeProject, rootParam])\n\n // Save chats marked dirty: at turn start (so a reload shows it as interrupted), turn end and card resolution.\n // Never per stream delta: nothing marks a chat dirty while it streams.\n useEffect(() => {\n for (const id of [...dirtyRef.current]) {\n const chat = chats.find((c) => c.id === id)\n dirtyRef.current.delete(id)\n const saved = chat && toSaved(chat)\n if (!saved) continue\n fetch(`/api/conversations${rootParam}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ chat: saved }),\n }).catch((e) => console.warn(`[vibedoc] could not save chat ${id}:`, e))\n }\n }, [chats, rootParam])\n\n // Reference-stable while no item's status changes (streaming text changes `chats` many times a second)\n const agentsRef = useRef<{ key: string; value: Record<string, ItemAgent> }>({ key: \"{}\", value: {} })\n const agents = useMemo(() => {\n const next = itemAgents(chats)\n const key = JSON.stringify(next)\n if (key !== agentsRef.current.key) agentsRef.current = { key, value: next }\n return agentsRef.current.value\n }, [chats])\n const runningCount = chats.filter((c) => c.busy).length\n const waitingCount = chats.filter((c) => isWaiting(chatStatus(c))).length\n const errorCount = chats.filter((c) => isActionableError(c, now)).length\n const queue = useMemo(() => attentionQueue(chats, now), [chats, now])\n\n // \"(n) VibeDoc\" in the browser tab; pathname is a dep because a navigation can put Next's metadata title back\n useEffect(() => { document.title = waitingTitle(document.title, queue.length) }, [queue.length, pathname])\n\n // Desktop notification when a chat starts waiting while this browser tab is in the background\n useEffect(() => {\n const fresh = newlyWaiting(notifiedRef.current, chats)\n notifiedRef.current = Object.fromEntries(chats.map((c) => [c.id, chatStatus(c)]))\n if (!fresh.length || !document.hidden || !(\"Notification\" in window) || Notification.permission !== \"granted\") return\n for (const { chat, status } of fresh) {\n const n = new Notification(status === \"needs-answer\" ? \"Agent needs your answer\" : \"Plan ready to review\", { body: chat.title, tag: chat.id })\n n.onclick = () => { window.focus(); openAgentChat(chat.id); n.close() }\n }\n }, [chats])\n\n function markDirty(id: string) { dirtyRef.current.add(id) }\n\n // A chat closed before its first message was never saved; drop it so empty chats don't pile up\n function closeModal(opts: { keep?: boolean } = {}) {\n if (!opts.keep) setChats((cs) => cs.filter((c) => c.id !== modalId || c.messages.length > 0))\n setModalId(null)\n }\n\n function show(chatId: string) {\n setCurrentId(chatId)\n if (onChatPage) {\n setModalId(null)\n router.replace(`/chat?id=${encodeURIComponent(chatId)}`, { scroll: false })\n } else {\n setModalId(chatId)\n }\n }\n\n function create(attach: Attach | null = null) {\n const id = newChatId(Date.now())\n setChats((cs) => addChat(cs, id, { attach }))\n return id\n }\n\n function showDefault() {\n const next = nextInQueue(queue, modalId ?? (onChatPage ? currentId : null))\n if (next) return show(next.id)\n if (modalId) return closeModal()\n const c = defaultChat(chats, now)\n show(c ? c.id : create())\n }\n\n function showAbout(a: Attach) {\n const c = chatFor(chats, a)\n show(c ? c.id : create(a))\n }\n\n // askAgent() from anywhere: into the current chat when it is idle, otherwise into a new one; then show it.\n // No deps on purpose: re-subscribes each render so the handler sees the current `chats`/`send`.\n useEffect(() => {\n function onAsk(e: Event) {\n const { message, newChat } = (e as CustomEvent<AskAgentDetail>).detail ?? {}\n if (!message) return\n // abortsRef is updated synchronously by send(), so it counts asks fired earlier in this same tick\n const route = routeAsk(chats, currentId, { newChat, running: abortsRef.current.size })\n if (\"refused\" in route) return setNotice(route.refused)\n setNotice(null)\n const epic = epicOf(message)\n const id = \"chatId\" in route ? route.chatId : create(epic ? { kind: \"epic\", id: epic } : null)\n send(id, message)\n // newChat asks (the multi-epic breakdown dialog) run in the background: the sidebar and roadmap show them\n if (!newChat) show(id)\n }\n function onOpen(e: Event) {\n const chatId = (e as CustomEvent<{ chatId: string }>).detail?.chatId\n if (chatId && chats.some((c) => c.id === chatId)) show(chatId)\n }\n window.addEventListener(ASK_AGENT_EVENT, onAsk)\n window.addEventListener(OPEN_CHAT_EVENT, onOpen)\n return () => {\n window.removeEventListener(ASK_AGENT_EVENT, onAsk)\n window.removeEventListener(OPEN_CHAT_EVENT, onOpen)\n }\n })\n\n function patchLast(chatId: string, fn: (m: ChatMessage) => ChatMessage) {\n setChats((cs) => patchChat(cs, chatId, (c) => ({ ...c, messages: [...c.messages.slice(0, -1), fn(c.messages[c.messages.length - 1])] })))\n }\n\n // Handles one line of `claude -p --output-format stream-json` for chat `chatId`\n function handleEvent(chatId: string, ev: any) {\n if (ev.session_id) setChats((cs) => patchChat(cs, chatId, (c) => (c.sessionId === ev.session_id ? c : { ...c, sessionId: ev.session_id })))\n if (ev.type === \"stream_event\") {\n const e = ev.event\n if (e?.type === \"message_start\") {\n patchLast(chatId, (m) => (m.text && !m.text.endsWith(\"\\n\\n\") ? { ...m, text: m.text + \"\\n\\n\" } : m))\n } else if (e?.type === \"content_block_delta\" && e.delta?.type === \"text_delta\") {\n patchLast(chatId, (m) => ({ ...m, text: m.text + e.delta.text }))\n }\n } else if (ev.type === \"assistant\") {\n const uses: { type: string; id: string; name: string; input: Record<string, unknown> }[] =\n (ev.message?.content ?? []).filter((b: { type: string }) => b.type === \"tool_use\")\n const proposals: Proposal[] = uses\n .filter((b) => b.name.endsWith(\"vibedoc_propose_edit\") && typeof b.input?.path === \"string\" && Array.isArray(b.input?.edits))\n .map((b) => ({\n id: b.id,\n path: b.input.path as string,\n edits: b.input.edits as TextEdit[],\n summary: typeof b.input.summary === \"string\" ? b.input.summary : undefined,\n status: \"pending\",\n }))\n // Cards render before the server validates the input, so drop shapes they can't draw instead of crashing\n const plans: PlanProposal[] = uses\n .filter((b) => b.name.endsWith(\"vibedoc_propose_plan\"))\n .flatMap((b) => {\n const plan = asRenderablePlan(b.input?.plan)\n return plan ? [{ id: b.id, plan, status: \"pending\" as const }] : []\n })\n const questions: QuestionSet[] = uses\n .filter((b) => b.name.endsWith(\"vibedoc_ask_questions\") && isRenderableQuestions(b.input?.questions))\n .map((b) => ({ id: b.id, questions: b.input.questions as Question[] }))\n const cards = [\"vibedoc_propose_edit\", \"vibedoc_propose_plan\", \"vibedoc_ask_questions\"]\n const tools = uses\n .filter((b) => !cards.some((c) => b.name.endsWith(c)))\n .map((b) => b.name.replace(/^mcp__vibedoc__vibedoc_/, \"\"))\n if (tools.length || proposals.length || plans.length || questions.length) {\n patchLast(chatId, (m) => ({\n ...m,\n tools: [...m.tools, ...tools],\n proposals: [...m.proposals, ...proposals],\n plans: [...m.plans, ...plans],\n questions: [...m.questions, ...questions],\n }))\n }\n } else if (ev.type === \"user\") {\n // A proposal the server rejected (bad old_string) is retried by the agent; don't show it\n const failed = new Set(\n (ev.message?.content ?? [])\n .filter((b: { type: string; is_error?: boolean }) => b.type === \"tool_result\" && b.is_error)\n .map((b: { tool_use_id: string }) => b.tool_use_id),\n )\n if (failed.size) {\n patchLast(chatId, (m) => ({\n ...m,\n proposals: m.proposals.filter((p) => !failed.has(p.id)),\n plans: m.plans.filter((p) => !failed.has(p.id)),\n questions: m.questions.filter((q) => !failed.has(q.id)),\n }))\n }\n } else if (ev.type === \"result\" && ev.is_error) {\n patchLast(chatId, (m) => ({ ...m, error: ev.result ?? ev.subtype ?? \"Agent error\" }))\n } else if (ev.type === \"error\") {\n patchLast(chatId, (m) => ({ ...m, error: ev.message }))\n }\n }\n\n // `chatId` may be a chat create() just queued, so a missing chat means a fresh one.\n async function send(chatId: string, text: string) {\n const message = text.trim()\n const chat = chats.find((c) => c.id === chatId)\n if (!message || chat?.busy) return\n // Ask once, from this click/Enter (browsers want a user gesture), so waiting chats can notify later\n if (\"Notification\" in window && Notification.permission === \"default\") void Notification.requestPermission().catch(() => {})\n const first = !chat?.messages.length\n const epic = epicOf(message)\n const attach: Attach | null = chat?.attach ?? (epic ? { kind: \"epic\", id: epic } : null)\n setChats((cs) => patchChat(cs, chatId, (c) => ({\n ...c,\n // An attached chat keeps its item title until the first message names what it's for\n title: c.messages.length ? c.title : chatTitle(message),\n attach: c.attach ?? attach,\n busy: true,\n dismissed: false,\n notes: [],\n updatedAt: new Date().toISOString(),\n messages: [...c.messages, blank(\"user\", message), blank(\"assistant\")],\n })))\n markDirty(chatId)\n // Context only for a chat opened from an epic/task (showAbout); an ask like \"Break down epic R004…\" names it already\n const prefix = [\n ...(first && chat?.attach ? [attachContext(chat.attach)] : []),\n ...(chat?.notes.length ? [`[${chat.notes.join(\" \")}]`] : []),\n ]\n const outgoing = prefix.length ? `${prefix.join(\"\\n\")}\\n\\n${message}` : message\n const ac = new AbortController()\n abortsRef.current.set(chatId, ac)\n try {\n const res = await fetch(`/api/chat${rootParam}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ message: outgoing, sessionId: chat?.sessionId ?? null, docPath }),\n signal: ac.signal,\n })\n if (!res.ok || !res.body) {\n const data = await res.json().catch(() => null)\n throw new Error(data?.error ?? `Request failed (${res.status})`)\n }\n const reader = res.body.getReader()\n const decoder = new TextDecoder()\n let buf = \"\"\n for (;;) {\n const { done, value } = await reader.read()\n if (done) break\n buf += decoder.decode(value, { stream: true })\n const lines = buf.split(\"\\n\")\n buf = lines.pop() ?? \"\"\n for (const line of lines) {\n if (!line.trim()) continue\n try { handleEvent(chatId, JSON.parse(line)) } catch { /* partial or non-JSON line */ }\n }\n }\n } catch (e) {\n if (!ac.signal.aborted) patchLast(chatId, (m) => ({ ...m, error: (e as Error).message }))\n else patchLast(chatId, (m) => (m.text || m.error ? m : { ...m, error: \"Stopped.\" }))\n } finally {\n // Only save a turn that is still ours: a project switch or delete clears the map first,\n // and saving then would write this chat into the next project (or resurrect a deleted one)\n if (abortsRef.current.get(chatId) === ac) {\n abortsRef.current.delete(chatId)\n markDirty(chatId)\n }\n setChats((cs) => patchChat(cs, chatId, (c) => ({ ...c, busy: false, updatedAt: new Date().toISOString() })))\n }\n }\n\n // Aborting the fetch makes /api/chat kill its `claude -p` child\n function stop(chatId: string) {\n abortsRef.current.get(chatId)?.abort()\n }\n\n function dismiss(chatId: string) {\n setChats((cs) => patchChat(cs, chatId, (c) => ({ ...c, dismissed: true })))\n markDirty(chatId)\n }\n\n function remove(chatId: string) {\n const chat = chats.find((c) => c.id === chatId)\n const n = chat ? pendingReviews(chat) : 0\n if (n && !window.confirm(`Discard ${n} unreviewed proposal${n === 1 ? \"\" : \"s\"}?`)) return false\n stop(chatId)\n abortsRef.current.delete(chatId)\n dirtyRef.current.delete(chatId)\n // Functional update so a stream chunk queued since this render isn't dropped from the other chats\n setChats((cs) => cs.filter((c) => c.id !== chatId))\n if (modalId === chatId) setModalId(null)\n if (currentId === chatId) setCurrentId(null)\n fetch(`/api/conversations${rootParam}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ delete: chatId }),\n }).catch((e) => console.warn(`[vibedoc] could not delete chat ${chatId}:`, e))\n return true\n }\n\n function mapMessages(chatId: string, fn: (m: ChatMessage) => ChatMessage, note?: string) {\n setChats((cs) => patchChat(cs, chatId, (c) => ({\n ...c,\n notes: note ? [...c.notes, note] : c.notes,\n messages: c.messages.map(fn),\n })))\n markDirty(chatId)\n }\n\n function resolveProposal(chatId: string, id: string, path: string, status: ProposalStatus) {\n mapMessages(chatId, (m) => ({\n ...m,\n proposals: m.proposals.map((p) => (p.id === id ? { ...p, status } : p)),\n }), `User ${status} your proposed edit to ${path}.`)\n }\n\n function resolvePlan(chatId: string, p: PlanProposal, status: PlanStatus, created: PlanCreated[], unchecked: string[]) {\n const epic = p.plan.kind === \"breakdown\" ? planTarget(p.plan) : \"the roadmap\"\n mapMessages(chatId, (m) => ({\n ...m,\n plans: m.plans.map((x) => (x.id === p.id ? { ...x, status, created } : x)),\n }), status === \"accepted\"\n ? `User accepted plan for ${epic}: created ${created.map((c) => c.id).join(\", \")}${unchecked.length ? ` (unchecked: ${unchecked.join(\", \")})` : \"\"}.`\n : `User rejected the plan for ${epic}.`)\n }\n\n function answerQuestions(chatId: string, set: QuestionSet, answers: string[]) {\n if (chats.find((c) => c.id === chatId)?.busy) return\n mapMessages(chatId, (m) => ({\n ...m,\n questions: m.questions.map((q) => (q.id === set.id ? { ...q, answers } : q)),\n }))\n send(chatId, formatAnswers(set.questions, answers))\n }\n\n const api: ChatApi = {\n chats, loaded, modalId,\n closeModal,\n show, showDefault, showAbout, create, send, stop, dismiss, remove,\n resolveProposal, resolvePlan, answerQuestions,\n agents, runningCount, waitingCount, errorCount, queue, now,\n notice, dismissNotice: () => setNotice(null),\n }\n return (\n <ChatContext.Provider value={api}>\n <ItemAgentsContext.Provider value={agents}>{children}</ItemAgentsContext.Provider>\n </ChatContext.Provider>\n )\n}\n","\"use client\"\n\nimport { Loader2, Map as MapIcon, SquareCheck } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\nimport { STATUS_LABEL, type Attach, type ChatStatus } from \"@/lib/chats\"\n\n/**\n * Running = spinner; needs answers = pulsing amber dot; review = pulsing accent diamond; error = red dot; idle = hollow dot.\n * Shape and motion differ, not only hue: the accent can be green, close to the teal used for done.\n */\nexport function StatusMarker({ status, showIdle = false, label, className }: { status: ChatStatus; showIdle?: boolean; label?: string; className?: string }) {\n if (status === \"idle\" && !showIdle) return null\n const text = label ?? STATUS_LABEL[status]\n return (\n <span role=\"img\" aria-label={text} title={text} className={cn(\"inline-flex size-3 shrink-0 items-center justify-center\", className)}>\n {status === \"running\" ? (\n <Loader2 className=\"size-3 animate-spin text-accent\" />\n ) : (\n <span\n className={cn(\n \"size-1.5\",\n status === \"review\" ? \"size-2 rotate-45 rounded-[1px] bg-accent animate-pulse-dot\" : \"rounded-full\",\n status === \"needs-answer\" && \"bg-amber animate-pulse-dot\",\n status === \"error\" && \"bg-danger\",\n status === \"idle\" && \"border border-muted/60\",\n )}\n />\n )}\n </span>\n )\n}\n\n/** \"R004\" / \"T055\" with an epic/task icon. Rendered as a span; the caller decides whether it's a link. */\nexport function AttachLabel({ attach, className }: { attach: Attach; className?: string }) {\n const Icon = attach.kind === \"epic\" ? MapIcon : SquareCheck\n return (\n <span className={cn(\"inline-flex items-center gap-1 font-mono text-[10px] leading-none\", className)}>\n <Icon className=\"size-3\" />\n {attach.id}\n </span>\n )\n}\n\nexport function attachHref(a: Attach): string {\n return a.kind === \"epic\" ? `/roadmap?item=${a.id}` : `/board?task=${a.id}`\n}\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'square-check',\n size: 24,\n node: [\n ['rect', { width: '18', height: '18', x: '3', y: '3', rx: '2', key: 'afitv7' }],\n ['path', { d: 'm16 9-5.5 5.5L8 12', key: 'xofnsj' }],\n ],\n aliases: ['check-square-2'],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name SquareCheck\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/square-check\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 SquareCheck = createLucideIcon(__iconData);\n\nexport default SquareCheck;\n","// Pure plan model for \"plan from the chat\": the agent proposes, the user reviews, the server applies.\n// No fs here; core.applyPlan() does the writing. Self-check: node src/lib/plan.check.mts\nimport type { RoadmapItem, RoadmapStatus } from './core'\n\nexport interface PlanTask {\n key: string // stable within the plan, e.g. \"t1\"; becomes a T id on apply\n title: string\n size?: string // \"S (~1 hr)\" | \"M (2–3 hrs)\" | \"L (half day)\"\n dependsOn?: string[] // keys in this plan, or existing task ids (\"T030\")\n due?: string // YYYY-MM-DD\n body: string // full markdown below the meta block: Goal, Context, Scope, Files, …\n}\nexport interface PlanHorizon { key: string; title: string; body?: string }\nexport interface PlanEpic { key: string; title: string; parent: string; status?: RoadmapStatus; body: string } // parent: existing horizon id or a horizon key\nexport interface PlanNewEpic { title: string; parent: string; body: string } // parent: existing horizon id\n/** breakdown: exactly one of `epic` (existing) or `newEpic`, or neither (loose tasks, no Phase). */\nexport type Plan =\n | { kind: 'breakdown'; epic?: string; newEpic?: PlanNewEpic; tasks: PlanTask[] }\n | { kind: 'roadmap'; horizons: PlanHorizon[]; epics: PlanEpic[] }\n\nexport interface PlanContext { roadmap: RoadmapItem[]; taskIds: string[] }\n\n/** A real calendar date \"YYYY-MM-DD\" (rejects 2026-02-30), else null. Same rule as core's parseDue. */\nfunction isDate(raw: string): boolean {\n const m = raw.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/)\n if (!m) return false\n return new Date(Date.UTC(+m[1], +m[2] - 1, +m[3])).toISOString().slice(0, 10) === raw\n}\n\nconst isObj = (v: unknown): v is Record<string, unknown> => !!v && typeof v === 'object' && !Array.isArray(v)\nconst str = (v: unknown) => (typeof v === 'string' ? v.trim() : '')\n\n/** Where a breakdown's tasks go, for one-line summaries: \"R002\", `new epic \"X\"`, or \"no epic\". */\nexport function planTarget(plan: Extract<Plan, { kind: 'breakdown' }>): string {\n if (str(plan.epic)) return str(plan.epic).toUpperCase()\n return plan.newEpic ? `new epic \"${str(plan.newEpic.title)}\"` : 'no epic'\n}\n\n/** An existing roadmap item that can parent an epic (a horizon), else the reason it can't. */\nfunction resolveHorizon(parent: string, roadmap: RoadmapItem[], missing = 'is not an existing roadmap item'): { id: string } | { error: string } {\n const p = roadmap.find(r => r.id === parent.toUpperCase())\n if (!p) return { error: `parent \"${parent}\" ${missing}` }\n if (p.parent !== null) return { error: `parent ${p.id} is an epic, not a horizon (max depth is 2)` }\n return { id: p.id }\n}\n\n/** Id of an existing item with this title under `parent` ('' = horizon level), case-insensitive. */\nconst titleTaken = (roadmap: RoadmapItem[], parent: string, title: string) =>\n roadmap.find(i => (i.parent ?? '') === parent && i.title.trim().toLowerCase() === title.toLowerCase())?.id\n\n/**\n * Just enough shape for the chat UI to render a proposal before the server has validated it\n * (the tool_use streams in before its tool_result). Returns null for anything a card can't draw.\n */\nexport function asRenderablePlan(p: unknown): Plan | null {\n if (!isObj(p)) return null\n const items = (v: unknown, need: string[]) => Array.isArray(v) && v.every(x =>\n isObj(x) && need.every(k => typeof x[k] === 'string') && (x.dependsOn === undefined || Array.isArray(x.dependsOn)))\n if (p.kind === 'breakdown') {\n const target = p.epic === undefined || typeof p.epic === 'string'\n const newEpic = p.newEpic === undefined || (isObj(p.newEpic) && typeof p.newEpic.title === 'string' && typeof p.newEpic.parent === 'string')\n return target && newEpic && items(p.tasks, ['key', 'title']) && (p.tasks as unknown[]).length > 0\n ? (p as unknown as Plan) : null\n }\n if (p.kind === 'roadmap') {\n const horizons = p.horizons ?? [], epics = p.epics ?? []\n return items(horizons, ['key', 'title']) && items(epics, ['key', 'title', 'parent'])\n ? ({ kind: 'roadmap', horizons, epics } as Plan) : null\n }\n return null\n}\n\n/** Every problem with the plan against the current files; [] = valid. */\nexport function validatePlan(plan: unknown, ctx: PlanContext): string[] {\n if (!isObj(plan)) return ['plan must be an object']\n if (plan.kind === 'roadmap') return validateRoadmapPlan(plan, ctx)\n if (plan.kind !== 'breakdown') return [`plan.kind must be \"breakdown\" or \"roadmap\" (got ${JSON.stringify(plan.kind)})`]\n\n const errors: string[] = []\n const epicId = str(plan.epic).toUpperCase()\n if (plan.epic !== undefined && typeof plan.epic !== 'string') errors.push('epic must be a string (an epic id)')\n else if (epicId && plan.newEpic !== undefined) errors.push('pass either epic (an existing epic) or newEpic, not both')\n else if (epicId) {\n const epic = ctx.roadmap.find(i => i.id === epicId)\n if (!epic) errors.push(`Epic ${JSON.stringify(plan.epic)} not found`)\n else if (!epic.parent) errors.push(`${epic.id} is a horizon, not an epic; pass an epic id`)\n } else if (plan.newEpic !== undefined) {\n const e = plan.newEpic\n if (!isObj(e)) errors.push('newEpic must be an object { title, parent, body }')\n else {\n const title = str(e.title), parent = str(e.parent)\n if (!title) errors.push('newEpic: title is required')\n if (typeof e.body !== 'string') errors.push('newEpic: body must be a markdown string')\n if (!parent) errors.push('newEpic: parent is required (an existing horizon id)')\n else {\n const h = resolveHorizon(parent, ctx.roadmap)\n if ('error' in h) errors.push(`newEpic: ${h.error}`)\n else if (title) {\n const other = titleTaken(ctx.roadmap, h.id, title)\n if (other) errors.push(`newEpic: \"${title}\" already exists under ${h.id} (${other})`)\n }\n }\n }\n }\n\n if (!Array.isArray(plan.tasks) || plan.tasks.length === 0) {\n errors.push('tasks must be a non-empty array')\n return errors\n }\n const tasks = plan.tasks as unknown[]\n const existing = new Set(ctx.taskIds.map(t => t.toUpperCase()))\n\n const index = new Map<string, number>()\n tasks.forEach((t, i) => {\n const key = isObj(t) ? str(t.key) : ''\n if (!key) errors.push(`task #${i + 1}: key is required`)\n else if (index.has(key)) errors.push(`duplicate key \"${key}\"`)\n else index.set(key, i)\n })\n\n const deps = new Map<string, string[]>() // key → plan keys it depends on\n tasks.forEach((t, i) => {\n if (!isObj(t)) { errors.push(`task #${i + 1} must be an object`); return }\n const label = str(t.key) || `task #${i + 1}`\n if (!str(t.title)) errors.push(`${label}: title is required`)\n if (typeof t.body !== 'string') errors.push(`${label}: body must be a markdown string`)\n if (t.size !== undefined && typeof t.size !== 'string') errors.push(`${label}: size must be a string`)\n if (t.due !== undefined && !(typeof t.due === 'string' && isDate(t.due))) {\n errors.push(`${label}: due must be a date YYYY-MM-DD (got ${JSON.stringify(t.due)})`)\n }\n if (t.dependsOn === undefined) return\n if (!Array.isArray(t.dependsOn)) { errors.push(`${label}: dependsOn must be an array`); return }\n const own: string[] = []\n for (const d of t.dependsOn) {\n const dep = str(d)\n if (index.has(dep)) own.push(dep)\n else if (!existing.has(dep.toUpperCase())) {\n errors.push(`${label}: dependsOn \"${String(d)}\" is neither a key in this plan nor an existing task`)\n }\n }\n if (str(t.key)) deps.set(str(t.key), own)\n })\n\n // Cycles (DFS, report each once), then forward references: apply creates in order,\n // so a dependency must come earlier in the list to already have its T id.\n const state = new Map<string, 'open' | 'done'>()\n const cyclic = new Set<string>()\n const visit = (k: string, stack: string[]) => {\n if (state.get(k) === 'done') return\n if (state.get(k) === 'open') {\n const cycle = [...stack.slice(stack.indexOf(k)), k]\n if (!cycle.some(c => cyclic.has(c))) errors.push(`dependency cycle: ${cycle.join(' → ')}`)\n cycle.forEach(c => cyclic.add(c))\n return\n }\n state.set(k, 'open')\n for (const d of deps.get(k) ?? []) visit(d, [...stack, k])\n state.set(k, 'done')\n }\n for (const k of deps.keys()) visit(k, [])\n for (const [k, ds] of deps) {\n if (cyclic.has(k)) continue\n for (const d of ds) {\n if ((index.get(d) ?? 0) > (index.get(k) ?? 0)) errors.push(`${k} depends on ${d}, which comes later; list ${d} first`)\n }\n }\n return errors\n}\n\nconst STATUSES = ['planned', 'in-progress', 'done']\n\nfunction validateRoadmapPlan(plan: Record<string, unknown>, ctx: PlanContext): string[] {\n const errors: string[] = []\n const horizons = plan.horizons ?? []\n const epics = plan.epics ?? []\n if (!Array.isArray(horizons)) errors.push('horizons must be an array')\n if (!Array.isArray(epics)) errors.push('epics must be an array')\n if (errors.length > 0) return errors\n const hs = horizons as unknown[]\n const es = epics as unknown[]\n if (hs.length + es.length === 0) return ['a roadmap plan needs at least one horizon or epic']\n\n const keys = new Set<string>()\n const horizonKeys = new Set<string>()\n const checkKey = (v: unknown, label: string, isHorizon: boolean) => {\n const key = isObj(v) ? str(v.key) : ''\n if (!key) errors.push(`${label}: key is required`)\n else if (keys.has(key)) errors.push(`duplicate key \"${key}\"`)\n else { keys.add(key); if (isHorizon) horizonKeys.add(key) }\n }\n hs.forEach((h, i) => checkKey(h, `horizon #${i + 1}`, true))\n es.forEach((e, i) => checkKey(e, `epic #${i + 1}`, false))\n\n // Titles are unique per level (spine, or one horizon), against existing items and within the plan.\n const seen = new Map<string, string>() // \"parent\\0title\" → who in this plan has it\n const claimTitle = (parent: string, title: string, label: string) => {\n const k = `${parent}\\0${title.toLowerCase()}`\n const other = titleTaken(ctx.roadmap, parent, title) ?? seen.get(k)\n if (other) errors.push(`${label}: \"${title}\" already exists ${parent ? `under ${parent}` : 'as a horizon'} (${other})`)\n else seen.set(k, label)\n }\n\n hs.forEach((h, i) => {\n if (!isObj(h)) { errors.push(`horizon #${i + 1} must be an object`); return }\n const label = str(h.key) || `horizon #${i + 1}`\n const title = str(h.title)\n if (!title) errors.push(`${label}: title is required`)\n else claimTitle('', title, label)\n if (h.body !== undefined && typeof h.body !== 'string') errors.push(`${label}: body must be a markdown string`)\n })\n\n es.forEach((e, i) => {\n if (!isObj(e)) { errors.push(`epic #${i + 1} must be an object`); return }\n const label = str(e.key) || `epic #${i + 1}`\n const title = str(e.title)\n if (!title) errors.push(`${label}: title is required`)\n if (typeof e.body !== 'string') errors.push(`${label}: body must be a markdown string`)\n if (e.status !== undefined && !STATUSES.includes(e.status as string)) {\n errors.push(`${label}: status must be one of ${STATUSES.join(', ')} (got ${JSON.stringify(e.status)})`)\n }\n const parent = str(e.parent)\n let parentId = ''\n if (!parent) errors.push(`${label}: parent is required (an existing horizon id or a horizon key in this plan)`)\n else if (horizonKeys.has(parent)) parentId = parent\n else if (keys.has(parent)) errors.push(`${label}: parent \"${parent}\" is an epic in this plan; an epic's parent must be a horizon`)\n else {\n const h = resolveHorizon(parent, ctx.roadmap, 'is neither a horizon key in this plan nor an existing roadmap item')\n if ('id' in h) parentId = h.id\n else errors.push(`${label}: ${h.error}`)\n }\n if (title && parentId) claimTitle(parentId, title, label)\n })\n return errors\n}\n\n/** Keep only the selected items. A kept item depending on an unchecked one is an error. */\nexport function selectPlan(plan: Plan, selected: string[]): { plan: Plan; errors: string[] } {\n if (plan.kind === 'roadmap') return selectRoadmapPlan(plan, selected)\n const errors: string[] = []\n // Trim like validatePlan/applyPlan do, or \" t1 \" vs \"t1\" slips past the unchecked-dependency check\n const keys = new Set(plan.tasks.map(t => t.key.trim()))\n const sel = new Set(selected.map(k => k.trim()))\n for (const k of sel) if (!keys.has(k)) errors.push(`unknown key \"${k}\"`)\n const tasks = plan.tasks.filter(t => sel.has(t.key.trim()))\n if (tasks.length === 0) errors.push('nothing selected')\n for (const t of tasks) {\n for (const d of (t.dependsOn ?? []).map(d => d.trim())) {\n if (keys.has(d) && !sel.has(d)) errors.push(`${t.key.trim()} depends on ${d}, which you unchecked`)\n }\n }\n return { plan: { ...plan, tasks }, errors }\n}\n\nfunction selectRoadmapPlan(plan: Extract<Plan, { kind: 'roadmap' }>, selected: string[]): { plan: Plan; errors: string[] } {\n const errors: string[] = []\n const horizons = plan.horizons ?? []\n const epics = plan.epics ?? []\n const hKeys = new Set(horizons.map(h => h.key))\n const keys = new Set([...hKeys, ...epics.map(e => e.key)])\n const sel = new Set(selected)\n for (const k of sel) if (!keys.has(k)) errors.push(`unknown key \"${k}\"`)\n const keptH = horizons.filter(h => sel.has(h.key))\n const keptE = epics.filter(e => sel.has(e.key))\n if (keptH.length + keptE.length === 0) errors.push('nothing selected')\n for (const e of keptE) {\n const p = e.parent.trim()\n if (hKeys.has(p) && !sel.has(p)) errors.push(`${e.key} is under ${p}, which you unchecked; check ${p} or uncheck ${e.key}`)\n }\n return { plan: { ...plan, horizons: keptH, epics: keptE }, errors }\n}\n","// Pure helpers for agent chats (ChatContext, ChatView, sidebar, /chat page). No React, no fs:\n// `node src/lib/chats.check.mts` runs them.\n\n/** What a chat is about: the roadmap/board show its status there, and the first turn tells the agent. */\nexport interface Attach { kind: \"epic\" | \"task\"; id: string }\n\nexport interface Chat<M = unknown> {\n id: string\n title: string\n messages: M[]\n /** Claude session to `--resume`; set by the first `session_id` in the stream */\n sessionId: string | null\n busy: boolean\n /** Accept/reject outcomes the agent hasn't heard about yet; sent with this chat's next message */\n notes: string[]\n attach: Attach | null\n createdAt: string\n updatedAt: string\n /** The user dismissed this chat's error; cleared by the next turn */\n dismissed?: boolean\n}\n\nexport function newChatId(now: number, salt = Math.random()): string {\n return `c-${now.toString(36)}${salt.toString(36).slice(2, 6)}`\n}\n\nexport function addChat<M>(chats: Chat<M>[], id: string, opts: { title?: string; attach?: Attach | null; now?: string } = {}): Chat<M>[] {\n const now = opts.now ?? new Date().toISOString()\n const title = opts.title ?? (opts.attach ? attachTitle(opts.attach) : \"New chat\")\n return [...chats, { id, title, messages: [], sessionId: null, busy: false, notes: [], attach: opts.attach ?? null, createdAt: now, updatedAt: now }]\n}\n\n/** A missing id (e.g. a closed chat whose stream is still unwinding) is a no-op. */\nexport function patchChat<M>(chats: Chat<M>[], id: string, fn: (c: Chat<M>) => Chat<M>): Chat<M>[] {\n return chats.map((c) => (c.id === id ? fn(c) : c))\n}\n\n/** The fields of a chat message the status reads (ChatContext's ChatMessage has more). */\nexport interface StatusMessage {\n role: \"user\" | \"assistant\"\n text?: string\n tools?: unknown[]\n questions: { answers?: unknown }[]\n proposals: { status: string }[]\n plans: { status: string }[]\n error?: string\n}\n\nexport type ChatStatus = \"running\" | \"needs-answer\" | \"review\" | \"idle\" | \"error\"\n\nexport const STATUS_LABEL: Record<ChatStatus, string> = {\n running: \"Running\",\n \"needs-answer\": \"Waiting for your answers\",\n review: \"Plan or edit to review\",\n error: \"Error\",\n idle: \"Idle\",\n}\n\n/** Plan and edit cards the user hasn't accepted or rejected yet, across the whole chat. */\nexport function pendingReviews(chat: Chat<StatusMessage>): number {\n return chat.messages.reduce(\n (n, m) => n + m.plans.filter((p) => p.status === \"pending\").length + m.proposals.filter((p) => p.status === \"pending\").length,\n 0,\n )\n}\n\n/** Precedence: running > needs-answer > review > error > idle. */\nexport function chatStatus(chat: Chat<StatusMessage>): ChatStatus {\n if (chat.busy) return \"running\"\n const last = chat.messages[chat.messages.length - 1]\n // Same rule as the composer hint: only the latest reply's questions block\n if (last?.questions.some((q) => !q.answers)) return \"needs-answer\"\n if (pendingReviews(chat)) return \"review\"\n const lastReply = chat.messages.findLast((m) => m.role === \"assistant\")\n return lastReply?.error ? \"error\" : \"idle\"\n}\n\n/** Errors older than this stop alarming in the shell; the chat itself still shows them. */\nexport const ERROR_ALARM_MS = 24 * 60 * 60 * 1000\n\n/** An error worth a count in the header / collapsed rail: recent and not dismissed. */\nexport function isActionableError(chat: Chat<StatusMessage>, now: number): boolean {\n return !chat.dismissed && now - Date.parse(chat.updatedAt) < ERROR_ALARM_MS && chatStatus(chat) === \"error\"\n}\n\n/** The status the shell (sidebar, palette) shows: an error that no longer alarms reads as idle. */\nexport function shellStatus(chat: Chat<StatusMessage>, now: number): ChatStatus {\n const s = chatStatus(chat)\n return s === \"error\" && !isActionableError(chat, now) ? \"idle\" : s\n}\n\nexport const isWaiting = (s: ChatStatus): s is \"needs-answer\" | \"review\" => s === \"needs-answer\" || s === \"review\"\n\n/** Each running chat is one `claude -p` process. */\nexport const MAX_RUNNING_CHATS = 4\nexport const TOO_MANY_CHATS = `Too many agents running (${MAX_RUNNING_CHATS}). Stop or close a chat, or wait.`\n\n/**\n * Where an askAgent() message goes: the current chat when it is idle, otherwise a new chat.\n * Refused at the cap. `running` overrides the busy count when `chats` may be stale (several asks in one tick).\n */\nexport function routeAsk(\n chats: Chat[],\n currentId: string | null,\n opts: { newChat?: boolean; running?: number } = {},\n): { chatId: string } | { newChat: true } | { refused: string } {\n if ((opts.running ?? chats.filter((c) => c.busy).length) >= MAX_RUNNING_CHATS) return { refused: TOO_MANY_CHATS }\n const current = chats.find((c) => c.id === currentId)\n return current && !current.busy && !opts.newChat ? { chatId: current.id } : { newChat: true }\n}\n\n// ─── Attachments ──────────────────────────────────────────────────────────────\n\nexport const attachKey = (a: Attach) => `${a.kind}:${a.id}`\nexport const sameAttach = (a: Attach | null, b: Attach | null) => !!a && !!b && a.kind === b.kind && a.id === b.id\n\nexport function attachTitle(a: Attach): string {\n return a.kind === \"epic\" ? `Epic ${a.id}` : `Task ${a.id}`\n}\n\n/** The epic a message asks to break down: the roadmap's \"Break down with agent\" wording, or the same typed by hand. */\nexport function epicOf(message: string): string | null {\n return message.trim().match(/^Break down epic (R\\d+)/i)?.[1].toUpperCase() ?? null\n}\n\n/** The chat to resume for `a`: the most recently updated one attached to it. */\nexport function chatFor<C extends Chat>(chats: C[], a: Attach): C | undefined {\n return chats.filter((c) => sameAttach(c.attach, a)).sort((x, y) => y.updatedAt.localeCompare(x.updatedAt))[0]\n}\n\n/** What the roadmap/board show on an item while a chat works on it. Idle and errored chats show nothing. */\nexport interface ItemAgent { status: \"running\" | \"needs-answer\" | \"review\"; chatId: string }\n\nconst RANK = { running: 3, \"needs-answer\": 2, review: 1 } as const\n\n/** attachKey → the most urgent chat on it (running > needs-answer > review). */\nexport function itemAgents(chats: Chat<StatusMessage>[]): Record<string, ItemAgent> {\n const out: Record<string, ItemAgent> = {}\n for (const c of chats) {\n const status = chatStatus(c)\n if (!c.attach || status === \"idle\" || status === \"error\") continue\n const key = attachKey(c.attach)\n const cur = out[key]\n if (!cur || RANK[status] > RANK[cur.status]) out[key] = { status, chatId: c.id }\n }\n return out\n}\n\n/** First-turn context for an attached chat; later turns resume the Claude session, which remembers it. */\nexport function attachContext(a: Attach): string {\n return a.kind === \"epic\"\n ? `[This chat is about epic ${a.id}. Read it with vibedoc_get_roadmap (and its tasks with vibedoc_get_task) before answering.]`\n : `[This chat is about task ${a.id}. Read it with vibedoc_get_task before answering.]`\n}\n\n/** Starter prompts shown in an empty chat. Each is something the agent can do with only the vibedoc_* tools. */\nexport function suggestions(a: Attach | null): string[] {\n if (!a) return [\"What should I work on next?\", \"Plan a roadmap for this project.\", \"What is blocked right now?\"]\n if (a.kind === \"epic\") return [`Break down epic ${a.id} into tasks.`, \"Summarize this epic's progress.\", \"What is at risk in this epic?\"]\n return [\"Refine this task's spec.\", \"Split this task into smaller tasks.\", \"What blocks this task?\"]\n}\n\n// ─── Lists ────────────────────────────────────────────────────────────────────\n\nexport interface ChatGroups<C> { needsYou: C[]; errors: C[]; running: C[]; recent: C[] }\n\n/**\n * Sidebar and /chat list order: waiting on you, actionable errors, running, then the rest; newest first within a group.\n * `errors` fills only when `now` is given (actionable is time-dependent); without it errored chats stay in `recent`.\n */\nexport function groupChats<C extends Chat<StatusMessage>>(chats: C[], now?: number): ChatGroups<C> {\n const byNew = [...chats].sort((a, b) => b.updatedAt.localeCompare(a.updatedAt))\n const groups: ChatGroups<C> = { needsYou: [], errors: [], running: [], recent: [] }\n for (const c of byNew) {\n const s = chatStatus(c)\n if (isWaiting(s)) groups.needsYou.push(c)\n else if (now !== undefined && isActionableError(c, now)) groups.errors.push(c)\n else if (s === \"running\") groups.running.push(c)\n else groups.recent.push(c)\n }\n return groups\n}\n\n/** What needs the user, in order: chats waiting on you, then actionable errors. `c`, the header strip and ⌘K open its head. */\nexport function attentionQueue<C extends Chat<StatusMessage>>(chats: C[], now: number): C[] {\n const g = groupChats(chats, now)\n return [...g.needsYou, ...g.errors]\n}\n\n/** Where `c` goes from `currentId`: the next queue item after it, the head when it isn't queued, undefined past the end. */\nexport function nextInQueue<C extends Chat>(queue: C[], currentId: string | null): C | undefined {\n const i = queue.findIndex((c) => c.id === currentId)\n return queue[i + 1]\n}\n\n/** The chat the header button / `c` opens: the queue head, else running, else the newest, else none. */\nexport function defaultChat<C extends Chat<StatusMessage>>(chats: C[], now = Date.now()): C | undefined {\n const g = groupChats(chats, now)\n return g.needsYou[0] ?? g.errors[0] ?? g.running[0] ?? g.recent[0]\n}\n\n// ─── Persistence (.vibedoc/chats/<id>.json via /api/conversations) ───────────\n\n/** What gets saved: never busy (a running turn can't survive a reload). Empty chats aren't saved. */\nexport function toSaved<M>(c: Chat<M>): Chat<M> | null {\n return c.messages.length ? { ...c, busy: false } : null\n}\n\n/** A saved chat as loaded: a turn that was cut off (empty last reply, no error) gets an \"interrupted\" error. */\nexport function fromSaved<M extends StatusMessage>(raw: unknown): Chat<M> | null {\n const c = raw as Chat<M> | null\n if (!c || typeof c.id !== \"string\" || !Array.isArray(c.messages)) return null\n const last = c.messages[c.messages.length - 1]\n const cut = last?.role === \"assistant\" && !last.text && !last.error && !last.tools?.length && !last.plans?.length && !last.proposals?.length && !last.questions?.length\n const messages = cut ? [...c.messages.slice(0, -1), { ...last, error: \"Interrupted: the page reloaded while the agent was working.\" }] : c.messages\n const at = c.updatedAt ?? c.createdAt ?? new Date(0).toISOString()\n return { ...c, messages, busy: false, notes: c.notes ?? [], attach: c.attach ?? null, createdAt: c.createdAt ?? at, updatedAt: at }\n}\n\n// ─── Waiting on the user: header badge, page title, desktop notification ─────\n\n/** Chats that became waiting since `prev` (id → last status), so each one notifies once per change. */\nexport function newlyWaiting<C extends Chat<StatusMessage>>(prev: Record<string, ChatStatus>, chats: C[]): { chat: C; status: \"needs-answer\" | \"review\" }[] {\n return chats.flatMap((chat) => {\n const status = chatStatus(chat)\n return isWaiting(status) && prev[chat.id] !== status ? [{ chat, status }] : []\n })\n}\n\n/** \"(2) VibeDoc\" while 2 chats need you (the attention queue); the plain title otherwise. Idempotent. */\nexport function waitingTitle(title: string, n: number): string {\n const base = title.replace(/^\\(\\d+\\) /, \"\")\n return n > 0 ? `(${n}) ${base}` : base\n}\n\nexport function chatTitle(firstMessage: string): string {\n const epic = epicOf(firstMessage)\n if (epic) return `Break down ${epic}`\n const line = firstMessage.trim().split(\"\\n\")[0]\n return line.length > 40 ? `${line.slice(0, 40).trimEnd()}…` : line\n}\n\n/** \"now\", \"5m\", \"3h\", \"2d\" since `iso` (list rows). */\nexport function ago(iso: string, nowMs: number): string {\n const min = Math.max(0, Math.floor((nowMs - Date.parse(iso)) / 60_000))\n if (min < 1) return \"now\"\n if (min < 60) return `${min}m`\n if (min < 60 * 24) return `${Math.floor(min / 60)}h`\n return `${Math.floor(min / (60 * 24))}d`\n}\n"],"names":["q","o","isRenderableQuestions","v","isStr","x","Array","isArray","length","every","question","header","options","label","OTHER","other","setOther","QuestionCard","toggle","formatAnswers","value","questions","answers","prev","map","i","join","onSubmit","includes","p","set","disabled","qi","picked","setPicked","done","multi","filter","labels","l","trim","push","complete","Boolean","className","checked","e","type","multiSelect","name","id","onChange","description","target","placeholder","onClick"],"mappings":"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","ignoreList":[3]}
|
|
@@ -7,9 +7,9 @@ globalThis.__BUILD_MANIFEST = {
|
|
|
7
7
|
"static/chunks/0cz1d0mv5g_q7.js"
|
|
8
8
|
],
|
|
9
9
|
"lowPriorityFiles": [
|
|
10
|
-
"static/
|
|
11
|
-
"static/
|
|
12
|
-
"static/
|
|
10
|
+
"static/fGPda81_8-K4GmaNUE6KA/_buildManifest.js",
|
|
11
|
+
"static/fGPda81_8-K4GmaNUE6KA/_ssgManifest.js",
|
|
12
|
+
"static/fGPda81_8-K4GmaNUE6KA/_clientMiddlewareManifest.js"
|
|
13
13
|
],
|
|
14
14
|
"rootMainFiles": [
|
|
15
15
|
"static/chunks/27culnr-k4v7j.js",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
self.__NEXT_FONT_MANIFEST="{\n \"app\": {\n \"[project]/src/app/(app)/activity/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.0wgildi0cnwt9.woff2\",\n \"static/media/797e433ab948586e-s.p.0r6juujl39pe6.woff2\"\n ],\n \"[project]/src/app/(app)/board/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.0wgildi0cnwt9.woff2\",\n \"static/media/797e433ab948586e-s.p.0r6juujl39pe6.woff2\"\n ],\n \"[project]/src/app/(app)/chat/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.0wgildi0cnwt9.woff2\",\n \"static/media/797e433ab948586e-s.p.0r6juujl39pe6.woff2\"\n ],\n \"[project]/src/app/(app)/docs/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.0wgildi0cnwt9.woff2\",\n \"static/media/797e433ab948586e-s.p.0r6juujl39pe6.woff2\"\n ],\n \"[project]/src/app/(app)/explorer/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.0wgildi0cnwt9.woff2\",\n \"static/media/797e433ab948586e-s.p.0r6juujl39pe6.woff2\"\n ],\n \"[project]/src/app/(app)/memory/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.0wgildi0cnwt9.woff2\",\n \"static/media/797e433ab948586e-s.p.0r6juujl39pe6.woff2\"\n ],\n \"[project]/src/app/(app)/roadmap/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.0wgildi0cnwt9.woff2\",\n \"static/media/797e433ab948586e-s.p.0r6juujl39pe6.woff2\"\n ],\n \"[project]/src/app/(app)/settings/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.0wgildi0cnwt9.woff2\",\n \"static/media/797e433ab948586e-s.p.0r6juujl39pe6.woff2\"\n ],\n \"[project]/src/app/(app)/setup/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.0wgildi0cnwt9.woff2\",\n \"static/media/797e433ab948586e-s.p.0r6juujl39pe6.woff2\"\n ],\n \"[project]/src/app/_not-found/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.0wgildi0cnwt9.woff2\",\n \"static/media/797e433ab948586e-s.p.0r6juujl39pe6.woff2\"\n ],\n \"[project]/src/app/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.0wgildi0cnwt9.woff2\",\n \"static/media/797e433ab948586e-s.p.0r6juujl39pe6.woff2\"\n ]\n },\n \"appUsingSizeAdjust\": true,\n \"pages\": {},\n \"pagesUsingSizeAdjust\": false\n}"
|
|
1
|
+
self.__NEXT_FONT_MANIFEST="{\n \"app\": {\n \"[project]/src/app/(app)/activity/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.0wgildi0cnwt9.woff2\",\n \"static/media/797e433ab948586e-s.p.0r6juujl39pe6.woff2\"\n ],\n \"[project]/src/app/(app)/board/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.0wgildi0cnwt9.woff2\",\n \"static/media/797e433ab948586e-s.p.0r6juujl39pe6.woff2\"\n ],\n \"[project]/src/app/(app)/chat/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.0wgildi0cnwt9.woff2\",\n \"static/media/797e433ab948586e-s.p.0r6juujl39pe6.woff2\"\n ],\n \"[project]/src/app/(app)/docs/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.0wgildi0cnwt9.woff2\",\n \"static/media/797e433ab948586e-s.p.0r6juujl39pe6.woff2\"\n ],\n \"[project]/src/app/(app)/explorer/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.0wgildi0cnwt9.woff2\",\n \"static/media/797e433ab948586e-s.p.0r6juujl39pe6.woff2\"\n ],\n \"[project]/src/app/(app)/manual-tests/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.0wgildi0cnwt9.woff2\",\n \"static/media/797e433ab948586e-s.p.0r6juujl39pe6.woff2\"\n ],\n \"[project]/src/app/(app)/memory/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.0wgildi0cnwt9.woff2\",\n \"static/media/797e433ab948586e-s.p.0r6juujl39pe6.woff2\"\n ],\n \"[project]/src/app/(app)/roadmap/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.0wgildi0cnwt9.woff2\",\n \"static/media/797e433ab948586e-s.p.0r6juujl39pe6.woff2\"\n ],\n \"[project]/src/app/(app)/settings/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.0wgildi0cnwt9.woff2\",\n \"static/media/797e433ab948586e-s.p.0r6juujl39pe6.woff2\"\n ],\n \"[project]/src/app/(app)/setup/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.0wgildi0cnwt9.woff2\",\n \"static/media/797e433ab948586e-s.p.0r6juujl39pe6.woff2\"\n ],\n \"[project]/src/app/_not-found/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.0wgildi0cnwt9.woff2\",\n \"static/media/797e433ab948586e-s.p.0r6juujl39pe6.woff2\"\n ],\n \"[project]/src/app/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.0wgildi0cnwt9.woff2\",\n \"static/media/797e433ab948586e-s.p.0r6juujl39pe6.woff2\"\n ]\n },\n \"appUsingSizeAdjust\": true,\n \"pages\": {},\n \"pagesUsingSizeAdjust\": false\n}"
|
|
@@ -20,6 +20,10 @@
|
|
|
20
20
|
"static/media/caa3a2e1cccd8315-s.p.0wgildi0cnwt9.woff2",
|
|
21
21
|
"static/media/797e433ab948586e-s.p.0r6juujl39pe6.woff2"
|
|
22
22
|
],
|
|
23
|
+
"[project]/src/app/(app)/manual-tests/page": [
|
|
24
|
+
"static/media/caa3a2e1cccd8315-s.p.0wgildi0cnwt9.woff2",
|
|
25
|
+
"static/media/797e433ab948586e-s.p.0r6juujl39pe6.woff2"
|
|
26
|
+
],
|
|
23
27
|
"[project]/src/app/(app)/memory/page": [
|
|
24
28
|
"static/media/caa3a2e1cccd8315-s.p.0wgildi0cnwt9.woff2",
|
|
25
29
|
"static/media/797e433ab948586e-s.p.0r6juujl39pe6.woff2"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en" class="dark geist_9c6cb61b-module__8NX9hq__variable geist_mono_d6617093-module__z61v7q__variable inter_ce44cde5-module__EWa6Cq__variable ibm_plex_sans_abbe3f68-module__2aQ_Fa__variable atkinson_hyperlegible_86f3eeac-module__H04cSq__variable dm_sans_4dbccdff-module__kMSx3G__variable jetbrains_mono_d9365dea-module__eFWXIa__variable ibm_plex_mono_a350e774-module__yi3qSG__variable dm_mono_c5369204-module__U0WqgG__variable" data-font-sans="geist" data-font-mono="geist-mono"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/
|
|
1
|
+
<!DOCTYPE html><html lang="en" class="dark geist_9c6cb61b-module__8NX9hq__variable geist_mono_d6617093-module__z61v7q__variable inter_ce44cde5-module__EWa6Cq__variable ibm_plex_sans_abbe3f68-module__2aQ_Fa__variable atkinson_hyperlegible_86f3eeac-module__H04cSq__variable dm_sans_4dbccdff-module__kMSx3G__variable jetbrains_mono_d9365dea-module__eFWXIa__variable ibm_plex_mono_a350e774-module__yi3qSG__variable dm_mono_c5369204-module__U0WqgG__variable" data-font-sans="geist" data-font-mono="geist-mono"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/02i5hsdat1nuq.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/150y5rwg6gwvx.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/27culnr-k4v7j.js"/><script src="/_next/static/chunks/40re3aog6ymmi.js" async=""></script><script src="/_next/static/chunks/2nizd2srt2-vm.js" async=""></script><script src="/_next/static/chunks/1i9a4z5i_ajz0.js" async=""></script><script src="/_next/static/chunks/turbopack-2qsbj8zx38t0j.js" async=""></script><script src="/_next/static/chunks/2n91moa8g45as.js" async=""></script><script src="/_next/static/chunks/1dyovtojnx0d4.js" async=""></script><meta name="robots" content="noindex"/><title>VibeDoc</title><meta name="description" content="Project intelligence for AI-assisted development"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><script src="/_next/static/chunks/0cz1d0mv5g_q7.js" noModule=""></script></head><body class="bg-bg text-txt min-h-screen"><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/27culnr-k4v7j.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[796229,[\"/_next/static/chunks/2n91moa8g45as.js\"],\"default\"]\n3:I[32339,[\"/_next/static/chunks/2n91moa8g45as.js\"],\"default\"]\n4:I[48081,[\"/_next/static/chunks/2n91moa8g45as.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[48081,[\"/_next/static/chunks/2n91moa8g45as.js\"],\"ViewportBoundary\"]\na:I[48081,[\"/_next/static/chunks/2n91moa8g45as.js\"],\"MetadataBoundary\"]\nc:I[563491,[\"/_next/static/chunks/2n91moa8g45as.js\",\"/_next/static/chunks/1dyovtojnx0d4.js\"],\"default\"]\n:HL[\"/_next/static/chunks/02i5hsdat1nuq.css\",\"style\"]\n:HL[\"/_next/static/chunks/150y5rwg6gwvx.css\",\"style\"]\n7:X\n0:{\"P\":null,\"c\":[\"\",\"_not-found\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{},\"$undefined\",\"$undefined\",4608]},\"$undefined\",\"$undefined\",4608]},\"$undefined\",\"$undefined\",4624],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/02i5hsdat1nuq.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/150y5rwg6gwvx.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/2n91moa8g45as.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"dark geist_9c6cb61b-module__8NX9hq__variable geist_mono_d6617093-module__z61v7q__variable inter_ce44cde5-module__EWa6Cq__variable ibm_plex_sans_abbe3f68-module__2aQ_Fa__variable atkinson_hyperlegible_86f3eeac-module__H04cSq__variable dm_sans_4dbccdff-module__kMSx3G__variable jetbrains_mono_d9365dea-module__eFWXIa__variable ibm_plex_mono_a350e774-module__yi3qSG__variable dm_mono_c5369204-module__U0WqgG__variable\",\"data-font-sans\":\"geist\",\"data-font-mono\":\"geist-mono\",\"children\":[\"$\",\"body\",null,{\"className\":\"bg-bg text-txt min-h-screen\",\"children\":[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$7\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/02i5hsdat1nuq.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/150y5rwg6gwvx.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]]],\"S\":true,\"h\":null,\"r\":\"$undefined\",\"s\":\"$undefined\",\"a\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"fGPda81_8-K4GmaNUE6KA\"}\n7:C\n9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n6:null\nb:[[\"$\",\"title\",\"0\",{\"children\":\"VibeDoc\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Project intelligence for AI-assisted development\"}]]\n"])</script></body></html>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/27culnr-k4v7j.js"/><script src="/_next/static/chunks/40re3aog6ymmi.js" async=""></script><script src="/_next/static/chunks/2nizd2srt2-vm.js" async=""></script><script src="/_next/static/chunks/1i9a4z5i_ajz0.js" async=""></script><script src="/_next/static/chunks/turbopack-2qsbj8zx38t0j.js" async=""></script><script src="/_next/static/chunks/27xj8jkjt-ck1.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: This page couldn’t load</title><style>:root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }</style><script src="/_next/static/chunks/0cz1d0mv5g_q7.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;display:flex;align-items:center;justify-content:center"><div style="margin-top:-32px;max-width:325px;padding:32px 28px;text-align:left"><svg width="32" height="32" viewBox="-0.2 -1.5 32 32" fill="none" style="margin-bottom:24px"><path d="M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z" fill="var(--next-error-title)"></path></svg><h1 style="font-size:24px;font-weight:500;letter-spacing:-0.02em;line-height:32px;margin:0 0 12px 0;color:var(--next-error-title)">This page couldn’t load</h1><p style="font-size:14px;font-weight:400;line-height:21px;margin:0 0 20px 0;color:var(--next-error-message)">A server error occurred. Reload to try again.</p><form style="margin:0"><button type="submit" style="display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;font-size:14px;font-weight:500;line-height:20px;border-radius:6px;cursor:pointer;color:var(--next-error-btn-text);background:var(--next-error-btn-bg);border:var(--next-error-btn-border)">Reload</button></form></div></div><!--$--><!--/$--><script src="/_next/static/chunks/27culnr-k4v7j.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[796229,[\"/_next/static/chunks/27xj8jkjt-ck1.js\"],\"default\"]\n3:I[32339,[\"/_next/static/chunks/27xj8jkjt-ck1.js\"],\"default\"]\n4:I[48081,[\"/_next/static/chunks/27xj8jkjt-ck1.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[48081,[\"/_next/static/chunks/27xj8jkjt-ck1.js\"],\"ViewportBoundary\"]\na:I[48081,[\"/_next/static/chunks/27xj8jkjt-ck1.js\"],\"MetadataBoundary\"]\nc:I[563491,[\"/_next/static/chunks/27xj8jkjt-ck1.js\"],\"default\"]\n7:X\n0:{\"P\":null,\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{},\"$undefined\",\"$undefined\",4624]},\"$undefined\",\"$undefined\",4624],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"title\",null,{\"children\":\"500: This page couldn’t load\"}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"marginTop\":\"-32px\",\"maxWidth\":\"325px\",\"padding\":\"32px 28px\",\"textAlign\":\"left\"},\"children\":[[\"$\",\"svg\",null,{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"-0.2 -1.5 32 32\",\"fill\":\"none\",\"style\":{\"marginBottom\":\"24px\"},\"children\":[\"$\",\"path\",null,{\"d\":\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\",\"fill\":\"var(--next-error-title)\"}]}],[\"$\",\"h1\",null,{\"style\":{\"fontSize\":\"24px\",\"fontWeight\":500,\"letterSpacing\":\"-0.02em\",\"lineHeight\":\"32px\",\"margin\":\"0 0 12px 0\",\"color\":\"var(--next-error-title)\"},\"children\":\"This page couldn’t load\"}],[\"$\",\"p\",null,{\"style\":{\"fontSize\":\"14px\",\"fontWeight\":400,\"lineHeight\":\"21px\",\"margin\":\"0 0 20px 0\",\"color\":\"var(--next-error-message)\"},\"children\":\"A server error occurred. Reload to try again.\"}],[\"$\",\"form\",null,{\"style\":{\"margin\":0},\"children\":[\"$\",\"button\",null,{\"type\":\"submit\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"height\":\"32px\",\"padding\":\"0 12px\",\"fontSize\":\"14px\",\"fontWeight\":500,\"lineHeight\":\"20px\",\"borderRadius\":\"6px\",\"cursor\":\"pointer\",\"color\":\"var(--next-error-btn-text)\",\"background\":\"var(--next-error-btn-bg)\",\"border\":\"var(--next-error-btn-border)\"},\"children\":\"Reload\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$7\"],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"r\":\"$undefined\",\"s\":\"$undefined\",\"a\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"
|
|
1
|
+
<!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/27culnr-k4v7j.js"/><script src="/_next/static/chunks/40re3aog6ymmi.js" async=""></script><script src="/_next/static/chunks/2nizd2srt2-vm.js" async=""></script><script src="/_next/static/chunks/1i9a4z5i_ajz0.js" async=""></script><script src="/_next/static/chunks/turbopack-2qsbj8zx38t0j.js" async=""></script><script src="/_next/static/chunks/27xj8jkjt-ck1.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: This page couldn’t load</title><style>:root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }</style><script src="/_next/static/chunks/0cz1d0mv5g_q7.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;display:flex;align-items:center;justify-content:center"><div style="margin-top:-32px;max-width:325px;padding:32px 28px;text-align:left"><svg width="32" height="32" viewBox="-0.2 -1.5 32 32" fill="none" style="margin-bottom:24px"><path d="M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z" fill="var(--next-error-title)"></path></svg><h1 style="font-size:24px;font-weight:500;letter-spacing:-0.02em;line-height:32px;margin:0 0 12px 0;color:var(--next-error-title)">This page couldn’t load</h1><p style="font-size:14px;font-weight:400;line-height:21px;margin:0 0 20px 0;color:var(--next-error-message)">A server error occurred. Reload to try again.</p><form style="margin:0"><button type="submit" style="display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;font-size:14px;font-weight:500;line-height:20px;border-radius:6px;cursor:pointer;color:var(--next-error-btn-text);background:var(--next-error-btn-bg);border:var(--next-error-btn-border)">Reload</button></form></div></div><!--$--><!--/$--><script src="/_next/static/chunks/27culnr-k4v7j.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[796229,[\"/_next/static/chunks/27xj8jkjt-ck1.js\"],\"default\"]\n3:I[32339,[\"/_next/static/chunks/27xj8jkjt-ck1.js\"],\"default\"]\n4:I[48081,[\"/_next/static/chunks/27xj8jkjt-ck1.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[48081,[\"/_next/static/chunks/27xj8jkjt-ck1.js\"],\"ViewportBoundary\"]\na:I[48081,[\"/_next/static/chunks/27xj8jkjt-ck1.js\"],\"MetadataBoundary\"]\nc:I[563491,[\"/_next/static/chunks/27xj8jkjt-ck1.js\"],\"default\"]\n7:X\n0:{\"P\":null,\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{},\"$undefined\",\"$undefined\",4624]},\"$undefined\",\"$undefined\",4624],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"title\",null,{\"children\":\"500: This page couldn’t load\"}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"marginTop\":\"-32px\",\"maxWidth\":\"325px\",\"padding\":\"32px 28px\",\"textAlign\":\"left\"},\"children\":[[\"$\",\"svg\",null,{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"-0.2 -1.5 32 32\",\"fill\":\"none\",\"style\":{\"marginBottom\":\"24px\"},\"children\":[\"$\",\"path\",null,{\"d\":\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\",\"fill\":\"var(--next-error-title)\"}]}],[\"$\",\"h1\",null,{\"style\":{\"fontSize\":\"24px\",\"fontWeight\":500,\"letterSpacing\":\"-0.02em\",\"lineHeight\":\"32px\",\"margin\":\"0 0 12px 0\",\"color\":\"var(--next-error-title)\"},\"children\":\"This page couldn’t load\"}],[\"$\",\"p\",null,{\"style\":{\"fontSize\":\"14px\",\"fontWeight\":400,\"lineHeight\":\"21px\",\"margin\":\"0 0 20px 0\",\"color\":\"var(--next-error-message)\"},\"children\":\"A server error occurred. Reload to try again.\"}],[\"$\",\"form\",null,{\"style\":{\"margin\":0},\"children\":[\"$\",\"button\",null,{\"type\":\"submit\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"height\":\"32px\",\"padding\":\"0 12px\",\"fontSize\":\"14px\",\"fontWeight\":500,\"lineHeight\":\"20px\",\"borderRadius\":\"6px\",\"cursor\":\"pointer\",\"color\":\"var(--next-error-btn-text)\",\"background\":\"var(--next-error-btn-bg)\",\"border\":\"var(--next-error-btn-border)\"},\"children\":\"Reload\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$7\"],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"r\":\"$undefined\",\"s\":\"$undefined\",\"a\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"fGPda81_8-K4GmaNUE6KA\"}\n7:C\n9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n6:null\nb:[]\n"])</script></body></html>
|
|
@@ -117,6 +117,25 @@
|
|
|
117
117
|
}
|
|
118
118
|
}
|
|
119
119
|
},
|
|
120
|
+
"/manual-tests": {
|
|
121
|
+
"hints": 64,
|
|
122
|
+
"slots": {
|
|
123
|
+
"children": {
|
|
124
|
+
"hints": 96,
|
|
125
|
+
"slots": {
|
|
126
|
+
"children": {
|
|
127
|
+
"hints": 96,
|
|
128
|
+
"slots": {
|
|
129
|
+
"children": {
|
|
130
|
+
"hints": 160,
|
|
131
|
+
"slots": null
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
},
|
|
120
139
|
"/memory": {
|
|
121
140
|
"hints": 64,
|
|
122
141
|
"slots": {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
self.__RSC_SERVER_MANIFEST="{\n \"node\": {},\n \"edge\": {},\n \"encryptionKey\": \"
|
|
1
|
+
self.__RSC_SERVER_MANIFEST="{\n \"node\": {},\n \"edge\": {},\n \"encryptionKey\": \"7iTORxnC3d7l3xqmKwrI7gD/tHOE5yhiajrvRhGvfSY=\"\n}"
|