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
@@ -0,0 +1,7 @@
1
+ import { redirect } from "next/navigation";
2
+
3
+ export const dynamic = "force-dynamic";
4
+
5
+ export default function LegacyDigestIndexRedirect() {
6
+ redirect("/day");
7
+ }
@@ -1,59 +1,117 @@
1
- /**
2
- * Saved-report viewer. Deep-linkable, bookmarkable, server-rendered.
3
- *
4
- * /insights → history + picker (client-state machine)
5
- * /insights/[key] → this page — reads the saved JSON off disk
6
- * /insights/print/[key] → headless-Chrome target for PDF export
7
- */
8
- import Link from "next/link";
9
1
  import { notFound } from "next/navigation";
10
- import { ArrowLeft } from "lucide-react";
11
- import { InsightReport } from "@/components/insight-report";
12
- import { getSavedReport } from "@/lib/ai/saved-reports";
2
+ import {
3
+ readSettings, readWeekDigest, readMonthDigest,
4
+ getCurrentWeekDigestFromCache, getCurrentMonthDigestFromCache,
5
+ } from "@claude-lens/entries/node";
6
+ import { WeekDigestView } from "@/components/week-digest-view";
7
+ import { MonthDigestView } from "@/components/month-digest-view";
8
+ import { InsightsTopBar } from "@/components/insights-top-bar";
9
+ import { currentWeekMonday, currentYearMonth } from "@/lib/entries";
13
10
 
14
11
  export const dynamic = "force-dynamic";
12
+ export const runtime = "nodejs";
13
+
14
+ const WEEK_KEY = /^week-(\d{4}-\d{2}-\d{2})$/;
15
+ const MONTH_KEY = /^month-(\d{4}-\d{2})$/;
15
16
 
