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,7 +1,16 @@
1
1
  "use client";
2
2
 
3
3
  import { useState, useMemo } from "react";
4
+ import { useRouter } from "next/navigation";
4
5
  import type { DailyBucket } from "@claude-lens/parser";
6
+ import type { DayOutcome, DayHelpfulness } from "@claude-lens/entries";
7
+ import { OUTCOME_STYLES } from "./outcome-pill";
8
+
9
+ export type DaySummary = {
10
+ outcome: DayOutcome | null;
11
+ headline: string | null;
12
+ helpfulness: DayHelpfulness;
13
+ };
5
14
 
6
15
  /**
7
16
  * GitHub-style contribution heatmap.
@@ -14,12 +23,15 @@ export function Heatmap({
14
23
  valueKey = "sessions",
15
24
  cellSize = 13,
16
25
  cellGap = 3,
26
+ daySummaries,
17
27
  }: {
18
28
  buckets: DailyBucket[];
19
29
  valueKey?: "sessions" | "toolCalls" | "turns";
20
30
  cellSize?: number;
21
31
  cellGap?: number;
32
+ daySummaries?: Map<string, DaySummary>;
22
33
  }) {
34
+ const router = useRouter();
23
35
  const [hover, setHover] = useState<{ bucket: DailyBucket; x: number; y: number } | null>(null);
24
36
 
25
37
  const { weeks, max } = useMemo(() => {
@@ -117,6 +129,9 @@ export function Heatmap({
117
129
  });
118
130
  }}
119
131
  onMouseLeave={() => setHover(null)}
132
+ onClick={() => {
133
+ if (val > 0) router.push(`/digest/${bucket.date}`);
134
+ }}
120
135
  // Use `style.fill` not the `fill` attribute — React does
121
136
  // not expand CSS custom properties (var(--…)) inside the
122
137
  // SVG presentation attribute, but it does resolve them in
@@ -178,12 +193,74 @@ export function Heatmap({
178
193
  boxShadow: "0 4px 12px rgba(0,0,0,0.3)",
179
194
  }}
180
195
  >
181
- <div style={{ fontWeight: 600 }}>{hover.bucket.date}</div>
196
+ <div style={{ display: "flex", alignItems: "center", gap: 6, marginBottom: 2 }}>
197
+ <span style={{ fontWeight: 600 }}>{hover.bucket.date}</span>
198
+ {(() => {
199
+ const sum = daySummaries?.get(hover.bucket.date);
200
+ if (!sum?.outcome) return null;
201
+ const variant = OUTCOME_STYLES[sum.outcome];
202
+ return (
203
+ <span
204
+ style={{
205
+ display: "inline-flex",
206
+ alignItems: "center",
207
+ gap: 3,
208
+ padding: "1px 6px",
209
+ borderRadius: 99,
210
+ fontSize: 9,
211
+ fontWeight: 600,
212
+ background: variant.bg,
213
+ color: variant.fg,
214
+ }}
215
+ >
216
+ {variant.icon} {variant.label}
217
+ </span>
218
+ );
219
+ })()}
220
+ </div>
221
+ {(() => {
222
+ const sum = daySummaries?.get(hover.bucket.date);
223
+ if (sum?.headline) {
224
+ return (
225
+ <div
226
+ style={{
227
+ color: "var(--af-text)",
228
+ fontSize: 11,
229
+ fontWeight: 500,
230
+ marginBottom: 2,
231
+ maxWidth: 280,
232
+ whiteSpace: "normal",
233
+ lineHeight: 1.35,
234
+ }}
235
+ >
236
+ &ldquo;{sum.headline}&rdquo;
237
+ </div>
238
+ );
239
+ }
240
+ return null;
241
+ })()}
182
242
  <div style={{ color: "var(--af-text-secondary)" }}>
183
243
  {hover.bucket.sessions} session{hover.bucket.sessions === 1 ? "" : "s"}
184
244
  {hover.bucket.toolCalls > 0 && ` · ${hover.bucket.toolCalls} tool calls`}
185
245
  {hover.bucket.peakParallelism > 1 && ` · peak ×${hover.bucket.peakParallelism}`}
186
246
  </div>
247
+ {(() => {
248
+ const sum = daySummaries?.get(hover.bucket.date);
249
+ if (sum?.helpfulness) {
250
+ return (
251
+ <div
252
+ style={{
253
+ color: "var(--af-text-tertiary)",
254
+ fontSize: 10,
255
+ marginTop: 2,
256
+ }}
257
+ >
258
+ Claude: {sum.helpfulness}
259
+ </div>
260
+ );
261
+ }
262
+ return null;
263
+ })()}
187
264
  </div>
188
265
  )}
189
266
  </div>
@@ -0,0 +1,82 @@
1
+ import type { DayHelpfulness } from "@claude-lens/entries";
2
+
3
+ const LEVELS: Record<NonNullable<DayHelpfulness>, { height: string; color: string; label: string }> = {
4
+ essential: { height: "100%", color: "#48bb78", label: "Essential" },
5
+ helpful: { height: "75%", color: "#4299e1", label: "Helpful" },
6
+ neutral: { height: "50%", color: "#a0aec0", label: "Neutral" },
7
+ unhelpful: { height: "25%", color: "#f56565", label: "Unhelpful" },
8
+ };
9
+
10
+ export function HelpfulnessSparkline({
11
+ days,
12
+ }: {
13
+ days: Array<{ date: string; helpfulness: DayHelpfulness; cached: boolean }>;
14
+ }) {
15
+ return (
16
+ <div>
17
+ <div style={{ display: "flex", alignItems: "flex-end", gap: 4, height: 36 }}>
18
+ {days.map((d) => {
19
+ const level = d.helpfulness ? LEVELS[d.helpfulness] : null;
20
+ return (
21
+ <div
22
+ key={d.date}
23
+ title={
24
+ level
25
+ ? `${d.date}: Claude ${level.label.toLowerCase()}`
26
+ : d.cached
27
+ ? `${d.date}: no signal`
28
+ : `${d.date}: not generated — open digest →`
29
+ }
30
+ style={{
31
+ flex: 1,
32
+ height: "100%",
33
+ display: "flex",
34
+ alignItems: "flex-end",
35
+ background: "rgba(160, 174, 192, 0.06)",
36
+ borderRadius: 3,
37
+ overflow: "hidden",
38
+ cursor: d.cached ? "default" : "pointer",
39
+ }}
40
+ >
41
+ {level ? (
42
+ <div
43
+ style={{
44
+ width: "100%",
45
+ height: level.height,
46
+ background: level.color,
47
+ }}
48
+ />
49
+ ) : (
50
+ <div
51
+ style={{
52
+ width: "100%",
53
+ height: "10%",
54
+ background: "var(--af-border-subtle)",
55
+ }}
56
+ />
57
+ )}
58
+ </div>
59
+ );
60
+ })}
61
+ </div>
62
+ <div
63
+ style={{
64
+ display: "flex",
65
+ gap: 12,
66
+ marginTop: 6,
67
+ fontSize: 10,
68
+ color: "var(--af-text-tertiary)",
69
+ flexWrap: "wrap",
70
+ }}
71
+ >
72
+ <span>mood (last {days.length}d):</span>
73
+ {(["essential", "helpful", "neutral", "unhelpful"] as const).map((k) => (
74
+ <span key={k} style={{ display: "inline-flex", alignItems: "center", gap: 4 }}>
75
+ <span style={{ width: 8, height: 8, borderRadius: 1, background: LEVELS[k].color }} />
76
+ {LEVELS[k].label.toLowerCase()}
77
+ </span>
78
+ ))}
79
+ </div>
80
+ </div>
81
+ );
82
+ }
@@ -0,0 +1,211 @@
1
+ "use client";
2
+
3
+ import Link from "next/link";
4
+ import { useEffect, useState } from "react";
5
+
6
+ type WeekRow = {
7
+ iso_week: number;
8
+ start: string;
9
+ end: string;
10
+ label: string;
11
+ active_days: number;
12
+ in_progress: boolean;
13
+ saved_key: string | null;
14
+ headline: string | null;
15
+ shipped_count: number;
16
+ agent_min: number;
17
+ };
18
+
19
+ type MonthRow = {
20
+ year: number;
21
+ month: number;
22
+ start: string;
23
+ end: string;
24
+ label: string;
25
+ active_days: number;
26
+ in_progress: boolean;
27
+ saved_key: string | null;
28
+ headline: string | null;
29
+ shipped_count: number;
30
+ agent_min: number;
31
+ };
32
+
33
+ type Tab = "weeks" | "months";
34
+
35
+ export function InsightsHistory({ inDrawer = false }: { inDrawer?: boolean } = {}) {
36
+ const [tab, setTab] = useState<Tab>("weeks");
37
+ const [weeks, setWeeks] = useState<WeekRow[] | null>(null);
38
+ const [months, setMonths] = useState<MonthRow[] | null>(null);
39
+
40
+ useEffect(() => {
41
+ void fetch("/api/digest/week-index?count=12")
42
+ .then(r => r.json())
43
+ .then((j: { weeks: WeekRow[] }) => setWeeks(j.weeks))
44
+ .catch(() => setWeeks([]));
45
+ void fetch("/api/digest/month-index?count=6")
46
+ .then(r => r.json())
47
+ .then((j: { months: MonthRow[] }) => setMonths(j.months))
48
+ .catch(() => setMonths([]));
49
+ }, []);
50
+
51
+ const wrapperStyle: React.CSSProperties = inDrawer
52
+ ? { padding: "0 18px" }
53
+ : { maxWidth: 980, margin: "0 auto", padding: "28px 40px 0" };
54
+
55
+ return (
56
+ <div style={wrapperStyle}>
57
+ <div style={{ display: "flex", alignItems: "center", gap: 10, marginBottom: inDrawer ? 14 : 18 }}>
58
+ {!inDrawer && (
59
+ <h2 style={{
60
+ fontSize: 11, fontWeight: 700, letterSpacing: "0.08em",
61
+ textTransform: "uppercase", color: "var(--af-text-tertiary)",
62
+ margin: 0, marginRight: 4,
63
+ }}>History</h2>
64
+ )}
65
+ <div style={tabGroup}>
66
+ {(["weeks", "months"] as const).map(t => (
67
+ <button key={t} type="button" onClick={() => setTab(t)} style={{
68
+ ...tabBtn,
69
+ background: tab === t ? "var(--af-accent)" : "transparent",
70
+ color: tab === t ? "white" : "var(--af-text-secondary)",
71
+ }}>
72
+ {t === "weeks" ? "Weeks" : "Months"}
73
+ </button>
74
+ ))}
75
+ </div>
76
+ </div>
77
+
78
+ {tab === "weeks" ? (
79
+ weeks === null ? <Empty>Loading weeks…</Empty>
80
+ : weeks.length === 0 ? <Empty>No history yet.</Empty>
81
+ : (
82
+ <ul style={listStyle}>
83
+ {weeks.map(w => <WeekItem key={w.start} w={w} />)}
84
+ </ul>
85
+ )
86
+ ) : (
87
+ months === null ? <Empty>Loading months…</Empty>
88
+ : months.length === 0 ? <Empty>No history yet.</Empty>
89
+ : (
90
+ <ul style={listStyle}>
91
+ {months.map(m => <MonthItem key={m.start} m={m} />)}
92
+ </ul>
93
+ )
94
+ )}
95
+ </div>
96
+ );
97
+ }
98
+
99
+ function WeekItem({ w }: { w: WeekRow }) {
100
+ const empty = w.active_days === 0 && !w.in_progress && !w.saved_key;
101
+ const target = w.saved_key ? `/insights/${w.saved_key}` : `/insights/week-${w.start}`;
102
+ const subline = w.saved_key && w.headline
103
+ ? w.headline
104
+ : empty ? "no data"
105
+ : w.in_progress ? "in progress · click to view"
106
+ : `${w.active_days} active day${w.active_days === 1 ? "" : "s"} · click to generate`;
107
+
108
+ return (
109
+ <li style={pickerRow(!!w.saved_key)}>
110
+ <Link href={target} style={{
111
+ display: "flex", flexDirection: "column", gap: 4, textDecoration: "none",
112
+ flex: 1, minWidth: 0,
113
+ }}>
114
+ <div style={rowHeader}>
115
+ <span style={{ fontSize: 13, fontWeight: 600, color: "var(--af-text)", letterSpacing: "-0.01em" }}>
116
+ W{String(w.iso_week).padStart(2, "0")} · {w.label}
117
+ </span>
118
+ {w.in_progress && <span style={inProgressTag}>in progress</span>}
119
+ {w.saved_key && (
120
+ <span style={{
121
+ fontSize: 10, fontWeight: 600,
122
+ color: "var(--af-accent)", marginLeft: "auto",
123
+ }}>
124
+ {w.shipped_count} PR · {w.agent_min}m
125
+ </span>
126
+ )}
127
+ </div>
128
+ <span style={subStyle}>{subline}</span>
129
+ </Link>
130
+ </li>
131
+ );
132
+ }
133
+
134
+ function MonthItem({ m }: { m: MonthRow }) {
135
+ const empty = m.active_days === 0 && !m.in_progress && !m.saved_key;
136
+ const target = m.saved_key
137
+ ? `/insights/${m.saved_key}`
138
+ : `/insights/month-${m.start.slice(0, 7)}`;
139
+ const subline = m.saved_key && m.headline
140
+ ? m.headline
141
+ : empty ? "no data"
142
+ : m.in_progress ? "in progress · click to view"
143
+ : `${m.active_days} active day${m.active_days === 1 ? "" : "s"} · click to generate`;
144
+
145
+ return (
146
+ <li style={pickerRow(!!m.saved_key)}>
147
+ <Link href={target} style={{
148
+ display: "flex", flexDirection: "column", gap: 4, textDecoration: "none",
149
+ flex: 1, minWidth: 0,
150
+ }}>
151
+ <div style={rowHeader}>
152
+ <span style={{ fontSize: 13, fontWeight: 600, color: "var(--af-text)", letterSpacing: "-0.01em" }}>
153
+ {m.label}
154
+ </span>
155
+ {m.in_progress && <span style={inProgressTag}>in progress</span>}
156
+ {m.saved_key && (
157
+ <span style={{
158
+ fontSize: 10, fontWeight: 600,
159
+ color: "var(--af-accent)", marginLeft: "auto",
160
+ }}>
161
+ {m.shipped_count} PR · {m.agent_min}m
162
+ </span>
163
+ )}
164
+ </div>
165
+ <span style={subStyle}>{subline}</span>
166
+ </Link>
167
+ </li>
168
+ );
169
+ }
170
+
171
+ function Empty({ children }: { children: React.ReactNode }) {
172
+ return (
173
+ <div style={{
174
+ padding: "20px 18px", borderRadius: 10,
175
+ border: "1px dashed var(--af-border)", background: "var(--af-surface)",
176
+ fontSize: 13, color: "var(--af-text-tertiary)", lineHeight: 1.55,
177
+ }}>{children}</div>
178
+ );
179
+ }
180
+
181
+ const tabGroup: React.CSSProperties = {
182
+ display: "inline-flex", gap: 3, border: "1px solid var(--af-border)", borderRadius: 8, padding: 2,
183
+ };
184
+ const tabBtn: React.CSSProperties = {
185
+ padding: "5px 14px", fontSize: 12, fontWeight: 600,
186
+ border: "none", borderRadius: 6, cursor: "pointer",
187
+ };
188
+ const listStyle: React.CSSProperties = {
189
+ listStyle: "none", padding: 0, margin: 0, display: "flex", flexDirection: "column", gap: 4,
190
+ };
191
+ function pickerRow(saved: boolean): React.CSSProperties {
192
+ return {
193
+ display: "flex", alignItems: "stretch", gap: 14,
194
+ padding: "10px 14px", borderRadius: 10,
195
+ border: `1px solid ${saved ? "color-mix(in srgb, var(--af-accent) 24%, var(--af-border))" : "var(--af-border-subtle)"}`,
196
+ background: saved ? "color-mix(in srgb, var(--af-accent) 6%, var(--af-surface))" : "var(--af-surface)",
197
+ transition: "border-color 0.15s",
198
+ };
199
+ }
200
+ const rowHeader: React.CSSProperties = {
201
+ display: "flex", alignItems: "center", gap: 8, minWidth: 0,
202
+ };
203
+ const subStyle: React.CSSProperties = {
204
+ fontSize: 11, color: "var(--af-text-tertiary)", lineHeight: 1.5,
205
+ fontFamily: "var(--font-mono)",
206
+ };
207
+ const inProgressTag: React.CSSProperties = {
208
+ fontSize: 10, fontWeight: 500, padding: "2px 6px", borderRadius: 4,
209
+ background: "color-mix(in srgb, #f5b445 18%, transparent)", color: "#c08a1f",
210
+ letterSpacing: "0.02em",
211
+ };
@@ -0,0 +1,216 @@
1
+ "use client";
2
+
3
+ import Link from "next/link";
4
+ import { useEffect, useState, type ReactNode } from "react";
5
+ import { ChevronLeft, ChevronRight, History, X } from "lucide-react";
6
+ import { InsightsHistory } from "./insights-history";
7
+
8
+ type NavTarget = { key: string; label: string; cached: boolean };
9
+
10
+ export function InsightsTopBar({
11
+ scope, // "week" | "month"
12
+ currentLabel, // primary label, e.g. "Week of 2026-04-20" or "Apr 2026"
13
+ rangeLabel, // optional secondary, e.g. "Apr 20 — Apr 26"
14
+ prev,
15
+ next,
16
+ }: {
17
+ scope: "week" | "month";
18
+ currentLabel: string;
19
+ rangeLabel?: string;
20
+ prev: NavTarget | null;
21
+ next: NavTarget | null;
22
+ }) {
23
+ const [drawerOpen, setDrawerOpen] = useState(false);
24
+
25
+ useEffect(() => {
26
+ if (!drawerOpen) return;
27
+ const onKey = (e: KeyboardEvent) => {
28
+ if (e.key === "Escape") setDrawerOpen(false);
29
+ };
30
+ window.addEventListener("keydown", onKey);
31
+ document.body.style.overflow = "hidden";
32
+ return () => {
33
+ window.removeEventListener("keydown", onKey);
34
+ document.body.style.overflow = "";
35
+ };
36
+ }, [drawerOpen]);
37
+
38
+ return (
39
+ <>
40
+ <header style={{
41
+ position: "sticky", top: 0, zIndex: 50,
42
+ background: "color-mix(in srgb, var(--background) 90%, transparent)",
43
+ backdropFilter: "blur(10px)",
44
+ WebkitBackdropFilter: "blur(10px)",
45
+ borderBottom: "1px solid var(--af-border-subtle)",
46
+ }} className="no-print">
47
+ <div style={{
48
+ maxWidth: 980, margin: "0 auto", padding: "12px 40px",
49
+ display: "flex", alignItems: "center", gap: 14, minHeight: 44,
50
+ }}>
51
+ {/* Title cluster */}
52
+ <div style={{ display: "flex", alignItems: "baseline", gap: 10, minWidth: 0 }}>
53
+ <Link href="/insights" style={{
54
+ fontSize: 10, fontWeight: 700, color: "var(--af-text-tertiary)",
55
+ textDecoration: "none", textTransform: "uppercase",
56
+ letterSpacing: "0.08em", flexShrink: 0,
57
+ }} title="Latest week digest">
58
+ Insights
59
+ </Link>
60
+ <span style={{ color: "var(--af-text-tertiary)", fontSize: 11, flexShrink: 0 }}>›</span>
61
+ <span style={{
62
+ fontSize: 14, fontWeight: 600, color: "var(--af-text)",
63
+ letterSpacing: "-0.01em", minWidth: 0, overflow: "hidden",
64
+ textOverflow: "ellipsis", whiteSpace: "nowrap",
65
+ }}>
66
+ {currentLabel}
67
+ </span>
68
+ {rangeLabel && (
69
+ <span style={{
70
+ fontSize: 11, fontFamily: "var(--font-mono)",
71
+ color: "var(--af-text-tertiary)", flexShrink: 0,
72
+ }}>
73
+ {rangeLabel}
74
+ </span>
75
+ )}
76
+ </div>
77
+
78
+ {/* Nav cluster */}
79
+ <div style={{ marginLeft: "auto", display: "inline-flex", alignItems: "center", gap: 6 }}>
80
+ <NavArrow target={prev} dir="prev" />
81
+ <NavArrow target={next} dir="next" />
82
+ <button
83
+ type="button"
84
+ onClick={() => setDrawerOpen(true)}
85
+ style={historyBtnStyle}
86
+ title={`Browse ${scope === "week" ? "weekly" : "monthly"} history`}
87
+ >
88
+ <History size={13} />
89
+ <span>Browse</span>
90
+ </button>
91
+ </div>
92
+ </div>
93
+ </header>
94
+
95
+ {drawerOpen && (
96
+ <HistoryDrawer onClose={() => setDrawerOpen(false)} />
97
+ )}
98
+ </>
99
+ );
100
+ }
101
+
102
+ function NavArrow({ target, dir }: { target: NavTarget | null; dir: "prev" | "next" }) {
103
+ const Icon = dir === "prev" ? ChevronLeft : ChevronRight;
104
+ if (!target) {
105
+ return (
106
+ <span style={navBtnStyleDisabled} title={`No ${dir === "prev" ? "earlier" : "later"} period`}>
107
+ <Icon size={14} />
108
+ </span>
109
+ );
110
+ }
111
+ return (
112
+ <Link
113
+ href={`/insights/${target.key}`}
114
+ style={navBtnStyle(target.cached)}
115
+ title={
116
+ target.cached
117
+ ? `Saved digest · ${target.label}`
118
+ : `${target.label} (no saved digest yet — will prompt to Generate)`
119
+ }
120
+ >
121
+ <Icon size={14} />
122
+ <span>{target.label}</span>
123
+ </Link>
124
+ );
125
+ }
126
+
127
+ function HistoryDrawer({ onClose }: { onClose: () => void }) {
128
+ return (
129
+ <div role="dialog" aria-modal="true" aria-label="Insights history" style={{
130
+ position: "fixed", inset: 0, zIndex: 200,
131
+ display: "flex", justifyContent: "flex-end",
132
+ }}>
133
+ <div
134
+ onClick={onClose}
135
+ style={{
136
+ position: "absolute", inset: 0,
137
+ background: "rgba(0,0,0,0.32)",
138
+ animation: "fade-in 120ms ease-out",
139
+ }}
140
+ />
141
+ <aside style={{
142
+ position: "relative",
143
+ width: "min(440px, 92vw)", height: "100vh",
144
+ background: "var(--background)",
145
+ borderLeft: "1px solid var(--af-border-subtle)",
146
+ boxShadow: "-12px 0 40px rgba(0,0,0,0.32)",
147
+ display: "flex", flexDirection: "column",
148
+ animation: "slide-in 160ms cubic-bezier(0.2, 0.9, 0.3, 1)",
149
+ }}>
150
+ <header style={{
151
+ display: "flex", alignItems: "center", gap: 10,
152
+ padding: "14px 18px", borderBottom: "1px solid var(--af-border-subtle)",
153
+ }}>
154
+ <h2 style={{
155
+ fontSize: 13, fontWeight: 600, margin: 0, color: "var(--af-text)",
156
+ }}>
157
+ Browse insights history
158
+ </h2>
159
+ <button
160
+ type="button"
161
+ onClick={onClose}
162
+ aria-label="Close history"
163
+ style={{
164
+ marginLeft: "auto", width: 26, height: 26,
165
+ display: "inline-flex", alignItems: "center", justifyContent: "center",
166
+ border: "1px solid var(--af-border-subtle)", borderRadius: 6,
167
+ background: "transparent", color: "var(--af-text-secondary)",
168
+ cursor: "pointer",
169
+ }}
170
+ >
171
+ <X size={14} />
172
+ </button>
173
+ </header>
174
+ <div style={{ flex: 1, overflowY: "auto", padding: "18px 0" }}>
175
+ <InsightsHistory inDrawer />
176
+ </div>
177
+ </aside>
178
+ <style>{`
179
+ @keyframes slide-in { from { transform: translateX(20px); opacity: 0 } to { transform: translateX(0); opacity: 1 } }
180
+ @keyframes fade-in { from { opacity: 0 } to { opacity: 1 } }
181
+ `}</style>
182
+ </div>
183
+ );
184
+ }
185
+
186
+ const historyBtnStyle: React.CSSProperties = {
187
+ display: "inline-flex", alignItems: "center", gap: 6,
188
+ padding: "5px 11px", borderRadius: 6,
189
+ border: "1px solid var(--af-border-subtle)",
190
+ background: "var(--af-surface)",
191
+ color: "var(--af-text)",
192
+ fontSize: 11, fontWeight: 500, cursor: "pointer",
193
+ fontFamily: "inherit",
194
+ };
195
+
196
+ function navBtnStyle(cached: boolean): React.CSSProperties {
197
+ return {
198
+ display: "inline-flex", alignItems: "center", gap: 4,
199
+ padding: "5px 9px", borderRadius: 6,
200
+ border: `1px solid ${cached ? "color-mix(in srgb, var(--af-accent) 28%, var(--af-border))" : "var(--af-border-subtle)"}`,
201
+ background: cached ? "color-mix(in srgb, var(--af-accent) 6%, var(--af-surface))" : "var(--af-surface)",
202
+ color: cached ? "var(--af-accent)" : "var(--af-text-secondary)",
203
+ fontSize: 11, fontWeight: 500, fontFamily: "var(--font-mono)",
204
+ textDecoration: "none",
205
+ };
206
+ }
207
+
208
+ const navBtnStyleDisabled: React.CSSProperties = {
209
+ display: "inline-flex", alignItems: "center", gap: 4,
210
+ padding: "5px 9px", borderRadius: 6,
211
+ border: "1px solid var(--af-border-subtle)",
212
+ background: "var(--af-surface)",
213
+ color: "var(--af-text-tertiary)",
214
+ fontSize: 11, fontWeight: 500, fontFamily: "var(--font-mono)",
215
+ opacity: 0.45, cursor: "default",
216
+ };