fleetlens 0.4.0 → 0.6.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/app/apps/web/.next/BUILD_ID +1 -1
- package/app/apps/web/.next/app-path-routes-manifest.json +16 -7
- package/app/apps/web/.next/build-manifest.json +7 -7
- package/app/apps/web/.next/prerender-manifest.json +3 -3
- package/app/apps/web/.next/required-server-files.json +2 -1
- package/app/apps/web/.next/routes-manifest.json +86 -24
- package/app/apps/web/.next/server/app/_global-error/page/build-manifest.json +4 -4
- package/app/apps/web/.next/server/app/_global-error/page.js +1 -1
- package/app/apps/web/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/_global-error.html +1 -1
- package/app/apps/web/.next/server/app/_global-error.rsc +7 -7
- package/app/apps/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
- package/app/apps/web/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
- package/app/apps/web/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
- package/app/apps/web/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
- package/app/apps/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/app/apps/web/.next/server/app/_not-found/page/build-manifest.json +4 -4
- package/app/apps/web/.next/server/app/_not-found/page.js +5 -4
- package/app/apps/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/api/digest/day/[date]/route/app-paths-manifest.json +3 -0
- package/app/apps/web/.next/server/app/api/digest/day/[date]/route.js +9 -0
- package/app/apps/web/.next/server/app/api/{insights/saved/[key] → digest/day/[date]}/route.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/api/digest/day/[date]/route_client-reference-manifest.js +3 -0
- package/app/apps/web/.next/server/app/api/digest/month/[yearMonth]/route/app-paths-manifest.json +3 -0
- package/app/apps/web/.next/server/app/api/digest/month/[yearMonth]/route.js +9 -0
- package/app/apps/web/.next/server/app/api/digest/month/[yearMonth]/route.js.nft.json +1 -0
- package/app/apps/web/.next/server/app/api/digest/month/[yearMonth]/route_client-reference-manifest.js +3 -0
- package/app/apps/web/.next/server/app/api/digest/month-index/route/app-paths-manifest.json +3 -0
- package/app/apps/web/.next/server/app/api/digest/month-index/route.js +7 -0
- package/app/apps/web/.next/server/app/api/{insights/months-index → digest/month-index}/route.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/api/{insights/pdf/[key] → digest/month-index}/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/api/digest/week/[startDate]/route/app-paths-manifest.json +3 -0
- package/app/apps/web/.next/server/app/api/digest/week/[startDate]/route.js +9 -0
- package/app/apps/web/.next/server/app/api/digest/week/[startDate]/route.js.nft.json +1 -0
- package/app/apps/web/.next/server/app/api/digest/week/[startDate]/route_client-reference-manifest.js +3 -0
- package/app/apps/web/.next/server/app/api/digest/week-index/route/app-paths-manifest.json +3 -0
- package/app/apps/web/.next/server/app/api/digest/week-index/route.js +7 -0
- package/app/apps/web/.next/server/app/api/{insights/weeks-index → digest/week-index}/route.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/api/digest/week-index/route_client-reference-manifest.js +3 -0
- package/app/apps/web/.next/server/app/api/jobs/route/app-paths-manifest.json +3 -0
- package/app/apps/web/.next/server/app/api/jobs/route.js +6 -0
- package/app/apps/web/.next/server/app/api/jobs/route.js.nft.json +1 -0
- package/app/apps/web/.next/server/app/api/jobs/route_client-reference-manifest.js +3 -0
- package/app/apps/web/.next/server/app/api/runs/[runId]/route/app-paths-manifest.json +3 -0
- package/app/apps/web/.next/server/app/api/runs/[runId]/route/build-manifest.json +9 -0
- package/app/apps/web/.next/server/app/api/runs/[runId]/route.js +6 -0
- package/app/apps/web/.next/server/app/api/{insights/saved → runs/[runId]}/route.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/api/runs/[runId]/route_client-reference-manifest.js +3 -0
- package/app/apps/web/.next/server/app/api/runs/[runId]/stream/route/app-paths-manifest.json +3 -0
- package/app/apps/web/.next/server/app/api/runs/[runId]/stream/route/build-manifest.json +9 -0
- package/app/apps/web/.next/server/app/api/runs/[runId]/stream/route/server-reference-manifest.json +4 -0
- package/app/apps/web/.next/server/app/api/runs/[runId]/stream/route.js +6 -0
- package/app/apps/web/.next/server/app/api/runs/[runId]/stream/route.js.map +5 -0
- package/app/apps/web/.next/server/app/api/{insights/pdf/[key] → runs/[runId]/stream}/route.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/api/runs/[runId]/stream/route_client-reference-manifest.js +3 -0
- package/app/apps/web/.next/server/app/api/runs/route/app-paths-manifest.json +3 -0
- package/app/apps/web/.next/server/app/api/runs/route/build-manifest.json +9 -0
- package/app/apps/web/.next/server/app/api/runs/route/server-reference-manifest.json +4 -0
- package/app/apps/web/.next/server/app/api/runs/route.js +6 -0
- package/app/apps/web/.next/server/app/api/runs/route.js.map +5 -0
- package/app/apps/web/.next/server/app/api/{insights → runs}/route.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/api/runs/route_client-reference-manifest.js +3 -0
- package/app/apps/web/.next/server/app/api/settings/route/app-paths-manifest.json +3 -0
- package/app/apps/web/.next/server/app/api/settings/route/build-manifest.json +9 -0
- package/app/apps/web/.next/server/app/api/settings/route/server-reference-manifest.json +4 -0
- package/app/apps/web/.next/server/app/api/settings/route.js +10 -0
- package/app/apps/web/.next/server/app/api/settings/route.js.map +5 -0
- package/app/apps/web/.next/server/app/api/settings/route.js.nft.json +1 -0
- package/app/apps/web/.next/server/app/api/{insights → settings}/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/day/[date]/page/app-paths-manifest.json +3 -0
- package/app/apps/web/.next/server/app/{insights/print/[key] → day/[date]}/page/build-manifest.json +4 -4
- package/app/apps/web/.next/server/app/day/[date]/page/server-reference-manifest.json +4 -0
- package/app/apps/web/.next/server/app/day/[date]/page.js +18 -0
- package/app/apps/web/.next/server/app/day/[date]/page.js.map +5 -0
- package/app/apps/web/.next/server/app/day/[date]/page.js.nft.json +1 -0
- package/app/apps/web/.next/server/app/day/[date]/page_client-reference-manifest.js +3 -0
- package/app/apps/web/.next/server/app/day/page/app-paths-manifest.json +3 -0
- package/app/apps/web/.next/server/app/day/page/build-manifest.json +17 -0
- package/app/apps/web/.next/server/app/day/page/next-font-manifest.json +6 -0
- package/app/apps/web/.next/server/app/day/page/react-loadable-manifest.json +1 -0
- package/app/apps/web/.next/server/app/day/page/server-reference-manifest.json +4 -0
- package/app/apps/web/.next/server/app/{insights/print/[key] → day}/page.js +11 -10
- package/app/apps/web/.next/server/app/day/page.js.map +5 -0
- package/app/apps/web/.next/server/app/day/page.js.nft.json +1 -0
- package/app/apps/web/.next/server/app/day/page_client-reference-manifest.js +3 -0
- package/app/apps/web/.next/server/app/digest/[date]/page/app-paths-manifest.json +3 -0
- package/app/apps/web/.next/server/app/digest/[date]/page/build-manifest.json +17 -0
- package/app/apps/web/.next/server/app/digest/[date]/page/next-font-manifest.json +6 -0
- package/app/apps/web/.next/server/app/digest/[date]/page/react-loadable-manifest.json +1 -0
- package/app/apps/web/.next/server/app/digest/[date]/page/server-reference-manifest.json +4 -0
- package/app/apps/web/.next/server/app/digest/[date]/page.js +17 -0
- package/app/apps/web/.next/server/app/digest/[date]/page.js.map +5 -0
- package/app/apps/web/.next/server/app/digest/[date]/page.js.nft.json +1 -0
- package/app/apps/web/.next/server/app/digest/[date]/page_client-reference-manifest.js +3 -0
- package/app/apps/web/.next/server/app/digest/page/app-paths-manifest.json +3 -0
- package/app/apps/web/.next/server/app/digest/page/build-manifest.json +17 -0
- package/app/apps/web/.next/server/app/digest/page/next-font-manifest.json +6 -0
- package/app/apps/web/.next/server/app/digest/page/react-loadable-manifest.json +1 -0
- package/app/apps/web/.next/server/app/digest/page/server-reference-manifest.json +4 -0
- package/app/apps/web/.next/server/app/digest/page.js +17 -0
- package/app/apps/web/.next/server/app/digest/page.js.map +5 -0
- package/app/apps/web/.next/server/app/digest/page.js.nft.json +1 -0
- package/app/apps/web/.next/server/app/digest/page_client-reference-manifest.js +3 -0
- package/app/apps/web/.next/server/app/insights/[key]/page/build-manifest.json +4 -4
- package/app/apps/web/.next/server/app/insights/[key]/page.js +7 -5
- package/app/apps/web/.next/server/app/insights/[key]/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/insights/[key]/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/insights/page/build-manifest.json +4 -4
- package/app/apps/web/.next/server/app/insights/page.js +7 -5
- package/app/apps/web/.next/server/app/insights/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/insights/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/page/build-manifest.json +4 -4
- package/app/apps/web/.next/server/app/page.js +7 -6
- package/app/apps/web/.next/server/app/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/parallelism/page/build-manifest.json +4 -4
- package/app/apps/web/.next/server/app/parallelism/page.js +6 -5
- package/app/apps/web/.next/server/app/parallelism/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/parallelism/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/projects/[slug]/page/build-manifest.json +4 -4
- package/app/apps/web/.next/server/app/projects/[slug]/page.js +6 -5
- package/app/apps/web/.next/server/app/projects/[slug]/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/projects/[slug]/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/projects/page/build-manifest.json +4 -4
- package/app/apps/web/.next/server/app/projects/page.js +5 -4
- package/app/apps/web/.next/server/app/projects/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/projects/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/runs/page/app-paths-manifest.json +3 -0
- package/app/apps/web/.next/server/app/runs/page/build-manifest.json +17 -0
- package/app/apps/web/.next/server/app/runs/page/next-font-manifest.json +6 -0
- package/app/apps/web/.next/server/app/runs/page/react-loadable-manifest.json +1 -0
- package/app/apps/web/.next/server/app/runs/page/server-reference-manifest.json +4 -0
- package/app/apps/web/.next/server/app/runs/page.js +17 -0
- package/app/apps/web/.next/server/app/runs/page.js.map +5 -0
- package/app/apps/web/.next/server/app/runs/page.js.nft.json +1 -0
- package/app/apps/web/.next/server/app/runs/page_client-reference-manifest.js +3 -0
- package/app/apps/web/.next/server/app/sessions/[id]/page/build-manifest.json +4 -4
- package/app/apps/web/.next/server/app/sessions/[id]/page.js +5 -4
- package/app/apps/web/.next/server/app/sessions/[id]/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/sessions/[id]/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/sessions/page/build-manifest.json +4 -4
- package/app/apps/web/.next/server/app/sessions/page.js +5 -4
- package/app/apps/web/.next/server/app/sessions/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/settings/page/app-paths-manifest.json +3 -0
- package/app/apps/web/.next/server/app/settings/page/build-manifest.json +17 -0
- package/app/apps/web/.next/server/app/settings/page/next-font-manifest.json +6 -0
- package/app/apps/web/.next/server/app/settings/page/react-loadable-manifest.json +1 -0
- package/app/apps/web/.next/server/app/settings/page/server-reference-manifest.json +4 -0
- package/app/apps/web/.next/server/app/settings/page.js +18 -0
- package/app/apps/web/.next/server/app/settings/page.js.map +5 -0
- package/app/apps/web/.next/server/app/settings/page.js.nft.json +1 -0
- package/app/apps/web/.next/server/app/settings/page_client-reference-manifest.js +3 -0
- package/app/apps/web/.next/server/app/usage/page/build-manifest.json +4 -4
- package/app/apps/web/.next/server/app/usage/page.js +6 -5
- package/app/apps/web/.next/server/app/usage/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/usage/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app-paths-manifest.json +16 -7
- package/app/apps/web/.next/server/chunks/02dz_web__next-internal_server_app_api_digest_week_[startDate]_route_actions_0klqqsh.js +3 -0
- package/app/apps/web/.next/server/chunks/09og__next-internal_server_app_api_digest_month_[yearMonth]_route_actions_0i4ielu.js +3 -0
- package/app/apps/web/.next/server/chunks/[externals]__0o43ejh._.js +3 -0
- package/app/apps/web/.next/server/chunks/[root-of-the-server]__0-vgrh1._.js +3 -0
- package/app/apps/web/.next/server/chunks/[root-of-the-server]__00n3f9y._.js +3 -0
- package/app/apps/web/.next/server/chunks/[root-of-the-server]__02zukjw._.js +3 -0
- package/app/apps/web/.next/server/chunks/[root-of-the-server]__067~im1._.js +6 -0
- package/app/apps/web/.next/server/chunks/[root-of-the-server]__06b4cj-._.js +3 -0
- package/app/apps/web/.next/server/chunks/[root-of-the-server]__0_8zh-i._.js +9 -0
- package/app/apps/web/.next/server/chunks/[root-of-the-server]__0e8n_x4._.js +3 -0
- package/app/apps/web/.next/server/chunks/[root-of-the-server]__0ej_p3s._.js +9 -0
- package/app/apps/web/.next/server/chunks/[root-of-the-server]__0jprdks._.js +9 -0
- package/app/apps/web/.next/server/chunks/apps_web__next-internal_server_app_api_digest_day_[date]_route_actions_09sxie5.js +3 -0
- package/app/apps/web/.next/server/chunks/apps_web__next-internal_server_app_api_digest_month-index_route_actions_0wldpbu.js +3 -0
- package/app/apps/web/.next/server/chunks/apps_web__next-internal_server_app_api_digest_week-index_route_actions_12c2wj2.js +3 -0
- package/app/apps/web/.next/server/chunks/apps_web__next-internal_server_app_api_jobs_route_actions_08kx~8-.js +3 -0
- package/app/apps/web/.next/server/chunks/apps_web__next-internal_server_app_api_runs_[runId]_route_actions_0dfcghc.js +3 -0
- package/app/apps/web/.next/server/chunks/apps_web__next-internal_server_app_api_runs_[runId]_stream_route_actions_0.8e8-k.js +3 -0
- package/app/apps/web/.next/server/chunks/apps_web__next-internal_server_app_api_runs_route_actions_0xyx82f.js +3 -0
- package/app/apps/web/.next/server/chunks/apps_web__next-internal_server_app_api_settings_route_actions_0.xv7sx.js +3 -0
- package/app/apps/web/.next/server/chunks/node_modules_next_036my~r._.js +49 -0
- package/app/apps/web/.next/server/chunks/packages_0e7q9u_._.js +3 -0
- package/app/apps/web/.next/server/chunks/packages_0n6p2ot._.js +3 -0
- package/app/apps/web/.next/server/chunks/packages_entries_dist_node_0bckr7-.js +379 -0
- package/app/apps/web/.next/server/chunks/packages_parser_dist_fs_0bc7ptm.js +1 -1
- package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0-1_njm._.js +3 -0
- package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0-94ji~._.js +3 -0
- package/app/apps/web/.next/server/chunks/ssr/{[root-of-the-server]__13xpdx0._.js → [root-of-the-server]__03uoeiw._.js} +2 -2
- package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0_6.inc._.js +1 -1
- package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0d~2~le._.js +8 -0
- package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0gio_ck._.js +1 -1
- package/app/apps/web/.next/server/chunks/ssr/{[root-of-the-server]__08.d5ia._.js → [root-of-the-server]__0jdyefm._.js} +10 -10
- package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0ln9jsw._.js +3 -0
- package/app/apps/web/.next/server/chunks/ssr/{[root-of-the-server]__0z45d0g._.js → [root-of-the-server]__0lz4a~g._.js} +2 -48
- package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0o1_g.~._.js +3 -0
- package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0r4tks8._.js +3 -0
- package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0rvzdnx._.js +3 -0
- package/app/apps/web/.next/server/chunks/ssr/{[root-of-the-server]__0euu8sa._.js → [root-of-the-server]__0u39afl._.js} +2 -2
- package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0u5d7de._.js +12 -0
- package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0w52fbc._.js +3 -3
- package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0wwa6gh._.js +3 -0
- package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0xy1qim._.js +3 -0
- package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0~_8vff._.js +3 -0
- package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__10srpu0._.js +3 -0
- package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__11v.eqw._.js +1 -1
- package/app/apps/web/.next/server/chunks/ssr/_02s1n-x._.js +8 -0
- package/app/apps/web/.next/server/chunks/ssr/_0fjbf--._.js +3 -0
- package/app/apps/web/.next/server/chunks/ssr/_0jw2sm7._.js +3 -0
- package/app/apps/web/.next/server/chunks/ssr/_0wj750k._.js +3 -0
- package/app/apps/web/.next/server/chunks/ssr/_0woap-3._.js +1 -1
- package/app/apps/web/.next/server/chunks/ssr/{_0xies90._.js → _0xu2pvc._.js} +2 -2
- package/app/apps/web/.next/server/chunks/ssr/apps_web__next-internal_server_app_day_[date]_page_actions_0u2kxb..js +3 -0
- package/app/apps/web/.next/server/chunks/ssr/apps_web__next-internal_server_app_day_page_actions_1042maj.js +3 -0
- package/app/apps/web/.next/server/chunks/ssr/apps_web__next-internal_server_app_digest_[date]_page_actions_0olu967.js +3 -0
- package/app/apps/web/.next/server/chunks/ssr/apps_web__next-internal_server_app_digest_page_actions_0bl.eil.js +3 -0
- package/app/apps/web/.next/server/chunks/ssr/apps_web__next-internal_server_app_runs_page_actions_0485qy7.js +3 -0
- package/app/apps/web/.next/server/chunks/ssr/apps_web__next-internal_server_app_settings_page_actions_0f6epye.js +3 -0
- package/app/apps/web/.next/server/chunks/ssr/apps_web_app_day_[date]_day-view_tsx_0wjoe1u._.js +3 -0
- package/app/apps/web/.next/server/chunks/ssr/apps_web_app_settings_ai-features-form_tsx_01p699p._.js +3 -0
- package/app/apps/web/.next/server/chunks/ssr/apps_web_components_0b-4-4j._.js +1 -1
- package/app/apps/web/.next/server/chunks/ssr/apps_web_components_0ly1xes._.js +6 -0
- package/app/apps/web/.next/server/chunks/ssr/apps_web_components_0txtsv5._.js +16 -0
- package/app/apps/web/.next/server/chunks/ssr/apps_web_components_0xs658s._.js +10 -0
- package/app/apps/web/.next/server/chunks/ssr/apps_web_components_runs-live-board_tsx_0r6dkdq._.js +3 -0
- package/app/apps/web/.next/server/chunks/ssr/apps_web_components_usage-charts-dashboard_tsx_0bgr_uv._.js +1 -1
- package/app/apps/web/.next/server/chunks/ssr/apps_web_lib_usage-data_ts_0xtv99n._.js +3 -0
- package/app/apps/web/.next/server/chunks/ssr/node_modules_0i2xw~e._.js +3 -0
- package/app/apps/web/.next/server/chunks/ssr/node_modules_next_dist_0e1izl_._.js +1 -1
- package/app/apps/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0d3d4wn.js +4 -0
- package/app/apps/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0edz1ko.js +4 -0
- package/app/apps/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0eq.n-n.js +4 -0
- package/app/apps/web/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_0vz7_px.js → node_modules_next_dist_esm_build_templates_app-page_0hcvt-s.js} +3 -3
- package/app/apps/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0nd5zu0.js +4 -0
- package/app/apps/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_11j1qy0.js +4 -0
- package/app/apps/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_12n1lw_.js +1 -1
- package/app/apps/web/.next/server/chunks/ssr/packages_entries_dist_node_0_271yr.js +3 -0
- package/app/apps/web/.next/server/chunks/ssr/packages_parser_dist_0-jvt~a._.js +1 -1
- package/app/apps/web/.next/server/functions-config-manifest.json +11 -6
- package/app/apps/web/.next/server/middleware-build-manifest.js +7 -7
- package/app/apps/web/.next/server/pages/500.html +1 -1
- package/app/apps/web/.next/server/server-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/server-reference-manifest.json +1 -1
- package/app/apps/web/.next/static/chunks/0-yc2_pjxwwuq.js +1 -0
- package/app/apps/web/.next/static/chunks/0257pdz1-imal.js +2 -0
- package/app/apps/web/.next/static/chunks/05m.oz3kmf1p7.js +1 -0
- package/app/apps/web/.next/static/chunks/{0pqt~8bl3ukh4.js → 073081qv4uyn8.js} +1 -1
- package/app/apps/web/.next/static/chunks/{0018dy-m-kusj.js → 07lbm-sdh9c2j.js} +1 -1
- package/app/apps/web/.next/static/chunks/0858bgw2i4vob.js +1 -0
- package/app/apps/web/.next/static/chunks/0_7303jr0sf0w.js +10 -0
- package/app/apps/web/.next/static/chunks/0byz8fqw.exef.js +1 -0
- package/app/apps/web/.next/static/chunks/0coa1800xqgfj.js +1 -0
- package/app/apps/web/.next/static/chunks/0fs3gxea5h0s3.css +1 -0
- package/app/apps/web/.next/static/chunks/0k1psab.bybh9.js +14 -0
- package/app/apps/web/.next/static/chunks/0k9pksi_i.odf.js +1 -0
- package/app/apps/web/.next/static/chunks/0m62vx92~0_0d.js +1 -0
- package/app/apps/web/.next/static/chunks/0mc8aa8z.0-5l.js +8 -0
- package/app/apps/web/.next/static/chunks/0mykrrv810ra-.js +31 -0
- package/app/apps/web/.next/static/chunks/0o9ayt8sknubd.js +1 -0
- package/app/apps/web/.next/static/chunks/0osdgl2.9cl1q.js +6 -0
- package/app/apps/web/.next/static/chunks/0xfu09fn_358k.js +4 -0
- package/app/apps/web/.next/static/chunks/171za22fv684..js +6 -0
- package/app/apps/web/.next/static/chunks/17u2ww8ya5dv1.js +6 -0
- package/app/apps/web/.next/static/chunks/{turbopack-169w-1._23ra_.js → turbopack-0_p36yduv.waj.js} +1 -1
- package/app/apps/web/app/api/digest/day/[date]/route.ts +152 -0
- package/app/apps/web/app/api/digest/month/[yearMonth]/route.ts +147 -0
- package/app/apps/web/app/api/digest/month-index/route.ts +103 -0
- package/app/apps/web/app/api/digest/week/[startDate]/route.ts +149 -0
- package/app/apps/web/app/api/{insights/weeks-index → digest/week-index}/route.ts +45 -33
- package/app/apps/web/app/api/jobs/route.ts +8 -0
- package/app/apps/web/app/api/runs/[runId]/route.ts +64 -0
- package/app/apps/web/app/api/runs/[runId]/stream/route.ts +154 -0
- package/app/apps/web/app/api/runs/route.ts +266 -0
- package/app/apps/web/app/api/settings/route.ts +35 -0
- package/app/apps/web/app/day/[date]/day-view.tsx +193 -0
- package/app/apps/web/app/day/[date]/page.tsx +175 -0
- package/app/apps/web/app/day/page.tsx +8 -0
- package/app/apps/web/app/digest/[date]/page.tsx +15 -0
- package/app/apps/web/app/digest/page.tsx +7 -0
- package/app/apps/web/app/insights/[key]/page.tsx +106 -48
- package/app/apps/web/app/insights/page.tsx +133 -3
- package/app/apps/web/app/layout.tsx +23 -3
- package/app/apps/web/app/page.tsx +33 -4
- package/app/apps/web/app/parallelism/gantt-chart.tsx +67 -1
- package/app/apps/web/app/parallelism/page.tsx +8 -278
- package/app/apps/web/app/projects/[slug]/page.tsx +153 -0
- package/app/apps/web/app/projects/page.tsx +49 -4
- package/app/apps/web/app/projects/projects-view.tsx +79 -68
- package/app/apps/web/app/runs/page.tsx +21 -0
- package/app/apps/web/app/sessions/[id]/page.tsx +12 -1
- package/app/apps/web/app/sessions/[id]/session-view.tsx +569 -21
- package/app/apps/web/app/sessions/page.tsx +19 -3
- package/app/apps/web/app/sessions/sessions-grid.tsx +172 -131
- package/app/apps/web/app/settings/ai-features-form.tsx +45 -0
- package/app/apps/web/app/settings/page.tsx +20 -0
- package/app/apps/web/app/usage/page.tsx +45 -3
- package/app/apps/web/components/auto-generate-yesterday.tsx +96 -0
- package/app/apps/web/components/backfill-drawer.tsx +309 -0
- package/app/apps/web/components/dashboard-view.tsx +4 -2
- package/app/apps/web/components/date-nav.tsx +385 -0
- package/app/apps/web/components/day-digest-view.tsx +180 -0
- package/app/apps/web/components/day-digest.tsx +489 -0
- package/app/apps/web/components/flag-chip.tsx +54 -0
- package/app/apps/web/components/goal-bar.tsx +63 -0
- package/app/apps/web/components/heatmap.tsx +78 -1
- package/app/apps/web/components/helpfulness-sparkline.tsx +82 -0
- package/app/apps/web/components/insights-history.tsx +211 -0
- package/app/apps/web/components/insights-top-bar.tsx +216 -0
- package/app/apps/web/components/job-queue-widget.tsx +274 -0
- package/app/apps/web/components/live-sessions-widget.tsx +38 -3
- package/app/apps/web/components/month-digest-view.tsx +138 -0
- package/app/apps/web/components/month-digest.tsx +216 -0
- package/app/apps/web/components/outcome-mix-row.tsx +37 -0
- package/app/apps/web/components/outcome-pill.tsx +101 -0
- package/app/apps/web/components/previous-cycles-trend.tsx +155 -0
- package/app/apps/web/components/recent-days-panel.tsx +83 -0
- package/app/apps/web/components/runs-live-board.tsx +513 -0
- package/app/apps/web/components/sidebar.tsx +38 -4
- package/app/apps/web/components/usage-chart-range.tsx +58 -6
- package/app/apps/web/components/usage-chart.tsx +94 -7
- package/app/apps/web/components/usage-charts-dashboard.tsx +20 -1
- package/app/apps/web/components/week-digest-view.tsx +226 -0
- package/app/apps/web/components/week-digest.tsx +2128 -0
- package/app/apps/web/components/yesterday-hero.tsx +110 -0
- package/app/apps/web/lib/auto-week-fire.ts +37 -0
- package/app/apps/web/lib/calibration-data.ts +171 -0
- package/app/apps/web/lib/entries-index.ts +174 -0
- package/app/apps/web/lib/entries.ts +72 -0
- package/app/apps/web/lib/inflight-coalesce.test.ts +43 -0
- package/app/apps/web/lib/inflight-coalesce.ts +19 -0
- package/app/apps/web/lib/jobs.ts +170 -0
- package/app/apps/web/lib/usage-data.ts +37 -0
- package/app/apps/web/lib/validate-settings.test.ts +25 -0
- package/app/apps/web/lib/validate-settings.ts +9 -0
- package/app/apps/web/next.config.ts +1 -1
- package/app/apps/web/package.json +4 -2
- package/app/apps/web/server.js +1 -1
- package/app/apps/web/tsconfig.tsbuildinfo +1 -1
- package/app/apps/web/vitest.config.ts +9 -0
- package/dist/daemon-worker.js +1758 -713
- package/dist/index.js +11308 -1888
- package/package.json +4 -1
- package/app/apps/web/.next/server/app/api/insights/months-index/route/app-paths-manifest.json +0 -3
- package/app/apps/web/.next/server/app/api/insights/months-index/route.js +0 -7
- package/app/apps/web/.next/server/app/api/insights/months-index/route_client-reference-manifest.js +0 -3
- package/app/apps/web/.next/server/app/api/insights/pdf/[key]/route/app-paths-manifest.json +0 -3
- package/app/apps/web/.next/server/app/api/insights/pdf/[key]/route.js +0 -6
- package/app/apps/web/.next/server/app/api/insights/route/app-paths-manifest.json +0 -3
- package/app/apps/web/.next/server/app/api/insights/route.js +0 -8
- package/app/apps/web/.next/server/app/api/insights/saved/[key]/route/app-paths-manifest.json +0 -3
- package/app/apps/web/.next/server/app/api/insights/saved/[key]/route.js +0 -6
- package/app/apps/web/.next/server/app/api/insights/saved/[key]/route_client-reference-manifest.js +0 -3
- package/app/apps/web/.next/server/app/api/insights/saved/route/app-paths-manifest.json +0 -3
- package/app/apps/web/.next/server/app/api/insights/saved/route.js +0 -6
- package/app/apps/web/.next/server/app/api/insights/saved/route_client-reference-manifest.js +0 -3
- package/app/apps/web/.next/server/app/api/insights/weeks-index/route/app-paths-manifest.json +0 -3
- package/app/apps/web/.next/server/app/api/insights/weeks-index/route.js +0 -7
- package/app/apps/web/.next/server/app/api/insights/weeks-index/route_client-reference-manifest.js +0 -3
- package/app/apps/web/.next/server/app/insights/print/[key]/page/app-paths-manifest.json +0 -3
- package/app/apps/web/.next/server/app/insights/print/[key]/page.js.nft.json +0 -1
- package/app/apps/web/.next/server/app/insights/print/[key]/page_client-reference-manifest.js +0 -3
- package/app/apps/web/.next/server/chunks/02dz_web__next-internal_server_app_api_insights_months-index_route_actions_0~h~zci.js +0 -3
- package/app/apps/web/.next/server/chunks/02dz_web__next-internal_server_app_api_insights_saved_[key]_route_actions_0a5j9yw.js +0 -3
- package/app/apps/web/.next/server/chunks/02dz_web__next-internal_server_app_api_insights_weeks-index_route_actions_0hh-1c7.js +0 -3
- package/app/apps/web/.next/server/chunks/[root-of-the-server]__0.hmj0z._.js +0 -3
- package/app/apps/web/.next/server/chunks/[root-of-the-server]__01h_g-p._.js +0 -3
- package/app/apps/web/.next/server/chunks/[root-of-the-server]__0nh-z10._.js +0 -3
- package/app/apps/web/.next/server/chunks/[root-of-the-server]__0ri7q~r._.js +0 -3
- package/app/apps/web/.next/server/chunks/[root-of-the-server]__0rr1~~x._.js +0 -3
- package/app/apps/web/.next/server/chunks/[root-of-the-server]__0s0gv.0._.js +0 -3
- package/app/apps/web/.next/server/chunks/apps_web__next-internal_server_app_api_insights_pdf_[key]_route_actions_0lu-lnx.js +0 -3
- package/app/apps/web/.next/server/chunks/apps_web__next-internal_server_app_api_insights_route_actions_0h8l5lz.js +0 -3
- package/app/apps/web/.next/server/chunks/apps_web__next-internal_server_app_api_insights_saved_route_actions_13rlblw.js +0 -3
- package/app/apps/web/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_00t2xj6.js +0 -68
- package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0.tsxpj._.js +0 -3
- package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__00z7zlm._.js +0 -3
- package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__08pen0k._.js +0 -3
- package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0b323~k._.js +0 -8
- package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0gx-4qa._.js +0 -3
- package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0wv27wt._.js +0 -3
- package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__13itnvx._.js +0 -3
- package/app/apps/web/.next/server/chunks/ssr/_09n75_5._.js +0 -8
- package/app/apps/web/.next/server/chunks/ssr/_0r~__0v._.js +0 -12
- package/app/apps/web/.next/server/chunks/ssr/apps_web__next-internal_server_app_insights_print_[key]_page_actions_0a853fw.js +0 -3
- package/app/apps/web/.next/server/chunks/ssr/apps_web_app_parallelism_08vub.0._.js +0 -3
- package/app/apps/web/.next/server/chunks/ssr/apps_web_components_06j3c.0._.js +0 -8
- package/app/apps/web/.next/server/chunks/ssr/apps_web_components_0bbo_pd._.js +0 -8
- package/app/apps/web/.next/server/chunks/ssr/apps_web_components_insight-report_tsx_13q2a-c._.js +0 -12
- package/app/apps/web/.next/server/chunks/ssr/apps_web_components_insights-view_tsx_11730ta._.js +0 -6
- package/app/apps/web/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_0nqz8dw._.js +0 -3
- package/app/apps/web/.next/server/chunks/ssr/node_modules_next_dist_0t-hj0x._.js +0 -3
- package/app/apps/web/.next/server/chunks/ssr/packages_parser_dist_analytics_0k4dgst.js +0 -3
- package/app/apps/web/.next/static/chunks/028_pmk40b69_.js +0 -6
- package/app/apps/web/.next/static/chunks/03.mv4y4.w-vb.js +0 -6
- package/app/apps/web/.next/static/chunks/03_7xtpi9sv4g.js +0 -4
- package/app/apps/web/.next/static/chunks/03g5dw5eskotd.js +0 -6
- package/app/apps/web/.next/static/chunks/063oimt30jeo9.js +0 -10
- package/app/apps/web/.next/static/chunks/08c1pcrocqq5s.js +0 -6
- package/app/apps/web/.next/static/chunks/0e-wrhqh4h3r5.js +0 -2
- package/app/apps/web/.next/static/chunks/0fc6dk2qtokwh.js +0 -1
- package/app/apps/web/.next/static/chunks/0i7er7_bfab36.js +0 -10
- package/app/apps/web/.next/static/chunks/0ipytyi01h0ta.js +0 -1
- package/app/apps/web/.next/static/chunks/0lsznd4_avzhv.js +0 -6
- package/app/apps/web/.next/static/chunks/0lty3v_i9mde7.js +0 -1
- package/app/apps/web/.next/static/chunks/0vekjjj4pidlz.css +0 -1
- package/app/apps/web/.next/static/chunks/137uw2-qbro07.js +0 -31
- package/app/apps/web/app/api/insights/months-index/route.ts +0 -80
- package/app/apps/web/app/api/insights/pdf/[key]/route.ts +0 -45
- package/app/apps/web/app/api/insights/route.ts +0 -508
- package/app/apps/web/app/api/insights/saved/[key]/route.ts +0 -11
- package/app/apps/web/app/api/insights/saved/route.ts +0 -9
- package/app/apps/web/app/insights/print/[key]/page.tsx +0 -73
- package/app/apps/web/components/insight-report.tsx +0 -1031
- package/app/apps/web/components/insights-view.tsx +0 -647
- package/app/apps/web/lib/ai/insights-prompt.ts +0 -71
- package/app/apps/web/lib/ai/saved-reports.ts +0 -83
- /package/app/apps/web/.next/server/app/api/{insights/months-index → digest/day/[date]}/route/build-manifest.json +0 -0
- /package/app/apps/web/.next/server/app/api/{insights/months-index → digest/day/[date]}/route/server-reference-manifest.json +0 -0
- /package/app/apps/web/.next/server/app/api/{insights/months-index → digest/day/[date]}/route.js.map +0 -0
- /package/app/apps/web/.next/server/app/api/{insights → digest/month/[yearMonth]}/route/build-manifest.json +0 -0
- /package/app/apps/web/.next/server/app/api/{insights → digest/month/[yearMonth]}/route/server-reference-manifest.json +0 -0
- /package/app/apps/web/.next/server/app/api/{insights → digest/month/[yearMonth]}/route.js.map +0 -0
- /package/app/apps/web/.next/server/app/api/{insights/pdf/[key] → digest/month-index}/route/build-manifest.json +0 -0
- /package/app/apps/web/.next/server/app/api/{insights/pdf/[key] → digest/month-index}/route/server-reference-manifest.json +0 -0
- /package/app/apps/web/.next/server/app/api/{insights/pdf/[key] → digest/month-index}/route.js.map +0 -0
- /package/app/apps/web/.next/server/app/api/{insights/saved → digest/week/[startDate]}/route/build-manifest.json +0 -0
- /package/app/apps/web/.next/server/app/api/{insights/saved → digest/week/[startDate]}/route/server-reference-manifest.json +0 -0
- /package/app/apps/web/.next/server/app/api/{insights/saved → digest/week/[startDate]}/route.js.map +0 -0
- /package/app/apps/web/.next/server/app/api/{insights/saved/[key] → digest/week-index}/route/build-manifest.json +0 -0
- /package/app/apps/web/.next/server/app/api/{insights/saved/[key] → digest/week-index}/route/server-reference-manifest.json +0 -0
- /package/app/apps/web/.next/server/app/api/{insights/saved/[key] → digest/week-index}/route.js.map +0 -0
- /package/app/apps/web/.next/server/app/api/{insights/weeks-index → jobs}/route/build-manifest.json +0 -0
- /package/app/apps/web/.next/server/app/api/{insights/weeks-index → jobs}/route/server-reference-manifest.json +0 -0
- /package/app/apps/web/.next/server/app/api/{insights/weeks-index → jobs}/route.js.map +0 -0
- /package/app/apps/web/.next/server/app/{insights/print/[key]/page → api/runs/[runId]/route}/server-reference-manifest.json +0 -0
- /package/app/apps/web/.next/server/app/{insights/print/[key]/page.js.map → api/runs/[runId]/route.js.map} +0 -0
- /package/app/apps/web/.next/server/app/{insights/print/[key] → day/[date]}/page/next-font-manifest.json +0 -0
- /package/app/apps/web/.next/server/app/{insights/print/[key] → day/[date]}/page/react-loadable-manifest.json +0 -0
- /package/app/apps/web/.next/static/{G_4ofKI9v9ARC_lb9JILZ → 8tTWPvUhtatZEoocIhamh}/_buildManifest.js +0 -0
- /package/app/apps/web/.next/static/{G_4ofKI9v9ARC_lb9JILZ → 8tTWPvUhtatZEoocIhamh}/_clientMiddlewareManifest.js +0 -0
- /package/app/apps/web/.next/static/{G_4ofKI9v9ARC_lb9JILZ → 8tTWPvUhtatZEoocIhamh}/_ssgManifest.js +0 -0
|
@@ -1,286 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
* Shows one row per session, with colored segments for active periods
|
|
5
|
-
* and gaps for idle time. Time axis is 24 hours. Date picker to
|
|
6
|
-
* navigate between days.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { listSessions, getSession } from "@/lib/data";
|
|
10
|
-
import {
|
|
11
|
-
buildGanttDay,
|
|
12
|
-
computeParallelismBursts,
|
|
13
|
-
computeBurstsFromSessions,
|
|
14
|
-
dailyActivity,
|
|
15
|
-
type GanttDay,
|
|
16
|
-
type ParallelismBurst,
|
|
17
|
-
} from "@claude-lens/parser";
|
|
18
|
-
import { GanttChart } from "./gantt-chart";
|
|
19
|
-
import { DateNav, type DayInfo } from "./date-nav";
|
|
20
|
-
import { toLocalDay } from "@claude-lens/parser";
|
|
1
|
+
import { redirect } from "next/navigation";
|
|
2
|
+
import { todayLocal } from "@/lib/entries";
|
|
21
3
|
|
|
22
4
|
export const dynamic = "force-dynamic";
|
|
23
5
|
|
|
24
|
-
export default async function
|
|
6
|
+
export default async function LegacyTimelineRedirect({
|
|
25
7
|
searchParams,
|
|
26
8
|
}: {
|
|
27
|
-
searchParams: Promise<{ date?: string
|
|
9
|
+
searchParams: Promise<{ date?: string }>;
|
|
28
10
|
}) {
|
|
29
11
|
const { date: dateParam } = await searchParams;
|
|
30
|
-
|
|
31
|
-
//
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
// Load all sessions, then load details for sessions that overlap
|
|
36
|
-
// the target day. We use file mtime as a fast filter — only load
|
|
37
|
-
// details for sessions whose mtime falls on the target day ± 1 day.
|
|
38
|
-
const [y, m, d] = date.split("-").map(Number) as [number, number, number];
|
|
39
|
-
const dayStartMs = new Date(y, m - 1, d).getTime();
|
|
40
|
-
const dayEndMs = new Date(y, m - 1, d + 1).getTime();
|
|
41
|
-
// Widen the window by 1 day on each side to catch sessions that
|
|
42
|
-
// started the day before and carried into the target day.
|
|
43
|
-
const filterStartMs = dayStartMs - 24 * 60 * 60 * 1000;
|
|
44
|
-
const filterEndMs = dayEndMs + 24 * 60 * 60 * 1000;
|
|
45
|
-
|
|
46
|
-
const allSessions = await listSessions();
|
|
47
|
-
const candidates = allSessions.filter((s) => {
|
|
48
|
-
if (!s.firstTimestamp) return false;
|
|
49
|
-
const startMs = Date.parse(s.firstTimestamp);
|
|
50
|
-
if (Number.isNaN(startMs)) return false;
|
|
51
|
-
const endMs = s.lastTimestamp ? Date.parse(s.lastTimestamp) : startMs;
|
|
52
|
-
// Session overlaps the ±1 day window.
|
|
53
|
-
return endMs >= filterStartMs && startMs <= filterEndMs;
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
// Load full details for candidates (to get events for segment computation).
|
|
57
|
-
// Cap at 80 sessions to avoid extremely slow loads.
|
|
58
|
-
const details = (
|
|
59
|
-
await Promise.all(candidates.slice(0, 80).map((s) => getSession(s.id)))
|
|
60
|
-
).filter((d): d is NonNullable<typeof d> => !!d);
|
|
61
|
-
|
|
62
|
-
const gantt: GanttDay = buildGanttDay(details, date);
|
|
63
|
-
const bursts: ParallelismBurst[] = computeParallelismBursts(gantt);
|
|
64
|
-
|
|
65
|
-
// Per-day activity (reuses dailyActivity which gives us both session
|
|
66
|
-
// count and airTimeMs bucketed by day).
|
|
67
|
-
const activityBuckets = dailyActivity(allSessions);
|
|
68
|
-
const activityByDay = new Map(activityBuckets.map((b) => [b.date, b]));
|
|
69
|
-
|
|
70
|
-
// Bursts across all history, bucketed by start day, so the picker can
|
|
71
|
-
// show "this day had parallel work" without us recomputing per day.
|
|
72
|
-
const allBursts = computeBurstsFromSessions(allSessions);
|
|
73
|
-
type DayBurstAgg = { totalMs: number; count: number; peak: number };
|
|
74
|
-
const burstsByDay = new Map<string, DayBurstAgg>();
|
|
75
|
-
for (const b of allBursts) {
|
|
76
|
-
const day = toLocalDay(b.startMs);
|
|
77
|
-
const entry = burstsByDay.get(day) ?? { totalMs: 0, count: 0, peak: 0 };
|
|
78
|
-
entry.totalMs += b.endMs - b.startMs;
|
|
79
|
-
entry.count += 1;
|
|
80
|
-
if (b.peak > entry.peak) entry.peak = b.peak;
|
|
81
|
-
burstsByDay.set(day, entry);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
// Union of days that have any activity OR any parallelism.
|
|
85
|
-
const dayKeys = new Set<string>();
|
|
86
|
-
for (const b of activityBuckets) if (b.sessions > 0) dayKeys.add(b.date);
|
|
87
|
-
for (const d of burstsByDay.keys()) dayKeys.add(d);
|
|
88
|
-
|
|
89
|
-
const dayStats: DayInfo[] = Array.from(dayKeys)
|
|
90
|
-
.map((date) => {
|
|
91
|
-
const activity = activityByDay.get(date);
|
|
92
|
-
const burst = burstsByDay.get(date);
|
|
93
|
-
return {
|
|
94
|
-
date,
|
|
95
|
-
sessions: activity?.sessions ?? 0,
|
|
96
|
-
airTimeMs: activity?.airTimeMs ?? 0,
|
|
97
|
-
parallelMs: burst?.totalMs ?? 0,
|
|
98
|
-
burstCount: burst?.count ?? 0,
|
|
99
|
-
peakConcurrency: burst?.peak ?? 0,
|
|
100
|
-
};
|
|
101
|
-
})
|
|
102
|
-
.sort((a, b) => a.date.localeCompare(b.date));
|
|
103
|
-
const sortedDays = dayStats.map((d) => d.date);
|
|
104
|
-
const currentIdx = sortedDays.indexOf(date);
|
|
105
|
-
const prevDay = currentIdx > 0 ? sortedDays[currentIdx - 1] : undefined;
|
|
106
|
-
const nextDay =
|
|
107
|
-
currentIdx >= 0 && currentIdx < sortedDays.length - 1
|
|
108
|
-
? sortedDays[currentIdx + 1]
|
|
109
|
-
: undefined;
|
|
110
|
-
|
|
111
|
-
// Day-level totals for the header tile row. Active time comes from
|
|
112
|
-
// the per-day split in the Gantt (same as the calendar intensity —
|
|
113
|
-
// consistent numbers everywhere).
|
|
114
|
-
const dayActiveMs = gantt.sessions.reduce(
|
|
115
|
-
(sum, s) => sum + s.activeMs,
|
|
116
|
-
0,
|
|
117
|
-
);
|
|
118
|
-
const peakConcurrent = gantt.peakActiveParallelism;
|
|
119
|
-
const totalParallelMs = bursts.reduce(
|
|
120
|
-
(sum, b) => sum + (b.endMs - b.startMs),
|
|
121
|
-
0,
|
|
122
|
-
);
|
|
123
|
-
const crossProjectBursts = bursts.filter((b) => b.crossProject).length;
|
|
124
|
-
|
|
125
|
-
return (
|
|
126
|
-
<div style={{ padding: "32px 40px", maxWidth: 1400 }}>
|
|
127
|
-
<header
|
|
128
|
-
style={{
|
|
129
|
-
display: "flex",
|
|
130
|
-
alignItems: "flex-start",
|
|
131
|
-
justifyContent: "space-between",
|
|
132
|
-
marginBottom: 20,
|
|
133
|
-
flexWrap: "wrap",
|
|
134
|
-
gap: 14,
|
|
135
|
-
}}
|
|
136
|
-
>
|
|
137
|
-
<div>
|
|
138
|
-
<h1 style={{ fontSize: 26, fontWeight: 700, letterSpacing: "-0.02em", margin: 0 }}>
|
|
139
|
-
Timeline
|
|
140
|
-
</h1>
|
|
141
|
-
<p style={{ fontSize: 13, color: "var(--af-text-secondary)", marginTop: 4 }}>
|
|
142
|
-
{date === today ? "Today" : "Activity on"}{" "}
|
|
143
|
-
<strong>{date}</strong>
|
|
144
|
-
</p>
|
|
145
|
-
</div>
|
|
146
|
-
|
|
147
|
-
<DateNav date={date} today={today} prevDay={prevDay} nextDay={nextDay} dayStats={dayStats} />
|
|
148
|
-
</header>
|
|
149
|
-
|
|
150
|
-
{gantt.sessions.length === 0 ? (
|
|
151
|
-
<div className="af-empty">
|
|
152
|
-
No active sessions on {date}. Try a different date.
|
|
153
|
-
</div>
|
|
154
|
-
) : (
|
|
155
|
-
<>
|
|
156
|
-
<DayMetricRow
|
|
157
|
-
sessionCount={gantt.sessions.length}
|
|
158
|
-
activeMs={dayActiveMs}
|
|
159
|
-
peakConcurrent={peakConcurrent}
|
|
160
|
-
parallelMs={totalParallelMs}
|
|
161
|
-
burstCount={bursts.length}
|
|
162
|
-
crossProjectBursts={crossProjectBursts}
|
|
163
|
-
/>
|
|
164
|
-
<GanttChart gantt={gantt} bursts={bursts} />
|
|
165
|
-
</>
|
|
166
|
-
)}
|
|
167
|
-
</div>
|
|
168
|
-
);
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
function DayMetricRow({
|
|
172
|
-
sessionCount,
|
|
173
|
-
activeMs,
|
|
174
|
-
peakConcurrent,
|
|
175
|
-
parallelMs,
|
|
176
|
-
burstCount,
|
|
177
|
-
crossProjectBursts,
|
|
178
|
-
}: {
|
|
179
|
-
sessionCount: number;
|
|
180
|
-
activeMs: number;
|
|
181
|
-
peakConcurrent: number;
|
|
182
|
-
parallelMs: number;
|
|
183
|
-
burstCount: number;
|
|
184
|
-
crossProjectBursts: number;
|
|
185
|
-
}) {
|
|
186
|
-
const fmtDur = (ms: number) => {
|
|
187
|
-
if (ms <= 0) return "—";
|
|
188
|
-
const totalMin = Math.round(ms / 60_000);
|
|
189
|
-
if (totalMin < 60) return `${totalMin}m`;
|
|
190
|
-
const h = Math.floor(totalMin / 60);
|
|
191
|
-
const m = totalMin % 60;
|
|
192
|
-
return m ? `${h}h ${m}m` : `${h}h`;
|
|
193
|
-
};
|
|
194
|
-
|
|
195
|
-
const tiles: Array<{
|
|
196
|
-
label: string;
|
|
197
|
-
value: string;
|
|
198
|
-
sub?: string;
|
|
199
|
-
color?: string;
|
|
200
|
-
}> = [
|
|
201
|
-
{
|
|
202
|
-
label: "Sessions active",
|
|
203
|
-
value: String(sessionCount),
|
|
204
|
-
sub: "at least one segment today",
|
|
205
|
-
},
|
|
206
|
-
{
|
|
207
|
-
label: "Agent time",
|
|
208
|
-
value: fmtDur(activeMs),
|
|
209
|
-
sub: "actively working",
|
|
210
|
-
},
|
|
211
|
-
];
|
|
212
|
-
|
|
213
|
-
if (burstCount > 0) {
|
|
214
|
-
tiles.push({
|
|
215
|
-
label: "Peak concurrency",
|
|
216
|
-
value: `×${peakConcurrent}`,
|
|
217
|
-
sub: "max agents at once",
|
|
218
|
-
color: "rgba(167, 139, 250, 1)",
|
|
219
|
-
});
|
|
220
|
-
tiles.push({
|
|
221
|
-
label: "Parallel time",
|
|
222
|
-
value: fmtDur(parallelMs),
|
|
223
|
-
sub: `${burstCount} burst${burstCount === 1 ? "" : "s"}${crossProjectBursts > 0 ? ` · ${crossProjectBursts} cross-project` : ""}`,
|
|
224
|
-
});
|
|
225
|
-
} else {
|
|
226
|
-
tiles.push({
|
|
227
|
-
label: "Peak concurrency",
|
|
228
|
-
value: peakConcurrent > 1 ? `×${peakConcurrent}` : "—",
|
|
229
|
-
sub: "no sustained bursts",
|
|
230
|
-
});
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
return (
|
|
234
|
-
<section
|
|
235
|
-
style={{
|
|
236
|
-
display: "grid",
|
|
237
|
-
gridTemplateColumns: `repeat(${tiles.length}, 1fr)`,
|
|
238
|
-
gap: 12,
|
|
239
|
-
marginBottom: 16,
|
|
240
|
-
}}
|
|
241
|
-
>
|
|
242
|
-
{tiles.map((t) => (
|
|
243
|
-
<div
|
|
244
|
-
key={t.label}
|
|
245
|
-
className="af-panel"
|
|
246
|
-
style={{ padding: "14px 18px" }}
|
|
247
|
-
>
|
|
248
|
-
<div
|
|
249
|
-
style={{
|
|
250
|
-
fontSize: 9,
|
|
251
|
-
fontWeight: 600,
|
|
252
|
-
letterSpacing: "0.05em",
|
|
253
|
-
textTransform: "uppercase",
|
|
254
|
-
color: "var(--af-text-tertiary)",
|
|
255
|
-
marginBottom: 4,
|
|
256
|
-
}}
|
|
257
|
-
>
|
|
258
|
-
{t.label}
|
|
259
|
-
</div>
|
|
260
|
-
<div
|
|
261
|
-
style={{
|
|
262
|
-
fontSize: 22,
|
|
263
|
-
fontWeight: 700,
|
|
264
|
-
letterSpacing: "-0.01em",
|
|
265
|
-
fontVariantNumeric: "tabular-nums",
|
|
266
|
-
color: t.color ?? "var(--af-text)",
|
|
267
|
-
}}
|
|
268
|
-
>
|
|
269
|
-
{t.value}
|
|
270
|
-
</div>
|
|
271
|
-
{t.sub && (
|
|
272
|
-
<div
|
|
273
|
-
style={{
|
|
274
|
-
fontSize: 10,
|
|
275
|
-
color: "var(--af-text-tertiary)",
|
|
276
|
-
marginTop: 3,
|
|
277
|
-
}}
|
|
278
|
-
>
|
|
279
|
-
{t.sub}
|
|
280
|
-
</div>
|
|
281
|
-
)}
|
|
282
|
-
</div>
|
|
283
|
-
))}
|
|
284
|
-
</section>
|
|
285
|
-
);
|
|
12
|
+
const date = dateParam && /^\d{4}-\d{2}-\d{2}$/.test(dateParam) ? dateParam : todayLocal();
|
|
13
|
+
// Hash fragment for the timeline tab is best-effort — most browsers
|
|
14
|
+
// preserve it across server redirects.
|
|
15
|
+
redirect(`/day/${date}#timeline`);
|
|
286
16
|
}
|
|
@@ -6,12 +6,34 @@ import {
|
|
|
6
6
|
detectPrMarkers,
|
|
7
7
|
sessionAirTimeMs,
|
|
8
8
|
} from "@claude-lens/parser";
|
|
9
|
+
import type { DayOutcome, DayHelpfulness } from "@claude-lens/entries";
|
|
9
10
|
import { DashboardView } from "@/components/dashboard-view";
|
|
10
11
|
import { LiveBadge } from "@/components/live-badge";
|
|
11
12
|
import { TeamBadge } from "@/components/team-badge";
|
|
13
|
+
import { OutcomePill, OUTCOME_STYLES } from "@/components/outcome-pill";
|
|
14
|
+
import { HelpfulnessSparkline } from "@/components/helpfulness-sparkline";
|
|
15
|
+
import { buildEntriesIndex, listCachedDayDigests } from "@/lib/entries-index";
|
|
12
16
|
import { formatDuration, formatRelative, prettyProjectName } from "@/lib/format";
|
|
13
17
|
import { ArrowLeft } from "lucide-react";
|
|
14
18
|
|
|
19
|
+
function lastNDays(n: number): string[] {
|
|
20
|
+
const out: string[] = [];
|
|
21
|
+
const now = new Date();
|
|
22
|
+
for (let i = n - 1; i >= 0; i--) {
|
|
23
|
+
const d = new Date(now);
|
|
24
|
+
d.setDate(d.getDate() - i);
|
|
25
|
+
const y = d.getFullYear();
|
|
26
|
+
const m = String(d.getMonth() + 1).padStart(2, "0");
|
|
27
|
+
const day = String(d.getDate()).padStart(2, "0");
|
|
28
|
+
out.push(`${y}-${m}-${day}`);
|
|
29
|
+
}
|
|
30
|
+
return out;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const OUTCOME_PRI: Record<DayOutcome, number> = {
|
|
34
|
+
shipped: 6, partial: 5, blocked: 4, exploratory: 3, trivial: 2, idle: 1,
|
|
35
|
+
};
|
|
36
|
+
|
|
15
37
|
export const dynamic = "force-dynamic";
|
|
16
38
|
|
|
17
39
|
export default async function ProjectDetail({ params }: { params: Promise<{ slug: string }> }) {
|
|
@@ -49,6 +71,50 @@ export default async function ProjectDetail({ params }: { params: Promise<{ slug
|
|
|
49
71
|
const recentSessions = projectSessions.slice(0, 12);
|
|
50
72
|
const hasPrs = prMarkers.length > 0;
|
|
51
73
|
|
|
74
|
+
// Build the recent-7-days strip + helpfulness sparkline.
|
|
75
|
+
const days = lastNDays(7);
|
|
76
|
+
const [entriesIndex, cachedDigests] = await Promise.all([
|
|
77
|
+
buildEntriesIndex(),
|
|
78
|
+
listCachedDayDigests(),
|
|
79
|
+
]);
|
|
80
|
+
const projectEntries = entriesIndex.byProject.get(decodedCanonical) ?? [];
|
|
81
|
+
const entriesByDay = new Map<string, typeof projectEntries>();
|
|
82
|
+
for (const e of projectEntries) {
|
|
83
|
+
const arr = entriesByDay.get(e.local_day);
|
|
84
|
+
if (arr) arr.push(e); else entriesByDay.set(e.local_day, [e]);
|
|
85
|
+
}
|
|
86
|
+
const recentDays: Array<{
|
|
87
|
+
date: string;
|
|
88
|
+
outcome: DayOutcome | null;
|
|
89
|
+
activeMin: number;
|
|
90
|
+
prCount: number;
|
|
91
|
+
}> = days.map((d) => {
|
|
92
|
+
const list = entriesByDay.get(d) ?? [];
|
|
93
|
+
let best: DayOutcome | null = null;
|
|
94
|
+
let bestPri = 0;
|
|
95
|
+
for (const e of list) {
|
|
96
|
+
const o = e.enrichment.outcome as DayOutcome | null;
|
|
97
|
+
if (!o) continue;
|
|
98
|
+
if ((OUTCOME_PRI[o] ?? 0) > bestPri) {
|
|
99
|
+
bestPri = OUTCOME_PRI[o] ?? 0;
|
|
100
|
+
best = o;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const activeMin = list.reduce((a, e) => a + (e.numbers.active_min ?? 0), 0);
|
|
104
|
+
const prCount = list.reduce((a, e) => a + e.pr_titles.length, 0);
|
|
105
|
+
return { date: d, outcome: best, activeMin, prCount };
|
|
106
|
+
});
|
|
107
|
+
const helpfulnessDays: Array<{ date: string; helpfulness: DayHelpfulness; cached: boolean }> =
|
|
108
|
+
days.map((d) => {
|
|
109
|
+
const dig = cachedDigests.get(d);
|
|
110
|
+
return {
|
|
111
|
+
date: d,
|
|
112
|
+
helpfulness: dig?.helpfulness_day ?? null,
|
|
113
|
+
cached: !!dig,
|
|
114
|
+
};
|
|
115
|
+
});
|
|
116
|
+
const hasAnyOutcome = recentDays.some((d) => d.outcome !== null);
|
|
117
|
+
|
|
52
118
|
return (
|
|
53
119
|
<div
|
|
54
120
|
style={{
|
|
@@ -96,6 +162,93 @@ export default async function ProjectDetail({ params }: { params: Promise<{ slug
|
|
|
96
162
|
override={{ activeTimeMs: refinedAirMs || undefined }}
|
|
97
163
|
/>
|
|
98
164
|
|
|
165
|
+
{hasAnyOutcome && (
|
|
166
|
+
<section className="af-panel">
|
|
167
|
+
<div className="af-panel-header">
|
|
168
|
+
<span>Recent days</span>
|
|
169
|
+
<span style={{ fontSize: 11, color: "var(--af-text-tertiary)", fontWeight: 400 }}>
|
|
170
|
+
last 7 local days
|
|
171
|
+
</span>
|
|
172
|
+
</div>
|
|
173
|
+
<div
|
|
174
|
+
style={{
|
|
175
|
+
display: "grid",
|
|
176
|
+
gridTemplateColumns: "repeat(7, 1fr)",
|
|
177
|
+
gap: 8,
|
|
178
|
+
padding: 14,
|
|
179
|
+
}}
|
|
180
|
+
>
|
|
181
|
+
{recentDays.map((d) => {
|
|
182
|
+
const dt = new Date(`${d.date}T12:00:00`);
|
|
183
|
+
const dow = dt.toLocaleDateString("en-US", { weekday: "short" });
|
|
184
|
+
const md = dt.toLocaleDateString("en-US", { month: "short", day: "numeric" });
|
|
185
|
+
return (
|
|
186
|
+
<Link
|
|
187
|
+
key={d.date}
|
|
188
|
+
href={`/digest/${d.date}`}
|
|
189
|
+
style={{
|
|
190
|
+
display: "flex",
|
|
191
|
+
flexDirection: "column",
|
|
192
|
+
gap: 6,
|
|
193
|
+
alignItems: "center",
|
|
194
|
+
padding: "10px 8px",
|
|
195
|
+
border: "1px solid var(--af-border-subtle)",
|
|
196
|
+
borderRadius: 8,
|
|
197
|
+
background: "var(--af-surface)",
|
|
198
|
+
textDecoration: "none",
|
|
199
|
+
color: "var(--af-text)",
|
|
200
|
+
fontSize: 11,
|
|
201
|
+
}}
|
|
202
|
+
>
|
|
203
|
+
<span style={{ fontWeight: 600 }}>{dow}</span>
|
|
204
|
+
<span
|
|
205
|
+
style={{
|
|
206
|
+
fontSize: 10,
|
|
207
|
+
color: "var(--af-text-tertiary)",
|
|
208
|
+
fontFamily: "var(--font-mono)",
|
|
209
|
+
}}
|
|
210
|
+
>
|
|
211
|
+
{md}
|
|
212
|
+
</span>
|
|
213
|
+
{d.outcome ? (
|
|
214
|
+
<span style={{ fontSize: 16, lineHeight: 1 }} aria-hidden>
|
|
215
|
+
{OUTCOME_STYLES[d.outcome]?.icon ?? ""}
|
|
216
|
+
</span>
|
|
217
|
+
) : (
|
|
218
|
+
<span style={{ fontSize: 14, color: "var(--af-text-tertiary)" }}>—</span>
|
|
219
|
+
)}
|
|
220
|
+
<span
|
|
221
|
+
style={{
|
|
222
|
+
fontFamily: "var(--font-mono)",
|
|
223
|
+
fontSize: 10,
|
|
224
|
+
color: "var(--af-text-secondary)",
|
|
225
|
+
}}
|
|
226
|
+
>
|
|
227
|
+
{d.activeMin > 0 ? `${Math.round(d.activeMin)}m` : "—"}
|
|
228
|
+
</span>
|
|
229
|
+
<span
|
|
230
|
+
style={{
|
|
231
|
+
fontSize: 9,
|
|
232
|
+
color: "var(--af-text-tertiary)",
|
|
233
|
+
}}
|
|
234
|
+
>
|
|
235
|
+
{d.prCount > 0 ? `${d.prCount} PR` : "—"}
|
|
236
|
+
</span>
|
|
237
|
+
</Link>
|
|
238
|
+
);
|
|
239
|
+
})}
|
|
240
|
+
</div>
|
|
241
|
+
<div
|
|
242
|
+
style={{
|
|
243
|
+
padding: "12px 16px",
|
|
244
|
+
borderTop: "1px solid var(--af-border-subtle)",
|
|
245
|
+
}}
|
|
246
|
+
>
|
|
247
|
+
<HelpfulnessSparkline days={helpfulnessDays} />
|
|
248
|
+
</div>
|
|
249
|
+
</section>
|
|
250
|
+
)}
|
|
251
|
+
|
|
99
252
|
{/* Pull requests shipped + Recent sessions — two columns (or one if no PRs) */}
|
|
100
253
|
<section
|
|
101
254
|
style={{
|
|
@@ -1,12 +1,57 @@
|
|
|
1
1
|
import { listSessions } from "@/lib/data";
|
|
2
|
-
import { groupByProject } from "@claude-lens/parser";
|
|
3
|
-
import {
|
|
2
|
+
import { canonicalProjectName, groupByProject } from "@claude-lens/parser";
|
|
3
|
+
import type { DayOutcome } from "@claude-lens/entries";
|
|
4
|
+
import { ProjectsView, type ProjectRow } from "./projects-view";
|
|
5
|
+
import { buildEntriesIndex } from "@/lib/entries-index";
|
|
4
6
|
|
|
5
7
|
export const dynamic = "force-dynamic";
|
|
6
8
|
|
|
9
|
+
function lastNDays(n: number): string[] {
|
|
10
|
+
const out: string[] = [];
|
|
11
|
+
const now = new Date();
|
|
12
|
+
for (let i = n - 1; i >= 0; i--) {
|
|
13
|
+
const d = new Date(now);
|
|
14
|
+
d.setDate(d.getDate() - i);
|
|
15
|
+
const y = d.getFullYear();
|
|
16
|
+
const m = String(d.getMonth() + 1).padStart(2, "0");
|
|
17
|
+
const day = String(d.getDate()).padStart(2, "0");
|
|
18
|
+
out.push(`${y}-${m}-${day}`);
|
|
19
|
+
}
|
|
20
|
+
return out;
|
|
21
|
+
}
|
|
22
|
+
|
|
7
23
|
export default async function ProjectsPage() {
|
|
8
|
-
const sessions = await listSessions();
|
|
24
|
+
const [sessions, index] = await Promise.all([listSessions(), buildEntriesIndex()]);
|
|
9
25
|
const projects = groupByProject(sessions);
|
|
26
|
+
const days = lastNDays(7);
|
|
27
|
+
|
|
28
|
+
const rows: ProjectRow[] = projects.map((p) => {
|
|
29
|
+
const canonical = canonicalProjectName(p.projectName);
|
|
30
|
+
const projectEntries = index.byProject.get(canonical) ?? [];
|
|
31
|
+
const byDay = new Map<string, typeof projectEntries>();
|
|
32
|
+
for (const e of projectEntries) {
|
|
33
|
+
const arr = byDay.get(e.local_day);
|
|
34
|
+
if (arr) arr.push(e); else byDay.set(e.local_day, [e]);
|
|
35
|
+
}
|
|
36
|
+
const recent: Array<{ date: string; outcome: DayOutcome | null }> = days.map((d) => {
|
|
37
|
+
const list = byDay.get(d) ?? [];
|
|
38
|
+
let best: DayOutcome | null = null;
|
|
39
|
+
let bestPri = 0;
|
|
40
|
+
const pri: Record<string, number> = {
|
|
41
|
+
shipped: 6, partial: 5, blocked: 4, exploratory: 3, trivial: 2, idle: 1,
|
|
42
|
+
};
|
|
43
|
+
for (const e of list) {
|
|
44
|
+
const o = e.enrichment.outcome;
|
|
45
|
+
if (!o) continue;
|
|
46
|
+
if ((pri[o] ?? 0) > bestPri) {
|
|
47
|
+
bestPri = pri[o] ?? 0;
|
|
48
|
+
best = o as DayOutcome;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return { date: d, outcome: best };
|
|
52
|
+
});
|
|
53
|
+
return { project: p, recentDays: recent };
|
|
54
|
+
});
|
|
10
55
|
|
|
11
56
|
return (
|
|
12
57
|
<div style={{ maxWidth: 1280, padding: "32px 40px" }}>
|
|
@@ -23,7 +68,7 @@ export default async function ProjectsPage() {
|
|
|
23
68
|
{projects.length === 0 ? (
|
|
24
69
|
<div className="af-empty">No projects found.</div>
|
|
25
70
|
) : (
|
|
26
|
-
<ProjectsView
|
|
71
|
+
<ProjectsView rows={rows} />
|
|
27
72
|
)}
|
|
28
73
|
</div>
|
|
29
74
|
);
|