16
17
  export default async function SavedInsightPage({
17
18
  params,
18
19
  }: { params: Promise<{ key: string }> }) {
19
20
  const { key } = await params;
20
- const report = await getSavedReport(key);
21
- if (!report) notFound();
22
-
23
- return (
24
- <div>
25
- <div className="no-print" style={topNavStyle}>
26
- <Link href="/insights" style={backBtnStyle}>
27
- <ArrowLeft size={12} /> Reports
28
- </Link>
29
- <span style={{ fontSize: 11, color: "var(--af-text-tertiary)", fontFamily: "var(--font-mono)" }}>
30
- saved · key: {key}
31
- </span>
21
+ const aiOn = readSettings().ai_features.enabled;
22
+
23
+ const weekMatch = WEEK_KEY.exec(key);
24
+ if (weekMatch) {
25
+ const monday = weekMatch[1]!;
26
+ const cached = monday === currentWeekMonday()
27
+ ? getCurrentWeekDigestFromCache(monday, Date.now())
28
+ : readWeekDigest(monday);
29
+
30
+ const prev = shiftMonday(monday, -7);
31
+ const nextRaw = shiftMonday(monday, +7);
32
+ const today = currentWeekMonday();
33
+ const nextMonday = nextRaw > today ? null : nextRaw;
34
+ const priorDigest = readWeekDigest(prev);
35
+ const prevCached = !!priorDigest;
36
+ const nextCached = nextMonday ? !!readWeekDigest(nextMonday) : false;
37
+
38
+ return (
39
+ <div>
40
+ <InsightsTopBar
41
+ scope="week"
42
+ currentLabel={`Week of ${monday}`}
43
+ rangeLabel={shortRangeMonday(monday)}
44
+ prev={{ key: `week-${prev}`, label: shortLabelMonday(prev), cached: prevCached }}
45
+ next={nextMonday ? { key: `week-${nextMonday}`, label: shortLabelMonday(nextMonday), cached: nextCached } : null}
46
+ />
47
+ <WeekDigestView initial={cached} monday={monday} aiEnabled={aiOn} prior={priorDigest} />
48
+ </div>
49
+ );
50
+ }
51
+
52
+ const monthMatch = MONTH_KEY.exec(key);
53
+ if (monthMatch) {
54
+ const yearMonth = monthMatch[1]!;
55
+ const cached = yearMonth === currentYearMonth()
56
+ ? getCurrentMonthDigestFromCache(yearMonth, Date.now())
57
+ : readMonthDigest(yearMonth);
58
+
59
+ const prev = shiftYearMonth(yearMonth, -1);
60
+ const nextRaw = shiftYearMonth(yearMonth, +1);
61
+ const today = currentYearMonth();
62
+ const nextYM = nextRaw > today ? null : nextRaw;
63
+ const prevCached = !!readMonthDigest(prev);
64
+ const nextCached = nextYM ? !!readMonthDigest(nextYM) : false;
65
+
66
+ return (
67
+ <div>
68
+ <InsightsTopBar
69
+ scope="month"
70
+ currentLabel={shortLabelMonth(yearMonth)}
71
+ prev={{ key: `month-${prev}`, label: shortLabelMonth(prev), cached: prevCached }}
72
+ next={nextYM ? { key: `month-${nextYM}`, label: shortLabelMonth(nextYM), cached: nextCached } : null}
73
+ />
74
+ <MonthDigestView initial={cached} yearMonth={yearMonth} aiEnabled={aiOn} />
32
75
  </div>
33
- <InsightReport data={report} savedKey={key} />
34
- </div>
35
- );
76
+ );
77
+ }
78
+
79
+ notFound();
80
+ }
81
+
82
+ function shortRangeMonday(monday: string): string {
83
+ const start = new Date(`${monday}T12:00:00`);
84
+ const end = new Date(start);
85
+ end.setDate(start.getDate() + 6);
86
+ const fmt = (d: Date) => d.toLocaleDateString("en-US", { month: "short", day: "numeric" });
87
+ return `${fmt(start)} — ${fmt(end)}`;
88
+ }
89
+
90
+ function shiftMonday(monday: string, days: number): string {
91
+ const d = new Date(`${monday}T00:00:00`);
92
+ d.setDate(d.getDate() + days);
93
+ const y = d.getFullYear();
94
+ const m = String(d.getMonth() + 1).padStart(2, "0");
95
+ const day = String(d.getDate()).padStart(2, "0");
96
+ return `${y}-${m}-${day}`;
97
+ }
98
+
99
+ function shiftYearMonth(yearMonth: string, months: number): string {
100
+ const [y, m] = yearMonth.split("-");
101
+ const d = new Date(Number(y), Number(m) - 1 + months, 1);
102
+ const ny = d.getFullYear();
103
+ const nm = String(d.getMonth() + 1).padStart(2, "0");
104
+ return `${ny}-${nm}`;
105
+ }
106
+
107
+ function shortLabelMonday(monday: string): string {
108
+ const d = new Date(`${monday}T12:00:00`);
109
+ return d.toLocaleDateString("en-US", { month: "short", day: "numeric" });
110
+ }
111
+
112
+ function shortLabelMonth(yearMonth: string): string {
113
+ const [y, m] = yearMonth.split("-");
114
+ const d = new Date(Number(y), Number(m) - 1, 1);
115
+ return d.toLocaleDateString("en-US", { month: "short", year: "2-digit" });
36
116
  }
37
117
 
38
- const topNavStyle: React.CSSProperties = {
39
- maxWidth: 980,
40
- margin: "0 auto",
41
- padding: "16px 44px 0",
42
- display: "flex",
43
- alignItems: "center",
44
- gap: 12,
45
- };
46
-
47
- const backBtnStyle: React.CSSProperties = {
48
- display: "inline-flex",
49
- alignItems: "center",
50
- gap: 6,
51
- padding: "7px 12px",
52
- border: "1px solid var(--af-border)",
53
- borderRadius: 8,
54
- background: "var(--af-surface)",
55
- color: "var(--af-text)",
56
- fontSize: 12,
57
- fontWeight: 500,
58
- textDecoration: "none",
59
- };
@@ -1,7 +1,137 @@
1
- import { InsightsView } from "@/components/insights-view";
1
+ import Link from "next/link";
2
+ import { readSettings, readWeekDigest } from "@claude-lens/entries/node";
3
+ import { lastCompletedWeekMonday, currentWeekMonday, listEntriesForDay } from "@/lib/entries";
4
+ import { shouldAutoFireWeek } from "@/lib/auto-week-fire";
5
+ import { WeekDigestView } from "@/components/week-digest-view";
6
+ import { InsightsTopBar } from "@/components/insights-top-bar";
2
7
 
3
8
  export const dynamic = "force-dynamic";
9
+ export const runtime = "nodejs";
4
10
 
