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
|
@@ -24,6 +24,8 @@ import type {
|
|
|
24
24
|
SubagentRun,
|
|
25
25
|
PrMarker,
|
|
26
26
|
} from "@claude-lens/parser";
|
|
27
|
+
import type { Entry } from "@claude-lens/entries";
|
|
28
|
+
import { OutcomePill } from "@/components/outcome-pill";
|
|
27
29
|
import {
|
|
28
30
|
buildPresentation,
|
|
29
31
|
buildMegaRows,
|
|
@@ -35,7 +37,7 @@ import {
|
|
|
35
37
|
type TurnMegaRow,
|
|
36
38
|
type TurnSummary,
|
|
37
39
|
} from "@claude-lens/parser";
|
|
38
|
-
import { formatGap, formatOffset, formatRelative, formatTokens, shortId } from "@/lib/format";
|
|
40
|
+
import { estimateCost, formatCost, formatGap, formatOffset, formatRelative, formatTokens, shortId } from "@/lib/format";
|
|
39
41
|
import { LiveBadge } from "@/components/live-badge";
|
|
40
42
|
import { AskClaudeButton, AskClaudeDrawer } from "@/components/ask-claude";
|
|
41
43
|
import { TailMode } from "@/components/tail-mode";
|
|
@@ -97,10 +99,12 @@ export function SessionView({
|
|
|
97
99
|
session,
|
|
98
100
|
team,
|
|
99
101
|
teamLead,
|
|
102
|
+
entries = [],
|
|
100
103
|
}: {
|
|
101
104
|
session: SessionDetail;
|
|
102
105
|
team?: (TimelineData & { teamName: string }) | null;
|
|
103
106
|
teamLead?: { leadSessionId: string; teamName: string; agentName: string } | null;
|
|
107
|
+
entries?: Entry[];
|
|
104
108
|
}) {
|
|
105
109
|
const readHash = (): TabId => {
|
|
106
110
|
if (typeof window === "undefined") return "transcript";
|
|
@@ -286,6 +290,21 @@ export function SessionView({
|
|
|
286
290
|
/** Detect PR creations in this session. */
|
|
287
291
|
const prMarkers = useMemo(() => detectPrMarkers(session), [session]);
|
|
288
292
|
|
|
293
|
+
const coldResumeMarkers = useMemo(() => {
|
|
294
|
+
const seen = new Set<string>();
|
|
295
|
+
const out: {
|
|
296
|
+
tOffsetMs: number;
|
|
297
|
+
info: NonNullable<SessionEvent["coldResume"]>;
|
|
298
|
+
}[] = [];
|
|
299
|
+
for (const e of events) {
|
|
300
|
+
if (!e.coldResume || !e.messageId || e.tOffsetMs === undefined) continue;
|
|
301
|
+
if (seen.has(e.messageId)) continue;
|
|
302
|
+
seen.add(e.messageId);
|
|
303
|
+
out.push({ tOffsetMs: e.tOffsetMs, info: e.coldResume });
|
|
304
|
+
}
|
|
305
|
+
return out;
|
|
306
|
+
}, [events]);
|
|
307
|
+
|
|
289
308
|
/** Build the full presentation stream once. */
|
|
290
309
|
const allRows = useMemo(() => buildPresentation(visibleEvents), [visibleEvents]);
|
|
291
310
|
|
|
@@ -541,6 +560,18 @@ export function SessionView({
|
|
|
541
560
|
)}
|
|
542
561
|
<InlineStatDivider />
|
|
543
562
|
<InlineTokenStat usage={totalUsage} />
|
|
563
|
+
{session.coldResumeCount !== undefined &&
|
|
564
|
+
session.coldResumeCount > 0 &&
|
|
565
|
+
session.cacheRebuildTokens !== undefined && (
|
|
566
|
+
<>
|
|
567
|
+
<InlineStatDivider />
|
|
568
|
+
<ColdResumeSessionStat
|
|
569
|
+
count={session.coldResumeCount}
|
|
570
|
+
writeTokens={session.cacheRebuildTokens}
|
|
571
|
+
model={model}
|
|
572
|
+
/>
|
|
573
|
+
</>
|
|
574
|
+
)}
|
|
544
575
|
<InlineStatDivider />
|
|
545
576
|
<InlineStat value={`${eventCount} events`} />
|
|
546
577
|
{prMarkers.length > 0 && (
|
|
@@ -675,6 +706,8 @@ export function SessionView({
|
|
|
675
706
|
subagents={session.subagents}
|
|
676
707
|
collapsed={collapsed}
|
|
677
708
|
prMarkers={prMarkers}
|
|
709
|
+
coldResumeMarkers={coldResumeMarkers}
|
|
710
|
+
model={model}
|
|
678
711
|
selectedSubagentId={selectedSubagentId}
|
|
679
712
|
onSelectSubagent={(id) => {
|
|
680
713
|
setSelectedSubagentId(id);
|
|
@@ -709,6 +742,11 @@ export function SessionView({
|
|
|
709
742
|
/>
|
|
710
743
|
) : tab === "transcript" ? (
|
|
711
744
|
<>
|
|
745
|
+
{entries.length > 0 && (
|
|
746
|
+
<div style={{ display: "flex", flexDirection: "column", gap: 10, marginBottom: 14 }}>
|
|
747
|
+
{entries.map((e) => <EntryDayStrip key={e.local_day} entry={e} />)}
|
|
748
|
+
</div>
|
|
749
|
+
)}
|
|
712
750
|
{teammateCount > 0 && (
|
|
713
751
|
<div
|
|
714
752
|
style={{
|
|
@@ -749,6 +787,7 @@ export function SessionView({
|
|
|
749
787
|
stickyOffset={headerH + 16}
|
|
750
788
|
isSessionLive={isSessionLive}
|
|
751
789
|
team={team}
|
|
790
|
+
model={model}
|
|
752
791
|
/>
|
|
753
792
|
</>
|
|
754
793
|
) : (
|
|
@@ -1031,7 +1070,7 @@ function InlineStatDivider() {
|
|
|
1031
1070
|
}
|
|
1032
1071
|
|
|
1033
1072
|
function InlineTokenStat({ usage }: { usage: SessionEvent["usage"] }) {
|
|
1034
|
-
const
|
|
1073
|
+
const { ref, anchor, open, close } = useAnchoredTooltip();
|
|
1035
1074
|
const u = usage ?? { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };
|
|
1036
1075
|
const totalIn = u.input + u.cacheRead + u.cacheWrite;
|
|
1037
1076
|
const pctRead = totalIn > 0 ? Math.round((u.cacheRead / totalIn) * 100) : 0;
|
|
@@ -1039,8 +1078,8 @@ function InlineTokenStat({ usage }: { usage: SessionEvent["usage"] }) {
|
|
|
1039
1078
|
|
|
1040
1079
|
return (
|
|
1041
1080
|
<span
|
|
1081
|
+
ref={ref}
|
|
1042
1082
|
style={{
|
|
1043
|
-
position: "relative",
|
|
1044
1083
|
display: "inline-flex",
|
|
1045
1084
|
alignItems: "center",
|
|
1046
1085
|
gap: 6,
|
|
@@ -1049,20 +1088,15 @@ function InlineTokenStat({ usage }: { usage: SessionEvent["usage"] }) {
|
|
|
1049
1088
|
cursor: "default",
|
|
1050
1089
|
fontFamily: "var(--font-mono)",
|
|
1051
1090
|
}}
|
|
1052
|
-
onMouseEnter={
|
|
1053
|
-
onMouseLeave={
|
|
1091
|
+
onMouseEnter={open}
|
|
1092
|
+
onMouseLeave={close}
|
|
1054
1093
|
>
|
|
1055
|
-
{/* Primary: fresh input / output. This is the actually-new
|
|
1056
|
-
per-request context — distinct from the cached context that
|
|
1057
|
-
dominates most agentic sessions (often 99%+). */}
|
|
1058
1094
|
<span>
|
|
1059
1095
|
{formatTokens(u.input)}
|
|
1060
1096
|
<span style={{ color: "var(--af-text-tertiary)", margin: "0 3px" }}>in</span>
|
|
1061
1097
|
{formatTokens(u.output)}
|
|
1062
1098
|
<span style={{ color: "var(--af-text-tertiary)", marginLeft: 3 }}>out</span>
|
|
1063
1099
|
</span>
|
|
1064
|
-
{/* Secondary: cached context as a separate hint so the header
|
|
1065
|
-
doesn't lump 50M+ cache hits into the "tokens" number. */}
|
|
1066
1100
|
{cached > 0 && (
|
|
1067
1101
|
<span
|
|
1068
1102
|
style={{
|
|
@@ -1075,14 +1109,8 @@ function InlineTokenStat({ usage }: { usage: SessionEvent["usage"] }) {
|
|
|
1075
1109
|
+{formatTokens(cached)} cached
|
|
1076
1110
|
</span>
|
|
1077
1111
|
)}
|
|
1078
|
-
{
|
|
1079
|
-
<
|
|
1080
|
-
style={{
|
|
1081
|
-
bottom: "calc(100% + 6px)",
|
|
1082
|
-
left: 0,
|
|
1083
|
-
minWidth: 240,
|
|
1084
|
-
}}
|
|
1085
|
-
>
|
|
1112
|
+
{anchor && (
|
|
1113
|
+
<AnchoredTooltip anchor={anchor} width={280}>
|
|
1086
1114
|
<TooltipRow label="Input (fresh)" value={u.input.toLocaleString()} />
|
|
1087
1115
|
<TooltipRow label="Output" value={u.output.toLocaleString()} />
|
|
1088
1116
|
<TooltipRow label="Cache read" value={`${u.cacheRead.toLocaleString()} (${pctRead}%)`} />
|
|
@@ -1100,12 +1128,60 @@ function InlineTokenStat({ usage }: { usage: SessionEvent["usage"] }) {
|
|
|
1100
1128
|
>
|
|
1101
1129
|
Cache reads are cumulative across all API requests and billed at ~10% of regular input.
|
|
1102
1130
|
</div>
|
|
1103
|
-
</
|
|
1131
|
+
</AnchoredTooltip>
|
|
1104
1132
|
)}
|
|
1105
1133
|
</span>
|
|
1106
1134
|
);
|
|
1107
1135
|
}
|
|
1108
1136
|
|
|
1137
|
+
// Used for tooltips that live inside an overflow:hidden ancestor (like the
|
|
1138
|
+
// session-header row). getBoundingClientRect + position:fixed lets the
|
|
1139
|
+
// tooltip escape the clipping context instead of being cropped.
|
|
1140
|
+
function useAnchoredTooltip() {
|
|
1141
|
+
const ref = useRef<HTMLSpanElement>(null);
|
|
1142
|
+
const [anchor, setAnchor] = useState<{ top: number; left: number } | null>(null);
|
|
1143
|
+
const open = () => {
|
|
1144
|
+
if (!ref.current) return;
|
|
1145
|
+
const r = ref.current.getBoundingClientRect();
|
|
1146
|
+
setAnchor({ top: r.bottom + 6, left: r.left });
|
|
1147
|
+
};
|
|
1148
|
+
const close = () => setAnchor(null);
|
|
1149
|
+
return { ref, anchor, open, close };
|
|
1150
|
+
}
|
|
1151
|
+
|
|
1152
|
+
function AnchoredTooltip({
|
|
1153
|
+
anchor,
|
|
1154
|
+
width,
|
|
1155
|
+
children,
|
|
1156
|
+
}: {
|
|
1157
|
+
anchor: { top: number; left: number };
|
|
1158
|
+
width: number;
|
|
1159
|
+
children: React.ReactNode;
|
|
1160
|
+
}) {
|
|
1161
|
+
return (
|
|
1162
|
+
<div
|
|
1163
|
+
style={{
|
|
1164
|
+
position: "fixed",
|
|
1165
|
+
top: anchor.top,
|
|
1166
|
+
left: anchor.left,
|
|
1167
|
+
zIndex: 1000,
|
|
1168
|
+
background: "#1A1A1A",
|
|
1169
|
+
color: "#F5F1EC",
|
|
1170
|
+
padding: "8px 12px",
|
|
1171
|
+
borderRadius: 6,
|
|
1172
|
+
fontSize: 11,
|
|
1173
|
+
fontFamily: "var(--font-mono)",
|
|
1174
|
+
lineHeight: 1.5,
|
|
1175
|
+
pointerEvents: "none",
|
|
1176
|
+
boxShadow: "0 4px 16px rgba(15,23,42,0.24)",
|
|
1177
|
+
width,
|
|
1178
|
+
}}
|
|
1179
|
+
>
|
|
1180
|
+
{children}
|
|
1181
|
+
</div>
|
|
1182
|
+
);
|
|
1183
|
+
}
|
|
1184
|
+
|
|
1109
1185
|
/* ------------------------------------------------------------------ */
|
|
1110
1186
|
/* Generic Tooltip */
|
|
1111
1187
|
/* ------------------------------------------------------------------ */
|
|
@@ -1208,6 +1284,8 @@ function Minimap({
|
|
|
1208
1284
|
selectedSubagentId,
|
|
1209
1285
|
onSelectSubagent,
|
|
1210
1286
|
prMarkers,
|
|
1287
|
+
coldResumeMarkers,
|
|
1288
|
+
model,
|
|
1211
1289
|
}: {
|
|
1212
1290
|
displayRows: DisplayRow[];
|
|
1213
1291
|
durationMs: number;
|
|
@@ -1219,6 +1297,11 @@ function Minimap({
|
|
|
1219
1297
|
selectedSubagentId?: string | null;
|
|
1220
1298
|
onSelectSubagent?: (id: string | null) => void;
|
|
1221
1299
|
prMarkers?: PrMarker[];
|
|
1300
|
+
coldResumeMarkers?: {
|
|
1301
|
+
tOffsetMs: number;
|
|
1302
|
+
info: NonNullable<SessionEvent["coldResume"]>;
|
|
1303
|
+
}[];
|
|
1304
|
+
model?: string;
|
|
1222
1305
|
}) {
|
|
1223
1306
|
const WIDTH = 1400;
|
|
1224
1307
|
/** Main timeline height. Sub-agent lanes stack below this. */
|
|
@@ -1247,6 +1330,10 @@ function Minimap({
|
|
|
1247
1330
|
idleMs?: number;
|
|
1248
1331
|
subagent?: SubagentRun;
|
|
1249
1332
|
pr?: PrMarker;
|
|
1333
|
+
cold?: {
|
|
1334
|
+
tOffsetMs: number;
|
|
1335
|
+
info: NonNullable<SessionEvent["coldResume"]>;
|
|
1336
|
+
};
|
|
1250
1337
|
} | null>(null);
|
|
1251
1338
|
const [playheadMs, setPlayheadMs] = useState<number | null>(null);
|
|
1252
1339
|
const containerRef = useRef<HTMLDivElement>(null);
|
|
@@ -1777,6 +1864,41 @@ function Minimap({
|
|
|
1777
1864
|
);
|
|
1778
1865
|
})}
|
|
1779
1866
|
|
|
1867
|
+
{coldResumeMarkers?.map((cr, i) => {
|
|
1868
|
+
const x = msToX(cr.tOffsetMs);
|
|
1869
|
+
return (
|
|
1870
|
+
<g
|
|
1871
|
+
key={`cold-${i}`}
|
|
1872
|
+
style={{ cursor: "pointer" }}
|
|
1873
|
+
onMouseEnter={(e) => setHover({ clientX: e.clientX, cold: cr })}
|
|
1874
|
+
>
|
|
1875
|
+
<line
|
|
1876
|
+
x1={x}
|
|
1877
|
+
x2={x}
|
|
1878
|
+
y1={0}
|
|
1879
|
+
y2={TOTAL_H}
|
|
1880
|
+
stroke="#D97706"
|
|
1881
|
+
strokeWidth="1.5"
|
|
1882
|
+
strokeDasharray="4 3"
|
|
1883
|
+
opacity="0.75"
|
|
1884
|
+
/>
|
|
1885
|
+
<rect
|
|
1886
|
+
x={x - 8}
|
|
1887
|
+
y={0}
|
|
1888
|
+
width={16}
|
|
1889
|
+
height={TOTAL_H}
|
|
1890
|
+
fill="transparent"
|
|
1891
|
+
/>
|
|
1892
|
+
<polygon
|
|
1893
|
+
points={`${x},${MAIN_H / 2 - 5} ${x + 5},${MAIN_H / 2} ${x},${MAIN_H / 2 + 5} ${x - 5},${MAIN_H / 2}`}
|
|
1894
|
+
fill="#D97706"
|
|
1895
|
+
stroke="var(--af-surface)"
|
|
1896
|
+
strokeWidth="1.5"
|
|
1897
|
+
/>
|
|
1898
|
+
</g>
|
|
1899
|
+
);
|
|
1900
|
+
})}
|
|
1901
|
+
|
|
1780
1902
|
{/* Playhead — positioned against the relaxed layout, not raw time.
|
|
1781
1903
|
Spans the full SVG height (main + subagent lanes) so you can see
|
|
1782
1904
|
which subagents were running at the current scroll position. */}
|
|
@@ -1804,6 +1926,8 @@ function Minimap({
|
|
|
1804
1926
|
idleMs={hover.idleMs}
|
|
1805
1927
|
subagent={hover.subagent}
|
|
1806
1928
|
pr={hover.pr}
|
|
1929
|
+
cold={hover.cold}
|
|
1930
|
+
model={model}
|
|
1807
1931
|
/>
|
|
1808
1932
|
)}
|
|
1809
1933
|
|
|
@@ -1891,6 +2015,8 @@ function MinimapHoverCard({
|
|
|
1891
2015
|
idleMs,
|
|
1892
2016
|
subagent,
|
|
1893
2017
|
pr,
|
|
2018
|
+
cold,
|
|
2019
|
+
model,
|
|
1894
2020
|
}: {
|
|
1895
2021
|
containerRef: React.RefObject<HTMLDivElement | null>;
|
|
1896
2022
|
clientX: number;
|
|
@@ -1899,6 +2025,8 @@ function MinimapHoverCard({
|
|
|
1899
2025
|
idleMs?: number;
|
|
1900
2026
|
subagent?: SubagentRun;
|
|
1901
2027
|
pr?: PrMarker;
|
|
2028
|
+
cold?: { tOffsetMs: number; info: NonNullable<SessionEvent["coldResume"]> };
|
|
2029
|
+
model?: string;
|
|
1902
2030
|
}) {
|
|
1903
2031
|
const rect = containerRef.current?.getBoundingClientRect();
|
|
1904
2032
|
const localX = rect ? clientX - rect.left : 0;
|
|
@@ -2014,6 +2142,77 @@ function MinimapHoverCard({
|
|
|
2014
2142
|
);
|
|
2015
2143
|
}
|
|
2016
2144
|
|
|
2145
|
+
if (cold) {
|
|
2146
|
+
const { trigger, gapMs, writeTokens, compact } = cold.info;
|
|
2147
|
+
const isCompact = trigger === "compact";
|
|
2148
|
+
const estUsd = estimateCost(
|
|
2149
|
+
{ input: 0, output: 0, cacheRead: 0, cacheWrite: writeTokens },
|
|
2150
|
+
model,
|
|
2151
|
+
);
|
|
2152
|
+
let label: string;
|
|
2153
|
+
if (!isCompact) label = "⚡ CACHE REBUILD";
|
|
2154
|
+
else if (compact?.trigger === "auto") label = "⚡ AUTO-COMPACT";
|
|
2155
|
+
else label = "⚡ /COMPACT";
|
|
2156
|
+
const detailLine = isCompact
|
|
2157
|
+
? `${formatTokens(writeTokens)} rewritten · pre-compact ${formatTokens(compact?.preTokens ?? 0)}`
|
|
2158
|
+
: `${formatTokens(writeTokens)} rewritten · idle ${formatGap(gapMs)}`;
|
|
2159
|
+
const hint = isCompact
|
|
2160
|
+
? "Conversation was summarized; prefix had to be rewritten into a fresh cache."
|
|
2161
|
+
: "Prompt cache expired during idle; resuming within 5 min keeps it warm.";
|
|
2162
|
+
return (
|
|
2163
|
+
<div
|
|
2164
|
+
style={{
|
|
2165
|
+
position: "absolute",
|
|
2166
|
+
...posStyle,
|
|
2167
|
+
zIndex: 100,
|
|
2168
|
+
background: "#0F172A",
|
|
2169
|
+
color: "#F1F5F9",
|
|
2170
|
+
borderRadius: 10,
|
|
2171
|
+
padding: "10px 14px",
|
|
2172
|
+
fontSize: 11,
|
|
2173
|
+
pointerEvents: "none",
|
|
2174
|
+
boxShadow: "0 6px 24px rgba(15,23,42,0.22)",
|
|
2175
|
+
maxWidth: 340,
|
|
2176
|
+
minWidth: 220,
|
|
2177
|
+
lineHeight: 1.45,
|
|
2178
|
+
}}
|
|
2179
|
+
>
|
|
2180
|
+
<div style={{ display: "flex", alignItems: "center", gap: 8, marginBottom: 4 }}>
|
|
2181
|
+
<span
|
|
2182
|
+
style={{
|
|
2183
|
+
fontSize: 10,
|
|
2184
|
+
fontWeight: 600,
|
|
2185
|
+
padding: "2px 8px",
|
|
2186
|
+
borderRadius: 4,
|
|
2187
|
+
background: "#D97706",
|
|
2188
|
+
color: "#fff",
|
|
2189
|
+
}}
|
|
2190
|
+
>
|
|
2191
|
+
{label}
|
|
2192
|
+
</span>
|
|
2193
|
+
<span style={{ fontFamily: "var(--font-mono)", fontSize: 10, opacity: 0.7 }}>
|
|
2194
|
+
at {formatOffset(cold.tOffsetMs)}
|
|
2195
|
+
</span>
|
|
2196
|
+
</div>
|
|
2197
|
+
<div style={{ fontWeight: 500, fontFamily: "var(--font-mono)" }}>
|
|
2198
|
+
{detailLine}
|
|
2199
|
+
{estUsd >= 0.005 && ` · est. ${formatCost(estUsd)}`}
|
|
2200
|
+
</div>
|
|
2201
|
+
<div
|
|
2202
|
+
style={{
|
|
2203
|
+
marginTop: 4,
|
|
2204
|
+
fontSize: 10,
|
|
2205
|
+
opacity: 0.65,
|
|
2206
|
+
fontStyle: "italic",
|
|
2207
|
+
whiteSpace: "normal",
|
|
2208
|
+
}}
|
|
2209
|
+
>
|
|
2210
|
+
{hint}
|
|
2211
|
+
</div>
|
|
2212
|
+
</div>
|
|
2213
|
+
);
|
|
2214
|
+
}
|
|
2215
|
+
|
|
2017
2216
|
if (pr) {
|
|
2018
2217
|
const label = pr.title
|
|
2019
2218
|
? `PR${pr.prNumber ? ` #${pr.prNumber}` : ""}: ${pr.title}`
|
|
@@ -2314,6 +2513,7 @@ function TranscriptList({
|
|
|
2314
2513
|
stickyOffset,
|
|
2315
2514
|
isSessionLive,
|
|
2316
2515
|
team,
|
|
2516
|
+
model,
|
|
2317
2517
|
}: {
|
|
2318
2518
|
displayRows: DisplayRow[];
|
|
2319
2519
|
rowRefs: React.MutableRefObject<Record<number, HTMLDivElement | null>>;
|
|
@@ -2323,6 +2523,7 @@ function TranscriptList({
|
|
|
2323
2523
|
stickyOffset: number;
|
|
2324
2524
|
isSessionLive?: boolean;
|
|
2325
2525
|
team?: (TimelineData & { teamName: string }) | null;
|
|
2526
|
+
model?: string;
|
|
2326
2527
|
}) {
|
|
2327
2528
|
// Find the last collapsed turn index so we can mark it as in-progress
|
|
2328
2529
|
// when the session is live.
|
|
@@ -2343,6 +2544,7 @@ function TranscriptList({
|
|
|
2343
2544
|
// Collapsed turn summary row
|
|
2344
2545
|
if (d.kind === "turn-collapsed") {
|
|
2345
2546
|
const idx = d.turn.firstPrimaryIndex;
|
|
2547
|
+
const turnCold = findColdResumeInDisplayRow(d);
|
|
2346
2548
|
out.push(
|
|
2347
2549
|
<CollapsedTurnRow
|
|
2348
2550
|
key={`turn-${idx}`}
|
|
@@ -2351,6 +2553,8 @@ function TranscriptList({
|
|
|
2351
2553
|
onClick={() => onToggleTurn(idx)}
|
|
2352
2554
|
inProgress={i === lastCollapsedTurnIdx}
|
|
2353
2555
|
team={team}
|
|
2556
|
+
coldResume={turnCold ?? undefined}
|
|
2557
|
+
model={model}
|
|
2354
2558
|
refCb={(el) => {
|
|
2355
2559
|
rowRefs.current[idx] = el;
|
|
2356
2560
|
}}
|
|
@@ -2361,11 +2565,14 @@ function TranscriptList({
|
|
|
2361
2565
|
|
|
2362
2566
|
// Expanded turn header
|
|
2363
2567
|
if (d.kind === "turn-expanded-header") {
|
|
2568
|
+
const turnCold = findColdResumeInDisplayRow(d);
|
|
2364
2569
|
out.push(
|
|
2365
2570
|
<ExpandedTurnHeader
|
|
2366
2571
|
key={`turnhead-${d.turn.firstPrimaryIndex}`}
|
|
2367
2572
|
turn={d.turn}
|
|
2368
2573
|
onClick={() => onToggleTurn(d.turn.firstPrimaryIndex)}
|
|
2574
|
+
coldResume={turnCold ?? undefined}
|
|
2575
|
+
model={model}
|
|
2369
2576
|
/>,
|
|
2370
2577
|
);
|
|
2371
2578
|
continue;
|
|
@@ -2430,6 +2637,212 @@ function IdleDivider({ gapMs }: { gapMs: number }) {
|
|
|
2430
2637
|
);
|
|
2431
2638
|
}
|
|
2432
2639
|
|
|
2640
|
+
function findColdResumeInDisplayRow(
|
|
2641
|
+
d: DisplayRow,
|
|
2642
|
+
): SessionEvent["coldResume"] | null {
|
|
2643
|
+
if (d.kind === "presentation") return findColdResumeInRow(d.row);
|
|
2644
|
+
if (d.kind === "turn-collapsed" || d.kind === "turn-expanded-header") {
|
|
2645
|
+
for (const r of d.turn.rows) {
|
|
2646
|
+
const hit = findColdResumeInRow(r);
|
|
2647
|
+
if (hit) return hit;
|
|
2648
|
+
}
|
|
2649
|
+
}
|
|
2650
|
+
return null;
|
|
2651
|
+
}
|
|
2652
|
+
|
|
2653
|
+
function findColdResumeInRow(
|
|
2654
|
+
r: PresentationRow,
|
|
2655
|
+
): SessionEvent["coldResume"] | null {
|
|
2656
|
+
if (r.kind === "agent") {
|
|
2657
|
+
if (r.event.coldResume) return r.event.coldResume;
|
|
2658
|
+
for (const ge of r.groupedEvents) {
|
|
2659
|
+
if (ge.coldResume) return ge.coldResume;
|
|
2660
|
+
}
|
|
2661
|
+
} else if (r.kind === "tool-group") {
|
|
2662
|
+
for (const e of r.events) if (e.coldResume) return e.coldResume;
|
|
2663
|
+
}
|
|
2664
|
+
return null;
|
|
2665
|
+
}
|
|
2666
|
+
|
|
2667
|
+
function ColdResumeNotice({
|
|
2668
|
+
info,
|
|
2669
|
+
model,
|
|
2670
|
+
}: {
|
|
2671
|
+
info: NonNullable<SessionEvent["coldResume"]>;
|
|
2672
|
+
model?: string;
|
|
2673
|
+
}) {
|
|
2674
|
+
const { trigger, gapMs, writeTokens, writeRatio, compact } = info;
|
|
2675
|
+
const estUsd = estimateCost(
|
|
2676
|
+
{ input: 0, output: 0, cacheRead: 0, cacheWrite: writeTokens },
|
|
2677
|
+
model,
|
|
2678
|
+
);
|
|
2679
|
+
const isCompact = trigger === "compact";
|
|
2680
|
+
const fullyCold = writeRatio >= 0.9;
|
|
2681
|
+
let title: string;
|
|
2682
|
+
if (!isCompact) title = `Session resumed cold · idle ${formatGap(gapMs)}`;
|
|
2683
|
+
else if (compact?.trigger === "auto") title = "Auto-compact rebuilt the cache";
|
|
2684
|
+
else title = "Conversation compacted · cache rebuilt";
|
|
2685
|
+
const hint = isCompact
|
|
2686
|
+
? "Compaction summarizes the conversation, so the prefix must be rewritten into a fresh cache. Any /compact or auto-compact will cost this rewrite."
|
|
2687
|
+
: "Prompt cache expired during idle. Resuming within 5 min keeps the cache warm and avoids the rewrite tax.";
|
|
2688
|
+
return (
|
|
2689
|
+
<div
|
|
2690
|
+
style={{
|
|
2691
|
+
padding: "8px 12px",
|
|
2692
|
+
background: "rgba(217, 119, 6, 0.08)",
|
|
2693
|
+
border: "1px solid rgba(217, 119, 6, 0.35)",
|
|
2694
|
+
borderLeft: "3px solid rgba(217, 119, 6, 0.9)",
|
|
2695
|
+
borderRadius: 6,
|
|
2696
|
+
fontSize: 11.5,
|
|
2697
|
+
color: "var(--af-text-secondary)",
|
|
2698
|
+
lineHeight: 1.5,
|
|
2699
|
+
}}
|
|
2700
|
+
>
|
|
2701
|
+
<div
|
|
2702
|
+
style={{
|
|
2703
|
+
display: "flex",
|
|
2704
|
+
alignItems: "center",
|
|
2705
|
+
gap: 8,
|
|
2706
|
+
fontWeight: 600,
|
|
2707
|
+
color: "#78350F",
|
|
2708
|
+
letterSpacing: "0.01em",
|
|
2709
|
+
}}
|
|
2710
|
+
>
|
|
2711
|
+
<span style={{ fontSize: 13 }}>⚡</span>
|
|
2712
|
+
{title}
|
|
2713
|
+
</div>
|
|
2714
|
+
<div style={{ marginTop: 4, fontFamily: "var(--font-mono)", fontSize: 11 }}>
|
|
2715
|
+
Rewrote <b>{formatTokens(writeTokens)}</b> tokens into prompt cache
|
|
2716
|
+
{estUsd >= 0.005 && (
|
|
2717
|
+
<>
|
|
2718
|
+
{" "}
|
|
2719
|
+
· est. <b>{formatCost(estUsd)}</b>
|
|
2720
|
+
</>
|
|
2721
|
+
)}
|
|
2722
|
+
{isCompact && compact && (
|
|
2723
|
+
<>
|
|
2724
|
+
{" "}
|
|
2725
|
+
· pre-compact <b>{formatTokens(compact.preTokens)}</b>
|
|
2726
|
+
</>
|
|
2727
|
+
)}
|
|
2728
|
+
{!isCompact && (
|
|
2729
|
+
<>
|
|
2730
|
+
{" "}
|
|
2731
|
+
· {fullyCold ? "fully cold" : "partial"} ({Math.round(writeRatio * 100)}% write)
|
|
2732
|
+
</>
|
|
2733
|
+
)}
|
|
2734
|
+
</div>
|
|
2735
|
+
<div
|
|
2736
|
+
style={{
|
|
2737
|
+
marginTop: 3,
|
|
2738
|
+
fontSize: 10.5,
|
|
2739
|
+
color: "var(--af-text-tertiary)",
|
|
2740
|
+
fontStyle: "italic",
|
|
2741
|
+
}}
|
|
2742
|
+
>
|
|
2743
|
+
{hint}
|
|
2744
|
+
</div>
|
|
2745
|
+
</div>
|
|
2746
|
+
);
|
|
2747
|
+
}
|
|
2748
|
+
|
|
2749
|
+
function ColdResumeSessionStat({
|
|
2750
|
+
count,
|
|
2751
|
+
writeTokens,
|
|
2752
|
+
model,
|
|
2753
|
+
}: {
|
|
2754
|
+
count: number;
|
|
2755
|
+
writeTokens: number;
|
|
2756
|
+
model?: string;
|
|
2757
|
+
}) {
|
|
2758
|
+
const { ref, anchor, open, close } = useAnchoredTooltip();
|
|
2759
|
+
const estUsd = estimateCost(
|
|
2760
|
+
{ input: 0, output: 0, cacheRead: 0, cacheWrite: writeTokens },
|
|
2761
|
+
model,
|
|
2762
|
+
);
|
|
2763
|
+
return (
|
|
2764
|
+
<span
|
|
2765
|
+
ref={ref}
|
|
2766
|
+
style={{
|
|
2767
|
+
display: "inline-flex",
|
|
2768
|
+
alignItems: "center",
|
|
2769
|
+
gap: 5,
|
|
2770
|
+
fontSize: 11.5,
|
|
2771
|
+
fontWeight: 600,
|
|
2772
|
+
color: "#78350F",
|
|
2773
|
+
background: "rgba(217, 119, 6, 0.12)",
|
|
2774
|
+
padding: "2px 8px",
|
|
2775
|
+
borderRadius: 100,
|
|
2776
|
+
cursor: "default",
|
|
2777
|
+
}}
|
|
2778
|
+
onMouseEnter={open}
|
|
2779
|
+
onMouseLeave={close}
|
|
2780
|
+
>
|
|
2781
|
+
<span style={{ fontSize: 12 }}>⚡</span>
|
|
2782
|
+
{count} cache rebuild{count === 1 ? "" : "s"} · {formatTokens(writeTokens)} rewritten
|
|
2783
|
+
{anchor && (
|
|
2784
|
+
<AnchoredTooltip anchor={anchor} width={320}>
|
|
2785
|
+
<TooltipRow label="Cache rebuilds" value={count.toLocaleString()} />
|
|
2786
|
+
<TooltipRow label="Tokens rewritten" value={writeTokens.toLocaleString()} />
|
|
2787
|
+
{estUsd >= 0.005 && (
|
|
2788
|
+
<TooltipRow label="Est. rebuild cost" value={formatCost(estUsd)} />
|
|
2789
|
+
)}
|
|
2790
|
+
<div
|
|
2791
|
+
style={{
|
|
2792
|
+
marginTop: 6,
|
|
2793
|
+
paddingTop: 6,
|
|
2794
|
+
borderTop: "1px solid rgba(241,245,249,0.12)",
|
|
2795
|
+
opacity: 0.65,
|
|
2796
|
+
fontSize: 10,
|
|
2797
|
+
whiteSpace: "normal",
|
|
2798
|
+
lineHeight: 1.4,
|
|
2799
|
+
}}
|
|
2800
|
+
>
|
|
2801
|
+
Turns where the whole prompt-cache prefix had to be rewritten.
|
|
2802
|
+
Either the cache expired during a long idle gap, or a /compact
|
|
2803
|
+
(manual or auto) summarized the conversation. Both cost tokens
|
|
2804
|
+
at 1.25× base input price.
|
|
2805
|
+
</div>
|
|
2806
|
+
</AnchoredTooltip>
|
|
2807
|
+
)}
|
|
2808
|
+
</span>
|
|
2809
|
+
);
|
|
2810
|
+
}
|
|
2811
|
+
|
|
2812
|
+
function ColdResumeChip({
|
|
2813
|
+
info,
|
|
2814
|
+
model,
|
|
2815
|
+
}: {
|
|
2816
|
+
info: NonNullable<SessionEvent["coldResume"]>;
|
|
2817
|
+
model?: string;
|
|
2818
|
+
}) {
|
|
2819
|
+
const { writeTokens } = info;
|
|
2820
|
+
const estUsd = estimateCost(
|
|
2821
|
+
{ input: 0, output: 0, cacheRead: 0, cacheWrite: writeTokens },
|
|
2822
|
+
model,
|
|
2823
|
+
);
|
|
2824
|
+
return (
|
|
2825
|
+
<span
|
|
2826
|
+
title={`Prompt cache expired during idle; this turn rewrote ${writeTokens.toLocaleString()} tokens into cache${estUsd >= 0.005 ? ` (est. ${formatCost(estUsd)})` : ""}.`}
|
|
2827
|
+
style={{
|
|
2828
|
+
display: "inline-flex",
|
|
2829
|
+
alignItems: "center",
|
|
2830
|
+
gap: 4,
|
|
2831
|
+
fontSize: 10.5,
|
|
2832
|
+
fontWeight: 600,
|
|
2833
|
+
padding: "2px 7px",
|
|
2834
|
+
borderRadius: 3,
|
|
2835
|
+
background: "rgba(217, 119, 6, 0.14)",
|
|
2836
|
+
color: "#78350F",
|
|
2837
|
+
letterSpacing: "0.01em",
|
|
2838
|
+
cursor: "default",
|
|
2839
|
+
}}
|
|
2840
|
+
>
|
|
2841
|
+
⚡ cold resume · {formatTokens(writeTokens)} rewritten
|
|
2842
|
+
</span>
|
|
2843
|
+
);
|
|
2844
|
+
}
|
|
2845
|
+
|
|
2433
2846
|
/* ------------------------------------------------------------------ */
|
|
2434
2847
|
/* Collapsed turn row */
|
|
2435
2848
|
/* */
|
|
@@ -2446,6 +2859,8 @@ function CollapsedTurnRow({
|
|
|
2446
2859
|
stickyOffset,
|
|
2447
2860
|
inProgress,
|
|
2448
2861
|
team,
|
|
2862
|
+
coldResume,
|
|
2863
|
+
model,
|
|
2449
2864
|
}: {
|
|
2450
2865
|
turn: TurnMegaRow;
|
|
2451
2866
|
/** Fires when the user wants to fully expand this turn into the
|
|
@@ -2456,6 +2871,8 @@ function CollapsedTurnRow({
|
|
|
2456
2871
|
stickyOffset: number;
|
|
2457
2872
|
inProgress?: boolean;
|
|
2458
2873
|
team?: (TimelineData & { teamName: string }) | null;
|
|
2874
|
+
coldResume?: NonNullable<SessionEvent["coldResume"]>;
|
|
2875
|
+
model?: string;
|
|
2459
2876
|
}) {
|
|
2460
2877
|
const theme = ROLE_THEMES.agent;
|
|
2461
2878
|
const s = turn.summary;
|
|
@@ -2526,7 +2943,7 @@ function CollapsedTurnRow({
|
|
|
2526
2943
|
Agent
|
|
2527
2944
|
</span>
|
|
2528
2945
|
|
|
2529
|
-
{/* Col 3 — content (first · stats · steps · last · bottom bar) */}
|
|
2946
|
+
{/* Col 3 — content (cold-resume notice · first · stats · steps · last · bottom bar) */}
|
|
2530
2947
|
<div
|
|
2531
2948
|
style={{
|
|
2532
2949
|
minWidth: 0,
|
|
@@ -2536,6 +2953,12 @@ function CollapsedTurnRow({
|
|
|
2536
2953
|
paddingBottom: 10,
|
|
2537
2954
|
}}
|
|
2538
2955
|
>
|
|
2956
|
+
{coldResume && (
|
|
2957
|
+
<div onClick={stop}>
|
|
2958
|
+
<ColdResumeNotice info={coldResume} model={model} />
|
|
2959
|
+
</div>
|
|
2960
|
+
)}
|
|
2961
|
+
|
|
2539
2962
|
{/* 1. First agent message — clickable to expand into full markdown */}
|
|
2540
2963
|
{firstAgentRow && (
|
|
2541
2964
|
<ExpandableMessage
|
|
@@ -3027,7 +3450,17 @@ function TurnStatsLine({
|
|
|
3027
3450
|
);
|
|
3028
3451
|
}
|
|
3029
3452
|
|
|
3030
|
-
function ExpandedTurnHeader({
|
|
3453
|
+
function ExpandedTurnHeader({
|
|
3454
|
+
turn,
|
|
3455
|
+
onClick,
|
|
3456
|
+
coldResume,
|
|
3457
|
+
model,
|
|
3458
|
+
}: {
|
|
3459
|
+
turn: TurnMegaRow;
|
|
3460
|
+
onClick: () => void;
|
|
3461
|
+
coldResume?: NonNullable<SessionEvent["coldResume"]>;
|
|
3462
|
+
model?: string;
|
|
3463
|
+
}) {
|
|
3031
3464
|
const s = turn.summary;
|
|
3032
3465
|
return (
|
|
3033
3466
|
<div
|
|
@@ -3060,6 +3493,11 @@ function ExpandedTurnHeader({ turn, onClick }: { turn: TurnMegaRow; onClick: ()
|
|
|
3060
3493
|
{s.toolCalls === 1 ? "" : "s"}
|
|
3061
3494
|
{turn.durationMs !== undefined ? ` · ${formatGap(turn.durationMs)}` : ""}
|
|
3062
3495
|
</span>
|
|
3496
|
+
{coldResume && (
|
|
3497
|
+
<span style={{ marginLeft: "auto" }}>
|
|
3498
|
+
<ColdResumeChip info={coldResume} model={model} />
|
|
3499
|
+
</span>
|
|
3500
|
+
)}
|
|
3063
3501
|
</div>
|
|
3064
3502
|
);
|
|
3065
3503
|
}
|
|
@@ -4227,3 +4665,113 @@ function formatDurationHeader(ms: number): string {
|
|
|
4227
4665
|
const rem = s % 60;
|
|
4228
4666
|
return `${m}m ${rem}s`;
|
|
4229
4667
|
}
|
|
4668
|
+
|
|
4669
|
+
function EntryDayStrip({ entry }: { entry: Entry }) {
|
|
4670
|
+
const fmtDate = new Date(`${entry.local_day}T12:00:00`).toLocaleDateString("en-US", {
|
|
4671
|
+
weekday: "short", month: "short", day: "numeric",
|
|
4672
|
+
});
|
|
4673
|
+
const durMin = Math.round(entry.numbers.active_min);
|
|
4674
|
+
const enr = entry.enrichment;
|
|
4675
|
+
const isPending = enr.status === "pending" || enr.status === "error";
|
|
4676
|
+
const isTrivial = enr.status === "skipped_trivial";
|
|
4677
|
+
|
|
4678
|
+
return (
|
|
4679
|
+
<div
|
|
4680
|
+
style={{
|
|
4681
|
+
border: "1px solid var(--af-border-subtle)",
|
|
4682
|
+
borderRadius: 10,
|
|
4683
|
+
padding: "12px 16px",
|
|
4684
|
+
background: "var(--af-surface)",
|
|
4685
|
+
fontSize: 13,
|
|
4686
|
+
lineHeight: 1.5,
|
|
4687
|
+
}}
|
|
4688
|
+
>
|
|
4689
|
+
<div style={{ display: "flex", alignItems: "center", gap: 10, flexWrap: "wrap" }}>
|
|
4690
|
+
<span
|
|
4691
|
+
style={{
|
|
4692
|
+
fontSize: 12,
|
|
4693
|
+
color: "var(--af-text-tertiary)",
|
|
4694
|
+
display: "inline-flex",
|
|
4695
|
+
alignItems: "center",
|
|
4696
|
+
gap: 4,
|
|
4697
|
+
}}
|
|
4698
|
+
>
|
|
4699
|
+
📅 {fmtDate}
|
|
4700
|
+
</span>
|
|
4701
|
+
{isTrivial ? (
|
|
4702
|
+
<OutcomePill outcome="trivial" size="md" />
|
|
4703
|
+
) : isPending ? (
|
|
4704
|
+
<OutcomePill
|
|
4705
|
+
outcome={null}
|
|
4706
|
+
pending
|
|
4707
|
+
sessionId={entry.session_id}
|
|
4708
|
+
localDay={entry.local_day}
|
|
4709
|
+
size="md"
|
|
4710
|
+
/>
|
|
4711
|
+
) : enr.outcome ? (
|
|
4712
|
+
<OutcomePill outcome={enr.outcome} size="md" />
|
|
4713
|
+
) : null}
|
|
4714
|
+
<span
|
|
4715
|
+
style={{
|
|
4716
|
+
fontFamily: "var(--font-mono)",
|
|
4717
|
+
fontSize: 11,
|
|
4718
|
+
color: "var(--af-text-tertiary)",
|
|
4719
|
+
marginLeft: "auto",
|
|
4720
|
+
}}
|
|
4721
|
+
>
|
|
4722
|
+
{durMin}m active
|
|
4723
|
+
</span>
|
|
4724
|
+
</div>
|
|
4725
|
+
|
|
4726
|
+
{isTrivial && (
|
|
4727
|
+
<div style={{ fontSize: 12, color: "var(--af-text-tertiary)", fontStyle: "italic", marginTop: 8 }}>
|
|
4728
|
+
Warmup — no enrichment generated.
|
|
4729
|
+
</div>
|
|
4730
|
+
)}
|
|
4731
|
+
|
|
4732
|
+
{isPending && (
|
|
4733
|
+
<div style={{ fontSize: 12, color: "var(--af-text-secondary)", marginTop: 8 }}>
|
|
4734
|
+
Click the pending pill to generate this day's digest →
|
|
4735
|
+
</div>
|
|
4736
|
+
)}
|
|
4737
|
+
|
|
4738
|
+
{enr.status === "done" && (
|
|
4739
|
+
<>
|
|
4740
|
+
{enr.brief_summary && (
|
|
4741
|
+
<p style={{ margin: "10px 0 0", color: "var(--af-text)" }}>{enr.brief_summary}</p>
|
|
4742
|
+
)}
|
|
4743
|
+
{(enr.friction_detail || enr.user_instructions.length > 0) && (
|
|
4744
|
+
<div style={{ marginTop: 10, display: "flex", flexDirection: "column", gap: 6 }}>
|
|
4745
|
+
{enr.friction_detail && (
|
|
4746
|
+
<div style={{ fontSize: 12, color: "var(--af-text-secondary)" }}>
|
|
4747
|
+
<span style={{ color: "#ed8936" }}>⚠ </span>
|
|
4748
|
+
{enr.friction_detail}
|
|
4749
|
+
</div>
|
|
4750
|
+
)}
|
|
4751
|
+
{enr.user_instructions.length > 0 && (
|
|
4752
|
+
<details style={{ fontSize: 12, color: "var(--af-text-secondary)" }}>
|
|
4753
|
+
<summary style={{ cursor: "pointer", color: "var(--af-text-tertiary)" }}>
|
|
4754
|
+
Top user instructions ({enr.user_instructions.length})
|
|
4755
|
+
</summary>
|
|
4756
|
+
<ul style={{ margin: "6px 0 0", paddingLeft: 18 }}>
|
|
4757
|
+
{enr.user_instructions.slice(0, 5).map((u, i) => (
|
|
4758
|
+
<li key={i} style={{ marginBottom: 2 }}>{u}</li>
|
|
4759
|
+
))}
|
|
4760
|
+
</ul>
|
|
4761
|
+
</details>
|
|
4762
|
+
)}
|
|
4763
|
+
</div>
|
|
4764
|
+
)}
|
|
4765
|
+
<div style={{ marginTop: 10, fontSize: 11 }}>
|
|
4766
|
+
<Link
|
|
4767
|
+
href={`/digest/${entry.local_day}`}
|
|
4768
|
+
style={{ color: "var(--af-accent)", textDecoration: "none" }}
|
|
4769
|
+
>
|
|
4770
|
+
Open day digest →
|
|
4771
|
+
</Link>
|
|
4772
|
+
</div>
|
|
4773
|
+
</>
|
|
4774
|
+
)}
|
|
4775
|
+
</div>
|
|
4776
|
+
);
|
|
4777
|
+
}
|