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.
Files changed (440) hide show
  1. package/app/apps/web/.next/BUILD_ID +1 -1
  2. package/app/apps/web/.next/app-path-routes-manifest.json +16 -7
  3. package/app/apps/web/.next/build-manifest.json +7 -7
  4. package/app/apps/web/.next/prerender-manifest.json +3 -3
  5. package/app/apps/web/.next/required-server-files.json +2 -1
  6. package/app/apps/web/.next/routes-manifest.json +86 -24
  7. package/app/apps/web/.next/server/app/_global-error/page/build-manifest.json +4 -4
  8. package/app/apps/web/.next/server/app/_global-error/page.js +1 -1
  9. package/app/apps/web/.next/server/app/_global-error/page.js.nft.json +1 -1
  10. package/app/apps/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  11. package/app/apps/web/.next/server/app/_global-error.html +1 -1
  12. package/app/apps/web/.next/server/app/_global-error.rsc +7 -7
  13. package/app/apps/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
  14. package/app/apps/web/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
  15. package/app/apps/web/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
  16. package/app/apps/web/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
  17. package/app/apps/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  18. package/app/apps/web/.next/server/app/_not-found/page/build-manifest.json +4 -4
  19. package/app/apps/web/.next/server/app/_not-found/page.js +5 -4
  20. package/app/apps/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  21. package/app/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  22. package/app/apps/web/.next/server/app/api/digest/day/[date]/route/app-paths-manifest.json +3 -0
  23. package/app/apps/web/.next/server/app/api/digest/day/[date]/route.js +9 -0
  24. package/app/apps/web/.next/server/app/api/{insights/saved/[key] → digest/day/[date]}/route.js.nft.json +1 -1
  25. package/app/apps/web/.next/server/app/api/digest/day/[date]/route_client-reference-manifest.js +3 -0
  26. package/app/apps/web/.next/server/app/api/digest/month/[yearMonth]/route/app-paths-manifest.json +3 -0
  27. package/app/apps/web/.next/server/app/api/digest/month/[yearMonth]/route.js +9 -0
  28. package/app/apps/web/.next/server/app/api/digest/month/[yearMonth]/route.js.nft.json +1 -0
  29. package/app/apps/web/.next/server/app/api/digest/month/[yearMonth]/route_client-reference-manifest.js +3 -0
  30. package/app/apps/web/.next/server/app/api/digest/month-index/route/app-paths-manifest.json +3 -0
  31. package/app/apps/web/.next/server/app/api/digest/month-index/route.js +7 -0
  32. package/app/apps/web/.next/server/app/api/{insights/months-index → digest/month-index}/route.js.nft.json +1 -1
  33. package/app/apps/web/.next/server/app/api/{insights/pdf/[key] → digest/month-index}/route_client-reference-manifest.js +1 -1
  34. package/app/apps/web/.next/server/app/api/digest/week/[startDate]/route/app-paths-manifest.json +3 -0
  35. package/app/apps/web/.next/server/app/api/digest/week/[startDate]/route.js +9 -0
  36. package/app/apps/web/.next/server/app/api/digest/week/[startDate]/route.js.nft.json +1 -0
  37. package/app/apps/web/.next/server/app/api/digest/week/[startDate]/route_client-reference-manifest.js +3 -0
  38. package/app/apps/web/.next/server/app/api/digest/week-index/route/app-paths-manifest.json +3 -0
  39. package/app/apps/web/.next/server/app/api/digest/week-index/route.js +7 -0
  40. package/app/apps/web/.next/server/app/api/{insights/weeks-index → digest/week-index}/route.js.nft.json +1 -1
  41. package/app/apps/web/.next/server/app/api/digest/week-index/route_client-reference-manifest.js +3 -0
  42. package/app/apps/web/.next/server/app/api/jobs/route/app-paths-manifest.json +3 -0
  43. package/app/apps/web/.next/server/app/api/jobs/route.js +6 -0
  44. package/app/apps/web/.next/server/app/api/jobs/route.js.nft.json +1 -0
  45. package/app/apps/web/.next/server/app/api/jobs/route_client-reference-manifest.js +3 -0
  46. package/app/apps/web/.next/server/app/api/runs/[runId]/route/app-paths-manifest.json +3 -0
  47. package/app/apps/web/.next/server/app/api/runs/[runId]/route/build-manifest.json +9 -0
  48. package/app/apps/web/.next/server/app/api/runs/[runId]/route.js +6 -0
  49. package/app/apps/web/.next/server/app/api/{insights/saved → runs/[runId]}/route.js.nft.json +1 -1
  50. package/app/apps/web/.next/server/app/api/runs/[runId]/route_client-reference-manifest.js +3 -0
  51. package/app/apps/web/.next/server/app/api/runs/[runId]/stream/route/app-paths-manifest.json +3 -0
  52. package/app/apps/web/.next/server/app/api/runs/[runId]/stream/route/build-manifest.json +9 -0
  53. package/app/apps/web/.next/server/app/api/runs/[runId]/stream/route/server-reference-manifest.json +4 -0
  54. package/app/apps/web/.next/server/app/api/runs/[runId]/stream/route.js +6 -0
  55. package/app/apps/web/.next/server/app/api/runs/[runId]/stream/route.js.map +5 -0
  56. package/app/apps/web/.next/server/app/api/{insights/pdf/[key] → runs/[runId]/stream}/route.js.nft.json +1 -1
  57. package/app/apps/web/.next/server/app/api/runs/[runId]/stream/route_client-reference-manifest.js +3 -0
  58. package/app/apps/web/.next/server/app/api/runs/route/app-paths-manifest.json +3 -0
  59. package/app/apps/web/.next/server/app/api/runs/route/build-manifest.json +9 -0
  60. package/app/apps/web/.next/server/app/api/runs/route/server-reference-manifest.json +4 -0
  61. package/app/apps/web/.next/server/app/api/runs/route.js +6 -0
  62. package/app/apps/web/.next/server/app/api/runs/route.js.map +5 -0
  63. package/app/apps/web/.next/server/app/api/{insights → runs}/route.js.nft.json +1 -1
  64. package/app/apps/web/.next/server/app/api/runs/route_client-reference-manifest.js +3 -0
  65. package/app/apps/web/.next/server/app/api/settings/route/app-paths-manifest.json +3 -0
  66. package/app/apps/web/.next/server/app/api/settings/route/build-manifest.json +9 -0
  67. package/app/apps/web/.next/server/app/api/settings/route/server-reference-manifest.json +4 -0
  68. package/app/apps/web/.next/server/app/api/settings/route.js +10 -0
  69. package/app/apps/web/.next/server/app/api/settings/route.js.map +5 -0
  70. package/app/apps/web/.next/server/app/api/settings/route.js.nft.json +1 -0
  71. package/app/apps/web/.next/server/app/api/{insights → settings}/route_client-reference-manifest.js +1 -1
  72. package/app/apps/web/.next/server/app/day/[date]/page/app-paths-manifest.json +3 -0
  73. package/app/apps/web/.next/server/app/{insights/print/[key] → day/[date]}/page/build-manifest.json +4 -4
  74. package/app/apps/web/.next/server/app/day/[date]/page/server-reference-manifest.json +4 -0
  75. package/app/apps/web/.next/server/app/day/[date]/page.js +18 -0
  76. package/app/apps/web/.next/server/app/day/[date]/page.js.map +5 -0
  77. package/app/apps/web/.next/server/app/day/[date]/page.js.nft.json +1 -0
  78. package/app/apps/web/.next/server/app/day/[date]/page_client-reference-manifest.js +3 -0
  79. package/app/apps/web/.next/server/app/day/page/app-paths-manifest.json +3 -0
  80. package/app/apps/web/.next/server/app/day/page/build-manifest.json +17 -0
  81. package/app/apps/web/.next/server/app/day/page/next-font-manifest.json +6 -0
  82. package/app/apps/web/.next/server/app/day/page/react-loadable-manifest.json +1 -0
  83. package/app/apps/web/.next/server/app/day/page/server-reference-manifest.json +4 -0
  84. package/app/apps/web/.next/server/app/{insights/print/[key] → day}/page.js +11 -10
  85. package/app/apps/web/.next/server/app/day/page.js.map +5 -0
  86. package/app/apps/web/.next/server/app/day/page.js.nft.json +1 -0
  87. package/app/apps/web/.next/server/app/day/page_client-reference-manifest.js +3 -0
  88. package/app/apps/web/.next/server/app/digest/[date]/page/app-paths-manifest.json +3 -0
  89. package/app/apps/web/.next/server/app/digest/[date]/page/build-manifest.json +17 -0
  90. package/app/apps/web/.next/server/app/digest/[date]/page/next-font-manifest.json +6 -0
  91. package/app/apps/web/.next/server/app/digest/[date]/page/react-loadable-manifest.json +1 -0
  92. package/app/apps/web/.next/server/app/digest/[date]/page/server-reference-manifest.json +4 -0
  93. package/app/apps/web/.next/server/app/digest/[date]/page.js +17 -0
  94. package/app/apps/web/.next/server/app/digest/[date]/page.js.map +5 -0
  95. package/app/apps/web/.next/server/app/digest/[date]/page.js.nft.json +1 -0
  96. package/app/apps/web/.next/server/app/digest/[date]/page_client-reference-manifest.js +3 -0
  97. package/app/apps/web/.next/server/app/digest/page/app-paths-manifest.json +3 -0
  98. package/app/apps/web/.next/server/app/digest/page/build-manifest.json +17 -0
  99. package/app/apps/web/.next/server/app/digest/page/next-font-manifest.json +6 -0
  100. package/app/apps/web/.next/server/app/digest/page/react-loadable-manifest.json +1 -0
  101. package/app/apps/web/.next/server/app/digest/page/server-reference-manifest.json +4 -0
  102. package/app/apps/web/.next/server/app/digest/page.js +17 -0
  103. package/app/apps/web/.next/server/app/digest/page.js.map +5 -0
  104. package/app/apps/web/.next/server/app/digest/page.js.nft.json +1 -0
  105. package/app/apps/web/.next/server/app/digest/page_client-reference-manifest.js +3 -0
  106. package/app/apps/web/.next/server/app/insights/[key]/page/build-manifest.json +4 -4
  107. package/app/apps/web/.next/server/app/insights/[key]/page.js +7 -5
  108. package/app/apps/web/.next/server/app/insights/[key]/page.js.nft.json +1 -1
  109. package/app/apps/web/.next/server/app/insights/[key]/page_client-reference-manifest.js +1 -1
  110. package/app/apps/web/.next/server/app/insights/page/build-manifest.json +4 -4
  111. package/app/apps/web/.next/server/app/insights/page.js +7 -5
  112. package/app/apps/web/.next/server/app/insights/page.js.nft.json +1 -1
  113. package/app/apps/web/.next/server/app/insights/page_client-reference-manifest.js +1 -1
  114. package/app/apps/web/.next/server/app/page/build-manifest.json +4 -4
  115. package/app/apps/web/.next/server/app/page.js +7 -6
  116. package/app/apps/web/.next/server/app/page.js.nft.json +1 -1
  117. package/app/apps/web/.next/server/app/page_client-reference-manifest.js +1 -1
  118. package/app/apps/web/.next/server/app/parallelism/page/build-manifest.json +4 -4
  119. package/app/apps/web/.next/server/app/parallelism/page.js +6 -5
  120. package/app/apps/web/.next/server/app/parallelism/page.js.nft.json +1 -1
  121. package/app/apps/web/.next/server/app/parallelism/page_client-reference-manifest.js +1 -1
  122. package/app/apps/web/.next/server/app/projects/[slug]/page/build-manifest.json +4 -4
  123. package/app/apps/web/.next/server/app/projects/[slug]/page.js +6 -5
  124. package/app/apps/web/.next/server/app/projects/[slug]/page.js.nft.json +1 -1
  125. package/app/apps/web/.next/server/app/projects/[slug]/page_client-reference-manifest.js +1 -1
  126. package/app/apps/web/.next/server/app/projects/page/build-manifest.json +4 -4
  127. package/app/apps/web/.next/server/app/projects/page.js +5 -4
  128. package/app/apps/web/.next/server/app/projects/page.js.nft.json +1 -1
  129. package/app/apps/web/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  130. package/app/apps/web/.next/server/app/runs/page/app-paths-manifest.json +3 -0
  131. package/app/apps/web/.next/server/app/runs/page/build-manifest.json +17 -0
  132. package/app/apps/web/.next/server/app/runs/page/next-font-manifest.json +6 -0
  133. package/app/apps/web/.next/server/app/runs/page/react-loadable-manifest.json +1 -0
  134. package/app/apps/web/.next/server/app/runs/page/server-reference-manifest.json +4 -0
  135. package/app/apps/web/.next/server/app/runs/page.js +17 -0
  136. package/app/apps/web/.next/server/app/runs/page.js.map +5 -0
  137. package/app/apps/web/.next/server/app/runs/page.js.nft.json +1 -0
  138. package/app/apps/web/.next/server/app/runs/page_client-reference-manifest.js +3 -0
  139. package/app/apps/web/.next/server/app/sessions/[id]/page/build-manifest.json +4 -4
  140. package/app/apps/web/.next/server/app/sessions/[id]/page.js +5 -4
  141. package/app/apps/web/.next/server/app/sessions/[id]/page.js.nft.json +1 -1
  142. package/app/apps/web/.next/server/app/sessions/[id]/page_client-reference-manifest.js +1 -1
  143. package/app/apps/web/.next/server/app/sessions/page/build-manifest.json +4 -4
  144. package/app/apps/web/.next/server/app/sessions/page.js +5 -4
  145. package/app/apps/web/.next/server/app/sessions/page.js.nft.json +1 -1
  146. package/app/apps/web/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  147. package/app/apps/web/.next/server/app/settings/page/app-paths-manifest.json +3 -0
  148. package/app/apps/web/.next/server/app/settings/page/build-manifest.json +17 -0
  149. package/app/apps/web/.next/server/app/settings/page/next-font-manifest.json +6 -0
  150. package/app/apps/web/.next/server/app/settings/page/react-loadable-manifest.json +1 -0
  151. package/app/apps/web/.next/server/app/settings/page/server-reference-manifest.json +4 -0
  152. package/app/apps/web/.next/server/app/settings/page.js +18 -0
  153. package/app/apps/web/.next/server/app/settings/page.js.map +5 -0
  154. package/app/apps/web/.next/server/app/settings/page.js.nft.json +1 -0
  155. package/app/apps/web/.next/server/app/settings/page_client-reference-manifest.js +3 -0
  156. package/app/apps/web/.next/server/app/usage/page/build-manifest.json +4 -4
  157. package/app/apps/web/.next/server/app/usage/page.js +6 -5
  158. package/app/apps/web/.next/server/app/usage/page.js.nft.json +1 -1
  159. package/app/apps/web/.next/server/app/usage/page_client-reference-manifest.js +1 -1
  160. package/app/apps/web/.next/server/app-paths-manifest.json +16 -7
  161. package/app/apps/web/.next/server/chunks/02dz_web__next-internal_server_app_api_digest_week_[startDate]_route_actions_0klqqsh.js +3 -0
  162. package/app/apps/web/.next/server/chunks/09og__next-internal_server_app_api_digest_month_[yearMonth]_route_actions_0i4ielu.js +3 -0
  163. package/app/apps/web/.next/server/chunks/[externals]__0o43ejh._.js +3 -0
  164. package/app/apps/web/.next/server/chunks/[root-of-the-server]__0-vgrh1._.js +3 -0
  165. package/app/apps/web/.next/server/chunks/[root-of-the-server]__00n3f9y._.js +3 -0
  166. package/app/apps/web/.next/server/chunks/[root-of-the-server]__02zukjw._.js +3 -0
  167. package/app/apps/web/.next/server/chunks/[root-of-the-server]__067~im1._.js +6 -0
  168. package/app/apps/web/.next/server/chunks/[root-of-the-server]__06b4cj-._.js +3 -0
  169. package/app/apps/web/.next/server/chunks/[root-of-the-server]__0_8zh-i._.js +9 -0
  170. package/app/apps/web/.next/server/chunks/[root-of-the-server]__0e8n_x4._.js +3 -0
  171. package/app/apps/web/.next/server/chunks/[root-of-the-server]__0ej_p3s._.js +9 -0
  172. package/app/apps/web/.next/server/chunks/[root-of-the-server]__0jprdks._.js +9 -0
  173. package/app/apps/web/.next/server/chunks/apps_web__next-internal_server_app_api_digest_day_[date]_route_actions_09sxie5.js +3 -0
  174. package/app/apps/web/.next/server/chunks/apps_web__next-internal_server_app_api_digest_month-index_route_actions_0wldpbu.js +3 -0
  175. package/app/apps/web/.next/server/chunks/apps_web__next-internal_server_app_api_digest_week-index_route_actions_12c2wj2.js +3 -0
  176. package/app/apps/web/.next/server/chunks/apps_web__next-internal_server_app_api_jobs_route_actions_08kx~8-.js +3 -0
  177. package/app/apps/web/.next/server/chunks/apps_web__next-internal_server_app_api_runs_[runId]_route_actions_0dfcghc.js +3 -0
  178. 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
  179. package/app/apps/web/.next/server/chunks/apps_web__next-internal_server_app_api_runs_route_actions_0xyx82f.js +3 -0
  180. package/app/apps/web/.next/server/chunks/apps_web__next-internal_server_app_api_settings_route_actions_0.xv7sx.js +3 -0
  181. package/app/apps/web/.next/server/chunks/node_modules_next_036my~r._.js +49 -0
  182. package/app/apps/web/.next/server/chunks/packages_0e7q9u_._.js +3 -0
  183. package/app/apps/web/.next/server/chunks/packages_0n6p2ot._.js +3 -0
  184. package/app/apps/web/.next/server/chunks/packages_entries_dist_node_0bckr7-.js +379 -0
  185. package/app/apps/web/.next/server/chunks/packages_parser_dist_fs_0bc7ptm.js +1 -1
  186. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0-1_njm._.js +3 -0
  187. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0-94ji~._.js +3 -0
  188. package/app/apps/web/.next/server/chunks/ssr/{[root-of-the-server]__13xpdx0._.js → [root-of-the-server]__03uoeiw._.js} +2 -2
  189. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0_6.inc._.js +1 -1
  190. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0d~2~le._.js +8 -0
  191. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0gio_ck._.js +1 -1
  192. package/app/apps/web/.next/server/chunks/ssr/{[root-of-the-server]__08.d5ia._.js → [root-of-the-server]__0jdyefm._.js} +10 -10
  193. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0ln9jsw._.js +3 -0
  194. package/app/apps/web/.next/server/chunks/ssr/{[root-of-the-server]__0z45d0g._.js → [root-of-the-server]__0lz4a~g._.js} +2 -48
  195. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0o1_g.~._.js +3 -0
  196. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0r4tks8._.js +3 -0
  197. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0rvzdnx._.js +3 -0
  198. package/app/apps/web/.next/server/chunks/ssr/{[root-of-the-server]__0euu8sa._.js → [root-of-the-server]__0u39afl._.js} +2 -2
  199. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0u5d7de._.js +12 -0
  200. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0w52fbc._.js +3 -3
  201. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0wwa6gh._.js +3 -0
  202. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0xy1qim._.js +3 -0
  203. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0~_8vff._.js +3 -0
  204. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__10srpu0._.js +3 -0
  205. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__11v.eqw._.js +1 -1
  206. package/app/apps/web/.next/server/chunks/ssr/_02s1n-x._.js +8 -0
  207. package/app/apps/web/.next/server/chunks/ssr/_0fjbf--._.js +3 -0
  208. package/app/apps/web/.next/server/chunks/ssr/_0jw2sm7._.js +3 -0
  209. package/app/apps/web/.next/server/chunks/ssr/_0wj750k._.js +3 -0
  210. package/app/apps/web/.next/server/chunks/ssr/_0woap-3._.js +1 -1
  211. package/app/apps/web/.next/server/chunks/ssr/{_0xies90._.js → _0xu2pvc._.js} +2 -2
  212. package/app/apps/web/.next/server/chunks/ssr/apps_web__next-internal_server_app_day_[date]_page_actions_0u2kxb..js +3 -0
  213. package/app/apps/web/.next/server/chunks/ssr/apps_web__next-internal_server_app_day_page_actions_1042maj.js +3 -0
  214. package/app/apps/web/.next/server/chunks/ssr/apps_web__next-internal_server_app_digest_[date]_page_actions_0olu967.js +3 -0
  215. package/app/apps/web/.next/server/chunks/ssr/apps_web__next-internal_server_app_digest_page_actions_0bl.eil.js +3 -0
  216. package/app/apps/web/.next/server/chunks/ssr/apps_web__next-internal_server_app_runs_page_actions_0485qy7.js +3 -0
  217. package/app/apps/web/.next/server/chunks/ssr/apps_web__next-internal_server_app_settings_page_actions_0f6epye.js +3 -0
  218. package/app/apps/web/.next/server/chunks/ssr/apps_web_app_day_[date]_day-view_tsx_0wjoe1u._.js +3 -0
  219. package/app/apps/web/.next/server/chunks/ssr/apps_web_app_settings_ai-features-form_tsx_01p699p._.js +3 -0
  220. package/app/apps/web/.next/server/chunks/ssr/apps_web_components_0b-4-4j._.js +1 -1
  221. package/app/apps/web/.next/server/chunks/ssr/apps_web_components_0ly1xes._.js +6 -0
  222. package/app/apps/web/.next/server/chunks/ssr/apps_web_components_0txtsv5._.js +16 -0
  223. package/app/apps/web/.next/server/chunks/ssr/apps_web_components_0xs658s._.js +10 -0
  224. package/app/apps/web/.next/server/chunks/ssr/apps_web_components_runs-live-board_tsx_0r6dkdq._.js +3 -0
  225. package/app/apps/web/.next/server/chunks/ssr/apps_web_components_usage-charts-dashboard_tsx_0bgr_uv._.js +1 -1
  226. package/app/apps/web/.next/server/chunks/ssr/apps_web_lib_usage-data_ts_0xtv99n._.js +3 -0
  227. package/app/apps/web/.next/server/chunks/ssr/node_modules_0i2xw~e._.js +3 -0
  228. package/app/apps/web/.next/server/chunks/ssr/node_modules_next_dist_0e1izl_._.js +1 -1
  229. package/app/apps/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0d3d4wn.js +4 -0
  230. package/app/apps/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0edz1ko.js +4 -0
  231. package/app/apps/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0eq.n-n.js +4 -0
  232. 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
  233. package/app/apps/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0nd5zu0.js +4 -0
  234. package/app/apps/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_11j1qy0.js +4 -0
  235. package/app/apps/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_12n1lw_.js +1 -1
  236. package/app/apps/web/.next/server/chunks/ssr/packages_entries_dist_node_0_271yr.js +3 -0
  237. package/app/apps/web/.next/server/chunks/ssr/packages_parser_dist_0-jvt~a._.js +1 -1
  238. package/app/apps/web/.next/server/functions-config-manifest.json +11 -6
  239. package/app/apps/web/.next/server/middleware-build-manifest.js +7 -7
  240. package/app/apps/web/.next/server/pages/500.html +1 -1
  241. package/app/apps/web/.next/server/server-reference-manifest.js +1 -1
  242. package/app/apps/web/.next/server/server-reference-manifest.json +1 -1
  243. package/app/apps/web/.next/static/chunks/0-yc2_pjxwwuq.js +1 -0
  244. package/app/apps/web/.next/static/chunks/0257pdz1-imal.js +2 -0
  245. package/app/apps/web/.next/static/chunks/05m.oz3kmf1p7.js +1 -0
  246. package/app/apps/web/.next/static/chunks/{0pqt~8bl3ukh4.js → 073081qv4uyn8.js} +1 -1
  247. package/app/apps/web/.next/static/chunks/{0018dy-m-kusj.js → 07lbm-sdh9c2j.js} +1 -1
  248. package/app/apps/web/.next/static/chunks/0858bgw2i4vob.js +1 -0
  249. package/app/apps/web/.next/static/chunks/0_7303jr0sf0w.js +10 -0
  250. package/app/apps/web/.next/static/chunks/0byz8fqw.exef.js +1 -0
  251. package/app/apps/web/.next/static/chunks/0coa1800xqgfj.js +1 -0
  252. package/app/apps/web/.next/static/chunks/0fs3gxea5h0s3.css +1 -0
  253. package/app/apps/web/.next/static/chunks/0k1psab.bybh9.js +14 -0
  254. package/app/apps/web/.next/static/chunks/0k9pksi_i.odf.js +1 -0
  255. package/app/apps/web/.next/static/chunks/0m62vx92~0_0d.js +1 -0
  256. package/app/apps/web/.next/static/chunks/0mc8aa8z.0-5l.js +8 -0
  257. package/app/apps/web/.next/static/chunks/0mykrrv810ra-.js +31 -0
  258. package/app/apps/web/.next/static/chunks/0o9ayt8sknubd.js +1 -0
  259. package/app/apps/web/.next/static/chunks/0osdgl2.9cl1q.js +6 -0
  260. package/app/apps/web/.next/static/chunks/0xfu09fn_358k.js +4 -0
  261. package/app/apps/web/.next/static/chunks/171za22fv684..js +6 -0
  262. package/app/apps/web/.next/static/chunks/17u2ww8ya5dv1.js +6 -0
  263. package/app/apps/web/.next/static/chunks/{turbopack-169w-1._23ra_.js → turbopack-0_p36yduv.waj.js} +1 -1
  264. package/app/apps/web/app/api/digest/day/[date]/route.ts +152 -0
  265. package/app/apps/web/app/api/digest/month/[yearMonth]/route.ts +147 -0
  266. package/app/apps/web/app/api/digest/month-index/route.ts +103 -0
  267. package/app/apps/web/app/api/digest/week/[startDate]/route.ts +149 -0
  268. package/app/apps/web/app/api/{insights/weeks-index → digest/week-index}/route.ts +45 -33
  269. package/app/apps/web/app/api/jobs/route.ts +8 -0
  270. package/app/apps/web/app/api/runs/[runId]/route.ts +64 -0
  271. package/app/apps/web/app/api/runs/[runId]/stream/route.ts +154 -0
  272. package/app/apps/web/app/api/runs/route.ts +266 -0
  273. package/app/apps/web/app/api/settings/route.ts +35 -0
  274. package/app/apps/web/app/day/[date]/day-view.tsx +193 -0
  275. package/app/apps/web/app/day/[date]/page.tsx +175 -0
  276. package/app/apps/web/app/day/page.tsx +8 -0
  277. package/app/apps/web/app/digest/[date]/page.tsx +15 -0
  278. package/app/apps/web/app/digest/page.tsx +7 -0
  279. package/app/apps/web/app/insights/[key]/page.tsx +106 -48
  280. package/app/apps/web/app/insights/page.tsx +133 -3
  281. package/app/apps/web/app/layout.tsx +23 -3
  282. package/app/apps/web/app/page.tsx +33 -4
  283. package/app/apps/web/app/parallelism/gantt-chart.tsx +67 -1
  284. package/app/apps/web/app/parallelism/page.tsx +8 -278
  285. package/app/apps/web/app/projects/[slug]/page.tsx +153 -0
  286. package/app/apps/web/app/projects/page.tsx +49 -4
  287. package/app/apps/web/app/projects/projects-view.tsx +79 -68
  288. package/app/apps/web/app/runs/page.tsx +21 -0
  289. package/app/apps/web/app/sessions/[id]/page.tsx +12 -1
  290. package/app/apps/web/app/sessions/[id]/session-view.tsx +569 -21
  291. package/app/apps/web/app/sessions/page.tsx +19 -3
  292. package/app/apps/web/app/sessions/sessions-grid.tsx +172 -131
  293. package/app/apps/web/app/settings/ai-features-form.tsx +45 -0
  294. package/app/apps/web/app/settings/page.tsx +20 -0
  295. package/app/apps/web/app/usage/page.tsx +45 -3
  296. package/app/apps/web/components/auto-generate-yesterday.tsx +96 -0
  297. package/app/apps/web/components/backfill-drawer.tsx +309 -0
  298. package/app/apps/web/components/dashboard-view.tsx +4 -2
  299. package/app/apps/web/components/date-nav.tsx +385 -0
  300. package/app/apps/web/components/day-digest-view.tsx +180 -0
  301. package/app/apps/web/components/day-digest.tsx +489 -0
  302. package/app/apps/web/components/flag-chip.tsx +54 -0
  303. package/app/apps/web/components/goal-bar.tsx +63 -0
  304. package/app/apps/web/components/heatmap.tsx +78 -1
  305. package/app/apps/web/components/helpfulness-sparkline.tsx +82 -0
  306. package/app/apps/web/components/insights-history.tsx +211 -0
  307. package/app/apps/web/components/insights-top-bar.tsx +216 -0
  308. package/app/apps/web/components/job-queue-widget.tsx +274 -0
  309. package/app/apps/web/components/live-sessions-widget.tsx +38 -3
  310. package/app/apps/web/components/month-digest-view.tsx +138 -0
  311. package/app/apps/web/components/month-digest.tsx +216 -0
  312. package/app/apps/web/components/outcome-mix-row.tsx +37 -0
  313. package/app/apps/web/components/outcome-pill.tsx +101 -0
  314. package/app/apps/web/components/previous-cycles-trend.tsx +155 -0
  315. package/app/apps/web/components/recent-days-panel.tsx +83 -0
  316. package/app/apps/web/components/runs-live-board.tsx +513 -0
  317. package/app/apps/web/components/sidebar.tsx +38 -4
  318. package/app/apps/web/components/usage-chart-range.tsx +58 -6
  319. package/app/apps/web/components/usage-chart.tsx +94 -7
  320. package/app/apps/web/components/usage-charts-dashboard.tsx +20 -1
  321. package/app/apps/web/components/week-digest-view.tsx +226 -0
  322. package/app/apps/web/components/week-digest.tsx +2128 -0
  323. package/app/apps/web/components/yesterday-hero.tsx +110 -0
  324. package/app/apps/web/lib/auto-week-fire.ts +37 -0
  325. package/app/apps/web/lib/calibration-data.ts +171 -0
  326. package/app/apps/web/lib/entries-index.ts +174 -0
  327. package/app/apps/web/lib/entries.ts +72 -0
  328. package/app/apps/web/lib/inflight-coalesce.test.ts +43 -0
  329. package/app/apps/web/lib/inflight-coalesce.ts +19 -0
  330. package/app/apps/web/lib/jobs.ts +170 -0
  331. package/app/apps/web/lib/usage-data.ts +37 -0
  332. package/app/apps/web/lib/validate-settings.test.ts +25 -0
  333. package/app/apps/web/lib/validate-settings.ts +9 -0
  334. package/app/apps/web/next.config.ts +1 -1
  335. package/app/apps/web/package.json +4 -2
  336. package/app/apps/web/server.js +1 -1
  337. package/app/apps/web/tsconfig.tsbuildinfo +1 -1
  338. package/app/apps/web/vitest.config.ts +9 -0
  339. package/dist/daemon-worker.js +1758 -713
  340. package/dist/index.js +11308 -1888
  341. package/package.json +4 -1
  342. package/app/apps/web/.next/server/app/api/insights/months-index/route/app-paths-manifest.json +0 -3
  343. package/app/apps/web/.next/server/app/api/insights/months-index/route.js +0 -7
  344. package/app/apps/web/.next/server/app/api/insights/months-index/route_client-reference-manifest.js +0 -3
  345. package/app/apps/web/.next/server/app/api/insights/pdf/[key]/route/app-paths-manifest.json +0 -3
  346. package/app/apps/web/.next/server/app/api/insights/pdf/[key]/route.js +0 -6
  347. package/app/apps/web/.next/server/app/api/insights/route/app-paths-manifest.json +0 -3
  348. package/app/apps/web/.next/server/app/api/insights/route.js +0 -8
  349. package/app/apps/web/.next/server/app/api/insights/saved/[key]/route/app-paths-manifest.json +0 -3
  350. package/app/apps/web/.next/server/app/api/insights/saved/[key]/route.js +0 -6
  351. package/app/apps/web/.next/server/app/api/insights/saved/[key]/route_client-reference-manifest.js +0 -3
  352. package/app/apps/web/.next/server/app/api/insights/saved/route/app-paths-manifest.json +0 -3
  353. package/app/apps/web/.next/server/app/api/insights/saved/route.js +0 -6
  354. package/app/apps/web/.next/server/app/api/insights/saved/route_client-reference-manifest.js +0 -3
  355. package/app/apps/web/.next/server/app/api/insights/weeks-index/route/app-paths-manifest.json +0 -3
  356. package/app/apps/web/.next/server/app/api/insights/weeks-index/route.js +0 -7
  357. package/app/apps/web/.next/server/app/api/insights/weeks-index/route_client-reference-manifest.js +0 -3
  358. package/app/apps/web/.next/server/app/insights/print/[key]/page/app-paths-manifest.json +0 -3
  359. package/app/apps/web/.next/server/app/insights/print/[key]/page.js.nft.json +0 -1
  360. package/app/apps/web/.next/server/app/insights/print/[key]/page_client-reference-manifest.js +0 -3
  361. 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
  362. package/app/apps/web/.next/server/chunks/02dz_web__next-internal_server_app_api_insights_saved_[key]_route_actions_0a5j9yw.js +0 -3
  363. package/app/apps/web/.next/server/chunks/02dz_web__next-internal_server_app_api_insights_weeks-index_route_actions_0hh-1c7.js +0 -3
  364. package/app/apps/web/.next/server/chunks/[root-of-the-server]__0.hmj0z._.js +0 -3
  365. package/app/apps/web/.next/server/chunks/[root-of-the-server]__01h_g-p._.js +0 -3
  366. package/app/apps/web/.next/server/chunks/[root-of-the-server]__0nh-z10._.js +0 -3
  367. package/app/apps/web/.next/server/chunks/[root-of-the-server]__0ri7q~r._.js +0 -3
  368. package/app/apps/web/.next/server/chunks/[root-of-the-server]__0rr1~~x._.js +0 -3
  369. package/app/apps/web/.next/server/chunks/[root-of-the-server]__0s0gv.0._.js +0 -3
  370. package/app/apps/web/.next/server/chunks/apps_web__next-internal_server_app_api_insights_pdf_[key]_route_actions_0lu-lnx.js +0 -3
  371. package/app/apps/web/.next/server/chunks/apps_web__next-internal_server_app_api_insights_route_actions_0h8l5lz.js +0 -3
  372. package/app/apps/web/.next/server/chunks/apps_web__next-internal_server_app_api_insights_saved_route_actions_13rlblw.js +0 -3
  373. package/app/apps/web/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_00t2xj6.js +0 -68
  374. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0.tsxpj._.js +0 -3
  375. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__00z7zlm._.js +0 -3
  376. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__08pen0k._.js +0 -3
  377. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0b323~k._.js +0 -8
  378. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0gx-4qa._.js +0 -3
  379. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0wv27wt._.js +0 -3
  380. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__13itnvx._.js +0 -3
  381. package/app/apps/web/.next/server/chunks/ssr/_09n75_5._.js +0 -8
  382. package/app/apps/web/.next/server/chunks/ssr/_0r~__0v._.js +0 -12
  383. package/app/apps/web/.next/server/chunks/ssr/apps_web__next-internal_server_app_insights_print_[key]_page_actions_0a853fw.js +0 -3
  384. package/app/apps/web/.next/server/chunks/ssr/apps_web_app_parallelism_08vub.0._.js +0 -3
  385. package/app/apps/web/.next/server/chunks/ssr/apps_web_components_06j3c.0._.js +0 -8
  386. package/app/apps/web/.next/server/chunks/ssr/apps_web_components_0bbo_pd._.js +0 -8
  387. package/app/apps/web/.next/server/chunks/ssr/apps_web_components_insight-report_tsx_13q2a-c._.js +0 -12
  388. package/app/apps/web/.next/server/chunks/ssr/apps_web_components_insights-view_tsx_11730ta._.js +0 -6
  389. package/app/apps/web/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_0nqz8dw._.js +0 -3
  390. package/app/apps/web/.next/server/chunks/ssr/node_modules_next_dist_0t-hj0x._.js +0 -3
  391. package/app/apps/web/.next/server/chunks/ssr/packages_parser_dist_analytics_0k4dgst.js +0 -3
  392. package/app/apps/web/.next/static/chunks/028_pmk40b69_.js +0 -6
  393. package/app/apps/web/.next/static/chunks/03.mv4y4.w-vb.js +0 -6
  394. package/app/apps/web/.next/static/chunks/03_7xtpi9sv4g.js +0 -4
  395. package/app/apps/web/.next/static/chunks/03g5dw5eskotd.js +0 -6
  396. package/app/apps/web/.next/static/chunks/063oimt30jeo9.js +0 -10
  397. package/app/apps/web/.next/static/chunks/08c1pcrocqq5s.js +0 -6
  398. package/app/apps/web/.next/static/chunks/0e-wrhqh4h3r5.js +0 -2
  399. package/app/apps/web/.next/static/chunks/0fc6dk2qtokwh.js +0 -1
  400. package/app/apps/web/.next/static/chunks/0i7er7_bfab36.js +0 -10
  401. package/app/apps/web/.next/static/chunks/0ipytyi01h0ta.js +0 -1
  402. package/app/apps/web/.next/static/chunks/0lsznd4_avzhv.js +0 -6
  403. package/app/apps/web/.next/static/chunks/0lty3v_i9mde7.js +0 -1
  404. package/app/apps/web/.next/static/chunks/0vekjjj4pidlz.css +0 -1
  405. package/app/apps/web/.next/static/chunks/137uw2-qbro07.js +0 -31
  406. package/app/apps/web/app/api/insights/months-index/route.ts +0 -80
  407. package/app/apps/web/app/api/insights/pdf/[key]/route.ts +0 -45
  408. package/app/apps/web/app/api/insights/route.ts +0 -508
  409. package/app/apps/web/app/api/insights/saved/[key]/route.ts +0 -11
  410. package/app/apps/web/app/api/insights/saved/route.ts +0 -9
  411. package/app/apps/web/app/insights/print/[key]/page.tsx +0 -73
  412. package/app/apps/web/components/insight-report.tsx +0 -1031
  413. package/app/apps/web/components/insights-view.tsx +0 -647
  414. package/app/apps/web/lib/ai/insights-prompt.ts +0 -71
  415. package/app/apps/web/lib/ai/saved-reports.ts +0 -83
  416. /package/app/apps/web/.next/server/app/api/{insights/months-index → digest/day/[date]}/route/build-manifest.json +0 -0
  417. /package/app/apps/web/.next/server/app/api/{insights/months-index → digest/day/[date]}/route/server-reference-manifest.json +0 -0
  418. /package/app/apps/web/.next/server/app/api/{insights/months-index → digest/day/[date]}/route.js.map +0 -0
  419. /package/app/apps/web/.next/server/app/api/{insights → digest/month/[yearMonth]}/route/build-manifest.json +0 -0
  420. /package/app/apps/web/.next/server/app/api/{insights → digest/month/[yearMonth]}/route/server-reference-manifest.json +0 -0
  421. /package/app/apps/web/.next/server/app/api/{insights → digest/month/[yearMonth]}/route.js.map +0 -0
  422. /package/app/apps/web/.next/server/app/api/{insights/pdf/[key] → digest/month-index}/route/build-manifest.json +0 -0
  423. /package/app/apps/web/.next/server/app/api/{insights/pdf/[key] → digest/month-index}/route/server-reference-manifest.json +0 -0
  424. /package/app/apps/web/.next/server/app/api/{insights/pdf/[key] → digest/month-index}/route.js.map +0 -0
  425. /package/app/apps/web/.next/server/app/api/{insights/saved → digest/week/[startDate]}/route/build-manifest.json +0 -0
  426. /package/app/apps/web/.next/server/app/api/{insights/saved → digest/week/[startDate]}/route/server-reference-manifest.json +0 -0
  427. /package/app/apps/web/.next/server/app/api/{insights/saved → digest/week/[startDate]}/route.js.map +0 -0
  428. /package/app/apps/web/.next/server/app/api/{insights/saved/[key] → digest/week-index}/route/build-manifest.json +0 -0
  429. /package/app/apps/web/.next/server/app/api/{insights/saved/[key] → digest/week-index}/route/server-reference-manifest.json +0 -0
  430. /package/app/apps/web/.next/server/app/api/{insights/saved/[key] → digest/week-index}/route.js.map +0 -0
  431. /package/app/apps/web/.next/server/app/api/{insights/weeks-index → jobs}/route/build-manifest.json +0 -0
  432. /package/app/apps/web/.next/server/app/api/{insights/weeks-index → jobs}/route/server-reference-manifest.json +0 -0
  433. /package/app/apps/web/.next/server/app/api/{insights/weeks-index → jobs}/route.js.map +0 -0
  434. /package/app/apps/web/.next/server/app/{insights/print/[key]/page → api/runs/[runId]/route}/server-reference-manifest.json +0 -0
  435. /package/app/apps/web/.next/server/app/{insights/print/[key]/page.js.map → api/runs/[runId]/route.js.map} +0 -0
  436. /package/app/apps/web/.next/server/app/{insights/print/[key] → day/[date]}/page/next-font-manifest.json +0 -0
  437. /package/app/apps/web/.next/server/app/{insights/print/[key] → day/[date]}/page/react-loadable-manifest.json +0 -0
  438. /package/app/apps/web/.next/static/{G_4ofKI9v9ARC_lb9JILZ → 8tTWPvUhtatZEoocIhamh}/_buildManifest.js +0 -0
  439. /package/app/apps/web/.next/static/{G_4ofKI9v9ARC_lb9JILZ → 8tTWPvUhtatZEoocIhamh}/_clientMiddlewareManifest.js +0 -0
  440. /package/app/apps/web/.next/static/{G_4ofKI9v9ARC_lb9JILZ → 8tTWPvUhtatZEoocIhamh}/_ssgManifest.js +0 -0
@@ -1,286 +1,16 @@
1
- /**
2
- * Timeline Gantt chart — visualize how sessions overlap per day.
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 TimelinePage({
6
+ export default async function LegacyTimelineRedirect({
25
7
  searchParams,
26
8
  }: {
27
- searchParams: Promise<{ date?: string; range?: string }>;
9
+ searchParams: Promise<{ date?: string }>;
28
10
  }) {
29
11
  const { date: dateParam } = await searchParams;
30
-
31
- // Default to today.
32
- const today = toLocalDay(Date.now());
33
- const date = dateParam && /^\d{4}-\d{2}-\d{2}$/.test(dateParam) ? dateParam : today;
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 { ProjectsView } from "./projects-view";
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 projects={projects} />
71
+ <ProjectsView rows={rows} />
27
72
  )}
28
73
  </div>
29
74
  );