5
- export default function InsightsPage() {
6
- return <InsightsView />;
11
+ function priorMonday(monday: string): string {
12
+ const d = new Date(`${monday}T00:00:00`);
13
+ d.setDate(d.getDate() - 7);
14
+ return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`;
7
15
  }
16
+
17
+ function weekDates(monday: string): string[] {
18
+ const out: string[] = [];
19
+ const start = new Date(`${monday}T00:00:00`);
20
+ for (let i = 0; i < 7; i++) {
21
+ const d = new Date(start);
22
+ d.setDate(start.getDate() + i);
23
+ out.push(`${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`);
24
+ }
25
+ return out;
26
+ }
27
+
28
+ function hasAnyEntries(monday: string): boolean {
29
+ for (const d of weekDates(monday)) {
30
+ if (listEntriesForDay(d).length > 0) return true;
31
+ }
32
+ return false;
33
+ }
34
+
35
+ function shortDateRange(monday: string): string {
36
+ const start = new Date(`${monday}T12:00:00`);
37
+ const end = new Date(start);
38
+ end.setDate(start.getDate() + 6);
39
+ const fmt = (d: Date) => d.toLocaleDateString("en-US", { month: "short", day: "numeric" });
40
+ return `${fmt(start)} — ${fmt(end)}`;
41
+ }
42
+
43
+ export default async function InsightsPage() {
44
+ const settings = readSettings();
45
+ const aiOn = settings.ai_features.enabled;
46
+ const lastWeek = lastCompletedWeekMonday();
47
+ const cached = readWeekDigest(lastWeek);
48
+ const prior = readWeekDigest(priorMonday(lastWeek));
49
+ const hasData = !!cached || hasAnyEntries(lastWeek);
50
+
51
+ const autoFire = aiOn && !cached && shouldAutoFireWeek(lastWeek);
52
+
53
+ // Prev/next nav targets — prev is the week before lastWeek; next is the
54
+ // current in-progress week (if any data) since we're already viewing the
55
+ // most recent completed.
56
+ const prevMonday = priorMonday(lastWeek);
57
+ const currentMonday = currentWeekMonday();
58
+ const nextMonday = currentMonday > lastWeek ? currentMonday : null;
59
+ const nextHasData = nextMonday ? hasAnyEntries(nextMonday) : false;
60
+
61
+ return (
62
+ <div style={{ paddingBottom: 64 }}>
63
+ <InsightsTopBar
64
+ scope="week"
65
+ currentLabel={`Week of ${lastWeek}`}
66
+ rangeLabel={shortDateRange(lastWeek)}
67
+ prev={{ key: `week-${prevMonday}`, label: shortDateRange(prevMonday).split(" — ")[0]!, cached: !!prior }}
68
+ next={nextMonday && nextHasData
69
+ ? { key: `week-${nextMonday}`, label: shortDateRange(nextMonday).split(" — ")[0]!, cached: false }
70
+ : null}
71
+ />
72
+
73
+ <section style={{ paddingTop: 8 }}>
74
+ {hasData ? (
75
+ <WeekDigestView
76
+ initial={cached}
77
+ monday={lastWeek}
78
+ aiEnabled={aiOn}
79
+ autoFire={autoFire}
80
+ prior={prior}
81
+ />
82
+ ) : (
83
+ <EmptyState aiOn={aiOn} />
84
+ )}
85
+ </section>
86
+ </div>
87
+ );
88
+ }
89
+
90
+ function EmptyState({ aiOn }: { aiOn: boolean }) {
91
+ return (
92
+ <div style={{
93
+ maxWidth: 720, margin: "16px auto 0", padding: "20px 40px",
94
+ }}>
95
+ <div style={{
96
+ padding: "20px 22px", borderRadius: 12,
97
+ background: "var(--af-surface)",
98
+ border: "1px dashed var(--af-border)",
99
+ }}>
100
+ <div style={{
101
+ fontSize: 11, fontWeight: 700, letterSpacing: "0.08em",
102
+ textTransform: "uppercase", color: "var(--af-text-tertiary)", marginBottom: 6,
103
+ }}>No data yet</div>
104
+ <p style={{ fontSize: 13, lineHeight: 1.6, margin: "0 0 12px", color: "var(--af-text)" }}>
105
+ A week digest needs per-day perception entries first. Each session you run with Claude Code generates entries automatically; once a few days have passed, this page will start producing a weekly retrospective.
106
+ </p>
107
+ <p style={{ fontSize: 12, lineHeight: 1.6, margin: "0 0 14px", color: "var(--af-text-secondary)" }}>
108
+ {aiOn
109
+ ? "AI features are on. Run any session, then revisit — or use the home page to backfill recent days from existing transcripts."
110
+ : "AI narratives are off. Enable them in Settings to see headlines, friction patterns, and weekly suggestions."}
111
+ </p>
112
+ <div style={{ display: "flex", gap: 8, flexWrap: "wrap" }}>
113
+ <Link href="/" style={ctaPrimary}>
114
+ Home · backfill recent days
115
+ </Link>
116
+ {!aiOn && (
117
+ <Link href="/settings" style={ctaSecondary}>
118
+ Settings · enable AI features
119
+ </Link>
120
+ )}
121
+ </div>
122
+ </div>
123
+ </div>
124
+ );
125
+ }
126
+
127
+ const ctaPrimary: React.CSSProperties = {
128
+ padding: "7px 12px", borderRadius: 6,
129
+ background: "var(--af-accent)", color: "white",
130
+ fontSize: 12, fontWeight: 600, textDecoration: "none",
131
+ };
132
+
133
+ const ctaSecondary: React.CSSProperties = {
134
+ padding: "7px 12px", borderRadius: 6,
135
+ background: "transparent", border: "1px solid var(--af-border)",
136
+ color: "var(--af-text)", fontSize: 12, fontWeight: 500, textDecoration: "none",
137
+ };
@@ -2,9 +2,15 @@ import type { Metadata } from "next";
2
2
  import { cookies } from "next/headers";
3
3
  import { Sidebar } from "@/components/sidebar";
4
4
  import { LiveRefresher } from "@/components/live-refresher";
5
- import { LiveSessionsWidget, type LiveSessionPick } from "@/components/live-sessions-widget";
5
+ import {
6
+ LiveSessionsWidget,
7
+ type LiveSessionPick,
8
+ type LiveEntrySummary,
9
+ } from "@/components/live-sessions-widget";
10
+ import { JobQueueWidget } from "@/components/job-queue-widget";
6
11
  import { listProjects, listSessions, walkJsonlFiles } from "@claude-lens/parser/fs";
7
12
  import { latestUsageSnapshot } from "@/lib/usage-data";
13
+ import { buildEntriesIndex } from "@/lib/entries-index";
8
14
  import pkg from "../package.json" with { type: "json" };
9
15
  import "./globals.css";
10
16
 
@@ -16,12 +22,13 @@ export const metadata: Metadata = {
16
22
  export const dynamic = "force-dynamic";
17
23
 
18
24
  export default async function RootLayout({ children }: { children: React.ReactNode }) {
19
- const [projects, allFiles, recentSessions] = await Promise.all([
25
+ const [projects, allFiles, recentSessions, entriesIndex] = await Promise.all([
20
26
  listProjects(),
21
27
  walkJsonlFiles(),
22
28
  // Only need the newest-mtime slice — the widget filters to the 45s
23
29
  // live window client-side.
24
30
  listSessions({ limit: 20 }),
31
+ buildEntriesIndex(),
25
32
  ]);
26
33
  const totalSessions = allFiles.length;
27
34
  const currentUsage = latestUsageSnapshot();
@@ -40,6 +47,18 @@ export default async function RootLayout({ children }: { children: React.ReactNo
40
47
  agentName: s.agentName,
41
48
  }));
42
49
 
50
+ const liveEntrySummaries: Record<string, LiveEntrySummary> = {};
51
+ for (const s of recentSessions) {
52
+ const list = entriesIndex.bySession.get(s.id) ?? [];
53
+ if (list.length === 0) continue;
54
+ const latest = list[list.length - 1]!;
55
+ liveEntrySummaries[s.id] = {
56
+ outcome: latest.enrichment.outcome ?? null,
57
+ enrichmentStatus: latest.enrichment.status,
58
+ localDay: latest.local_day,
59
+ };
60
+ }
61
+
43
62
  // Read the theme cookie set by the client-side ThemeToggle.
44
63
  // After the first visit the cookie is always present, so the server
45
64
  // renders with the correct data-theme attribute — no FOUC, no inline
@@ -76,7 +95,8 @@ export default async function RootLayout({ children }: { children: React.ReactNo
76
95
  {children}
77
96
  </main>
78
97
  </div>
79
- <LiveSessionsWidget sessions={liveSessionPicks} />
98
+ <LiveSessionsWidget sessions={liveSessionPicks} entrySummaries={liveEntrySummaries} />
99
+ <JobQueueWidget />
80
100
  </body>
81
101
  </html>
82
102
  );
@@ -12,8 +12,12 @@ import {
12
12
  import { DashboardView } from "@/components/dashboard-view";
13
13
  import { DateRangeFilter } from "@/components/date-range-filter";
14
14
  import { LiveBadge } from "@/components/live-badge";
15
+ import { YesterdayHero } from "@/components/yesterday-hero";
16
+ import { RecentDaysPanel } from "@/components/recent-days-panel";
17
+ import type { DaySummary } from "@/components/heatmap";
15
18
  import { cutoffMs, parseRange } from "@/lib/date-range";
16
19
  import { listSessions } from "@/lib/data";
20
+ import { buildEntriesIndex, listCachedDayDigests } from "@/lib/entries-index";
17
21
  import { formatDuration, formatTokens, formatRelative, prettyProjectName } from "@/lib/format";
18
22
  import Link from "next/link";
19
23
 
@@ -37,9 +41,27 @@ export default async function DashboardHome({
37
41
  const range = parseRange(rangeParam);
38
42
  const cutoff = cutoffMs(range);
39
43
 
40
- const allSessions = await listSessions();
44
+ const [allSessions, entriesIndex, cachedDigests] = await Promise.all([
45
+ listSessions(),
46
+ buildEntriesIndex(),
47
+ listCachedDayDigests(),
48
+ ]);
41
49
  const sessions = filterByRange(allSessions, cutoff);
42
50
 
51
+ // Heatmap day summaries — outcome from index, headline + helpfulness from cached digests
52
+ const daySummaries = new Map<string, DaySummary>();
53
+ for (const [date, outcome] of entriesIndex.dayOutcome) {
54
+ daySummaries.set(date, { outcome, headline: null, helpfulness: null });
55
+ }
56
+ for (const [date, digest] of cachedDigests) {
57
+ const cur = daySummaries.get(date) ?? { outcome: digest.outcome_day, headline: null, helpfulness: null };
58
+ daySummaries.set(date, {
59
+ outcome: cur.outcome ?? digest.outcome_day,
60
+ headline: digest.headline,
61
+ helpfulness: digest.helpfulness_day,
62
+ });
63
+ }
64
+
43
65
  // Top projects: total tokens desc with session count as tiebreaker.
44
66
  const projects = groupByProject(sessions)
45
67
  .sort((a, b) => {
@@ -106,13 +128,18 @@ export default async function DashboardHome({
106
128
  <DateRangeFilter current={range} />
107
129
  </header>
108
130
 
109
- <DashboardView sessions={sessions} />
131
+ {/* TodayHero removed: generating a digest mid-day produces a partial
132
+ snapshot of incomplete work. Yesterday's hero stays since the day
133
+ is closed and the digest is final. */}
134
+ <YesterdayHero />
135
+
136
+ <DashboardView sessions={sessions} daySummaries={daySummaries} />
110
137
 
111
- {/* Top projects + Recent sessions */}
138
+ {/* Top projects + Recent sessions + Recent days */}
112
139
  <section
113
140
  style={{
114
141
  display: "grid",
115
- gridTemplateColumns: "1fr 1.4fr",
142
+ gridTemplateColumns: "minmax(260px, 1fr) minmax(260px, 1.4fr) minmax(260px, 1fr)",
116
143
  gap: 16,
117
144
  }}
118
145
  >
@@ -301,6 +328,8 @@ export default async function DashboardHome({
301
328
  )}
302
329
  </div>
303
330
  </div>
331
+
332
+ <RecentDaysPanel />
304
333
  </section>
305
334
  </div>
306
335
  );
@@ -8,7 +8,16 @@ import {
8
8
  type GanttSession,
9
9
  type ParallelismBurst,
10
10
  } from "@claude-lens/parser";
11
+ import type { DayOutcome, EntryEnrichmentStatus } from "@claude-lens/entries";
11
12
  import { formatDuration, formatTokens, prettyProjectName } from "@/lib/format";
13
+ import { OutcomePill, OUTCOME_STYLES } from "@/components/outcome-pill";
14
+
15
+ export type SessionEntrySummary = {
16
+ outcome: DayOutcome | null;
17
+ briefSummary: string | null;
18
+ enrichmentStatus: EntryEnrichmentStatus;
19
+ localDay: string;
20
+ };
12
21
 
13
22
  const ROW_HEIGHT = 30;
14
23
  const ROW_GAP = 3;
@@ -61,9 +70,11 @@ function fmtTime(ms: number): string {
61
70
  export function GanttChart({
62
71
  gantt,
63
72
  bursts = [],
73
+ sessionEntries = {},
64
74
  }: {
65
75
  gantt: GanttDay;
66
76
  bursts?: ParallelismBurst[];
77
+ sessionEntries?: Record<string, SessionEntrySummary>;
67
78
  }) {
68
79
  const [hover, setHover] = useState<{
69
80
  session: GanttSession;
@@ -632,6 +643,21 @@ export function GanttChart({
632
643
  flexShrink: 0,
633
644
  }}
634
645
  />
646
+ {(() => {
647
+ const sum = sessionEntries[session.id];
648
+ if (sum?.outcome) {
649
+ return (
650
+ <span
651
+ title={OUTCOME_STYLES[sum.outcome]?.label ?? sum.outcome}
652
+ style={{ fontSize: 11, lineHeight: 1, flexShrink: 0 }}
653
+ aria-hidden
654
+ >
655
+ {OUTCOME_STYLES[sum.outcome]?.icon ?? ""}
656
+ </span>
657
+ );
658
+ }
659
+ return null;
660
+ })()}
635
661
  <Link
636
662
  href={`/sessions/${session.id}`}
637
663
  style={{
@@ -809,8 +835,34 @@ export function GanttChart({
809
835
  lineHeight: 1.45,
810
836
  }}
811
837
  >
838
+ {(() => {
839
+ const sum = sessionEntries[hover.session.id];
840
+ if (!sum) return null;
841
+ if (sum.outcome) {
842
+ return (
843
+ <div style={{ marginBottom: 6 }}>
844
+ <OutcomePill outcome={sum.outcome} size="sm" />
845
+ </div>
846
+ );
847
+ }
848
+ if (sum.enrichmentStatus !== "done" && sum.enrichmentStatus !== "skipped_trivial") {
849
+ return (
850
+ <div style={{ marginBottom: 6 }}>
851
+ <OutcomePill
852
+ outcome={null}
853
+ pending
854
+ sessionId={hover.session.id}
855
+ localDay={sum.localDay}
856
+ size="sm"
857
+ />
858
+ </div>
859
+ );
860
+ }
861
+ return null;
862
+ })()}
812
863
  <div style={{ fontWeight: 600, marginBottom: 4 }}>
813
- {stripXml(hover.session.firstUserPreview ?? "").slice(0, 100) ||
864
+ {sessionEntries[hover.session.id]?.briefSummary ||
865
+ stripXml(hover.session.firstUserPreview ?? "").slice(0, 100) ||
814
866
  prettyProjectName(hover.session.projectName)}
815
867
  </div>
816
868
  <div
@@ -863,6 +915,7 @@ export function GanttChart({
863
915
  <BurstDetailModal
864
916
  burst={bursts[detailBurstIdx]!}
865
917
  gantt={gantt}
918
+ sessionEntries={sessionEntries}
866
919
  onClose={() => setDetailBurstIdx(null)}
867
920
  onShowInTimeline={() => {
868
921
  const idx = detailBurstIdx;
@@ -1110,11 +1163,13 @@ function ConcurrencyInfoModal({ onClose }: { onClose: () => void }) {
1110
1163
  function BurstDetailModal({
1111
1164
  burst,
1112
1165
  gantt,
1166
+ sessionEntries,
1113
1167
  onClose,
1114
1168
  onShowInTimeline,
1115
1169
  }: {
1116
1170
  burst: ParallelismBurst;
1117
1171
  gantt: GanttDay;
1172
+ sessionEntries: Record<string, SessionEntrySummary>;
1118
1173
  onClose: () => void;
1119
1174
  onShowInTimeline: () => void;
1120
1175
  }) {
@@ -1697,8 +1752,19 @@ function BurstDetailModal({
1697
1752
  textAlign: "right",
1698
1753
  whiteSpace: "nowrap",
1699
1754
  flexShrink: 0,
1755
+ display: "flex",
1756
+ flexDirection: "column",
1757
+ alignItems: "flex-end",
1758
+ gap: 4,
1700
1759
  }}
1701
1760
  >
1761
+ {(() => {
1762
+ const sum = sessionEntries[s.id];
1763
+ if (sum?.outcome) {
1764
+ return <OutcomePill outcome={sum.outcome} size="sm" label="text" />;
1765
+ }
1766
+ return null;
1767
+ })()}
1702
1768
  <div style={{ color: "var(--af-text-secondary)" }}>
1703
1769
  {formatDuration(activeMs)}{" "}
1704
1770
  <span style={{ opacity: 0.6 }}>({activePct}%)</span>