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,216 @@
1
+ "use client";
2
+
3
+ import Link from "next/link";
4
+ import type { MonthDigest as MonthDigestType, DayHelpfulness } from "@claude-lens/entries";
5
+ import type { ReactNode } from "react";
6
+
7
+ const HELP_COLORS: Record<NonNullable<DayHelpfulness>, string> = {
8
+ essential: "#48bb78",
9
+ helpful: "#4299e1",
10
+ neutral: "#a0aec0",
11
+ unhelpful: "#f56565",
12
+ };
13
+
14
+ export function MonthDigest({
15
+ digest, aiEnabled, actions,
16
+ }: {
17
+ digest: MonthDigestType;
18
+ aiEnabled: boolean;
19
+ actions?: ReactNode;
20
+ }) {
21
+ const totalDays = Object.values(digest.outcome_mix).reduce((a, b) => a + (b ?? 0), 0);
22
+ const totalShipped = digest.shipped.length;
23
+ const hrs = digest.agent_min_total / 60;
24
+ const timeStr = hrs >= 1 ? `${hrs.toFixed(1)}h` : `${Math.round(digest.agent_min_total)}m`;
25
+ const monthLabel = formatMonth(digest.key);
26
+
27
+ return (
28
+ <div style={{ maxWidth: 980, margin: "0 auto", padding: "24px 40px" }}>
29
+ <header style={{ marginBottom: 28 }}>
30
+ <div style={{
31
+ display: "flex", alignItems: "center", gap: 10, marginBottom: 8,
32
+ fontSize: 12, color: "var(--af-text-tertiary)", fontWeight: 500,
33
+ flexWrap: "wrap",
34
+ }}>
35
+ <span style={{ textTransform: "uppercase", letterSpacing: "0.06em" }}>{monthLabel}</span>
36
+ <span style={{ color: "var(--af-text-tertiary)" }}>·</span>
37
+ <span style={{ fontFamily: "var(--font-mono)", color: "var(--af-text-secondary)" }}>
38
+ {timeStr} agent time · {totalDays} active day{totalDays === 1 ? "" : "s"} · {totalShipped} PR{totalShipped === 1 ? "" : "s"}
39
+ </span>
40
+ {actions && (
41
+ <div style={{ marginLeft: "auto", display: "inline-flex", alignItems: "center", gap: 8 }}>
42
+ {actions}
43
+ </div>
44
+ )}
45
+ </div>
46
+ {digest.headline ? (
47
+ <h1 style={{
48
+ fontSize: 26, fontWeight: 700, lineHeight: 1.3, letterSpacing: "-0.02em",
49
+ margin: "0 0 14px", maxWidth: 820, color: "var(--af-text)",
50
+ }}>
51
+ {digest.headline}
52
+ </h1>
53
+ ) : (
54
+ <h1 style={{ fontSize: 20, color: "var(--af-text-secondary)", margin: "0 0 14px" }}>
55
+ {aiEnabled
56
+ ? "No narrative yet."
57
+ : `Worked ${timeStr} across ${digest.projects.length} project${digest.projects.length === 1 ? "" : "s"}.`}
58
+ </h1>
59
+ )}
60
+ </header>
61
+
62
+ {!aiEnabled && (
63
+ <div style={{
64
+ padding: 14, marginBottom: 24, background: "var(--af-accent-subtle)",
65
+ borderRadius: 8, fontSize: 13, color: "var(--af-text)",
66
+ }}>
67
+ Enable AI features in <Link href="/settings" style={{ color: "var(--af-accent)" }}>Settings</Link> to see monthly narratives.
68
+ </div>
69
+ )}
70
+
71
+ <HelpfulnessBars helpfulness_by_week={digest.helpfulness_by_week} />
72
+
73
+ {digest.standout_weeks && digest.standout_weeks.length > 0 && (
74
+ <Section title="Standout weeks">
75
+ <ul style={{ listStyle: "none", padding: 0, margin: 0, display: "flex", flexDirection: "column", gap: 10 }}>
76
+ {digest.standout_weeks.map(s => (
77
+ <li key={s.week_start} style={{
78
+ padding: "12px 14px", borderRadius: 8, background: "var(--af-surface)",
79
+ border: "1px solid var(--af-border-subtle)",
80
+ display: "flex", gap: 12, alignItems: "flex-start",
81
+ }}>
82
+ <Link href={`/insights/week-${s.week_start}`} style={{
83
+ fontSize: 11, fontWeight: 600,
84
+ color: "var(--af-accent)", textDecoration: "none",
85
+ flexShrink: 0, paddingTop: 2,
86
+ fontFamily: "var(--font-mono)",
87
+ }}>
88
+ Week {s.week_start.slice(5)}
89
+ </Link>
90
+ <span style={{ fontSize: 13, lineHeight: 1.55, color: "var(--af-text)" }}>{s.why}</span>
91
+ </li>
92
+ ))}
93
+ </ul>
94
+ </Section>
95
+ )}
96
+
97
+ {digest.trajectory && digest.trajectory.length > 0 && (
98
+ <Section title="Trajectory">
99
+ <ol style={{ listStyle: "none", padding: 0, margin: 0, display: "flex", flexDirection: "column", gap: 8 }}>
100
+ {digest.trajectory.map(t => (
101
+ <li key={t.week_start} style={{ display: "flex", gap: 12, alignItems: "flex-start" }}>
102
+ <Link href={`/insights/week-${t.week_start}`} style={{
103
+ fontSize: 10, fontWeight: 600, color: "var(--af-text-tertiary)",
104
+ fontFamily: "var(--font-mono)", flexShrink: 0, width: 92, paddingTop: 3,
105
+ textDecoration: "none",
106
+ }}>
107
+ Week {t.week_start.slice(5)}
108
+ </Link>
109
+ <span style={{ fontSize: 13, lineHeight: 1.55, color: "var(--af-text-secondary)" }}>{t.line}</span>
110
+ </li>
111
+ ))}
112
+ </ol>
113
+ </Section>
114
+ )}
115
+
116
+ {digest.friction_themes && digest.friction_themes.trim().length > 0 && (
117
+ <Section title="Friction patterns">
118
+ <p style={{ fontSize: 13, lineHeight: 1.6, margin: 0, color: "var(--af-text)" }}>
119
+ {digest.friction_themes}
120
+ </p>
121
+ </Section>
122
+ )}
123
+
124
+ {digest.suggestion && (
125
+ <Section title="Suggestion">
126
+ <div style={{
127
+ padding: "14px 16px", borderRadius: 8, background: "var(--af-accent-subtle)",
128
+ border: "1px solid color-mix(in srgb, var(--af-accent) 18%, var(--af-border))",
129
+ }}>
130
+ <div style={{ fontSize: 14, fontWeight: 600, color: "var(--af-text)", marginBottom: 6 }}>
131
+ {digest.suggestion.headline}
132
+ </div>
133
+ <div style={{ fontSize: 13, lineHeight: 1.55, color: "var(--af-text-secondary)" }}>
134
+ {digest.suggestion.body}
135
+ </div>
136
+ </div>
137
+ </Section>
138
+ )}
139
+
140
+ {digest.projects.length > 0 && (
141
+ <Section title="Projects">
142
+ <ul style={{ listStyle: "none", padding: 0, margin: 0, display: "flex", flexDirection: "column", gap: 4 }}>
143
+ {digest.projects.map(p => (
144
+ <li key={p.name} style={{
145
+ display: "flex", gap: 10, alignItems: "baseline",
146
+ padding: "6px 10px", borderRadius: 6,
147
+ fontSize: 12, color: "var(--af-text)",
148
+ }}>
149
+ <span style={{ flex: 1, minWidth: 0, fontWeight: 500 }}>{p.display_name}</span>
150
+ <span style={{
151
+ fontFamily: "var(--font-mono)", fontSize: 10,
152
+ color: "var(--af-text-tertiary)",
153
+ }}>
154
+ {Math.round(p.agent_min)}m · {p.share_pct.toFixed(0)}% · {p.shipped_count} PR
155
+ </span>
156
+ </li>
157
+ ))}
158
+ </ul>
159
+ </Section>
160
+ )}
161
+ </div>
162
+ );
163
+ }
164
+
165
+ function HelpfulnessBars({ helpfulness_by_week }: { helpfulness_by_week: MonthDigestType["helpfulness_by_week"] }) {
166
+ const filled = helpfulness_by_week.some(h => h.helpfulness !== null);
167
+ if (!filled) return null;
168
+ return (
169
+ <div style={{
170
+ display: "flex", gap: 6, alignItems: "stretch",
171
+ padding: "12px 0", marginBottom: 24,
172
+ }}>
173
+ {helpfulness_by_week.map((h, i) => (
174
+ <div key={i} style={{
175
+ flex: 1, padding: "10px 4px", borderRadius: 6,
176
+ textAlign: "center",
177
+ background: h.helpfulness ? `color-mix(in srgb, ${HELP_COLORS[h.helpfulness]} 14%, transparent)` : "var(--af-surface)",
178
+ border: `1px solid ${h.helpfulness ? `color-mix(in srgb, ${HELP_COLORS[h.helpfulness]} 28%, transparent)` : "var(--af-border-subtle)"}`,
179
+ }}>
180
+ <div style={{
181
+ fontSize: 9, fontWeight: 700, letterSpacing: "0.04em",
182
+ color: "var(--af-text-tertiary)", marginBottom: 4,
183
+ fontFamily: "var(--font-mono)",
184
+ }}>
185
+ {h.week_start.slice(5)}
186
+ </div>
187
+ <div style={{
188
+ fontSize: 10, fontWeight: 600,
189
+ color: h.helpfulness ? HELP_COLORS[h.helpfulness] : "var(--af-text-tertiary)",
190
+ }}>
191
+ {h.helpfulness ?? "—"}
192
+ </div>
193
+ </div>
194
+ ))}
195
+ </div>
196
+ );
197
+ }
198
+
199
+ function Section({ title, children }: { title: string; children: ReactNode }) {
200
+ return (
201
+ <section style={{ marginBottom: 28 }}>
202
+ <h2 style={{
203
+ fontSize: 11, fontWeight: 700, letterSpacing: "0.08em",
204
+ textTransform: "uppercase", color: "var(--af-text-tertiary)",
205
+ margin: "0 0 12px",
206
+ }}>{title}</h2>
207
+ {children}
208
+ </section>
209
+ );
210
+ }
211
+
212
+ function formatMonth(yearMonth: string): string {
213
+ const [y, m] = yearMonth.split("-");
214
+ const d = new Date(Number(y), Number(m) - 1, 1);
215
+ return d.toLocaleDateString("en-US", { month: "long", year: "numeric" });
216
+ }
@@ -0,0 +1,37 @@
1
+ import type { DayOutcome } from "@claude-lens/entries";
2
+ import { OutcomePill } from "./outcome-pill";
3
+
4
+ /**
5
+ * Horizontal row of outcome pills, oldest→newest left-to-right.
6
+ * Days without an outcome render as a faint placeholder dot.
7
+ */
8
+ export function OutcomeMixRow({
9
+ days,
10
+ size = "sm",
11
+ }: {
12
+ days: Array<{ date: string; outcome: DayOutcome | null }>;
13
+ size?: "sm" | "md";
14
+ }) {
15
+ return (
16
+ <div style={{ display: "inline-flex", gap: 3, alignItems: "center" }}>
17
+ {days.map((d) =>
18
+ d.outcome ? (
19
+ <OutcomePill key={d.date} outcome={d.outcome} size={size} label="icon" />
20
+ ) : (
21
+ <span
22
+ key={d.date}
23
+ title={`${d.date} — no entries`}
24
+ style={{
25
+ display: "inline-block",
26
+ width: size === "sm" ? 14 : 18,
27
+ height: size === "sm" ? 14 : 18,
28
+ borderRadius: 99,
29
+ background: "var(--af-border-subtle)",
30
+ opacity: 0.5,
31
+ }}
32
+ />
33
+ )
34
+ )}
35
+ </div>
36
+ );
37
+ }
@@ -0,0 +1,101 @@
1
+ import Link from "next/link";
2
+ import type { DayOutcome } from "@claude-lens/entries";
3
+
4
+ export type EntryOutcome = Exclude<DayOutcome, "idle">;
5
+
6
+ type Style = { bg: string; fg: string; label: string; icon: string };
7
+
8
+ export const OUTCOME_STYLES: Record<DayOutcome, Style> = {
9
+ shipped: { bg: "rgba(72, 187, 120, 0.12)", fg: "#48bb78", label: "Shipped", icon: "🚀" },
10
+ partial: { bg: "rgba(66, 153, 225, 0.12)", fg: "#4299e1", label: "Partial", icon: "🔨" },
11
+ blocked: { bg: "rgba(245, 101, 101, 0.12)", fg: "#f56565", label: "Blocked", icon: "🚧" },
12
+ exploratory: { bg: "rgba(160, 174, 192, 0.12)", fg: "#a0aec0", label: "Exploratory", icon: "🧭" },
13
+ trivial: { bg: "rgba(203, 213, 224, 0.12)", fg: "#a0aec0", label: "Warmup", icon: "💤" },
14
+ idle: { bg: "rgba(203, 213, 224, 0.12)", fg: "#a0aec0", label: "Idle", icon: "—" },
15
+ };
16
+
17
+ const PENDING_STYLE: Style = {
18
+ bg: "rgba(160, 174, 192, 0.08)",
19
+ fg: "var(--af-text-tertiary)",
20
+ label: "pending",
21
+ icon: "⋯",
22
+ };
23
+
24
+ const SIZES = {
25
+ sm: { fontSize: 9, padding: "1px 6px", iconGap: 3, borderRadius: 99 },
26
+ md: { fontSize: 10, padding: "2px 8px", iconGap: 4, borderRadius: 99 },
27
+ lg: { fontSize: 11, padding: "3px 10px", iconGap: 5, borderRadius: 99 },
28
+ } as const;
29
+
30
+ type Size = keyof typeof SIZES;
31
+ type Label = "icon" | "text" | "both";
32
+
33
+ type Props =
34
+ | { outcome: DayOutcome | EntryOutcome; size?: Size; label?: Label; pending?: never }
35
+ | { outcome: null; pending: true; sessionId?: string; localDay: string; size?: Size };
36
+
37
+ export function OutcomePill(props: Props) {
38
+ const size = props.size ?? "md";
39
+ const dim = SIZES[size];
40
+
41
+ if ("pending" in props && props.pending) {
42
+ const style: React.CSSProperties = {
43
+ display: "inline-flex",
44
+ alignItems: "center",
45
+ gap: dim.iconGap,
46
+ padding: dim.padding,
47
+ borderRadius: dim.borderRadius,
48
+ fontSize: dim.fontSize,
49
+ fontWeight: 600,
50
+ background: PENDING_STYLE.bg,
51
+ color: PENDING_STYLE.fg,
52
+ border: "1px dashed var(--af-border-subtle)",
53
+ textDecoration: "none",
54
+ whiteSpace: "nowrap",
55
+ };
56
+ return (
57
+ <Link
58
+ href={`/digest/${props.localDay}`}
59
+ style={style}
60
+ title={`Generate ${props.localDay} digest →`}
61
+ >
62
+ <span aria-hidden style={{ lineHeight: 1 }}>{PENDING_STYLE.icon}</span>
63
+ <span>{PENDING_STYLE.label}</span>
64
+ </Link>
65
+ );
66
+ }
67
+
68
+ const variant = OUTCOME_STYLES[props.outcome];
69
+ const label = props.label ?? "both";
70
+ const showIcon = label === "icon" || label === "both";
71
+ const showText = label === "text" || label === "both";
72
+
73
+ const style: React.CSSProperties = {
74
+ display: "inline-flex",
75
+ alignItems: "center",
76
+ gap: dim.iconGap,
77
+ padding: dim.padding,
78
+ borderRadius: dim.borderRadius,
79
+ fontSize: dim.fontSize,
80
+ fontWeight: 600,
81
+ background: variant.bg,
82
+ color: variant.fg,
83
+ whiteSpace: "nowrap",
84
+ };
85
+
86
+ return (
87
+ <span style={style} title={variant.label}>
88
+ {showIcon && <span aria-hidden style={{ lineHeight: 1 }}>{variant.icon}</span>}
89
+ {showText && <span>{variant.label}</span>}
90
+ </span>
91
+ );
92
+ }
93
+
94
+ /** Sort priority for outcomes — higher = more "complete" outcome. */
95
+ const OUTCOME_PRIORITY: Record<DayOutcome, number> = {
96
+ shipped: 6, partial: 5, blocked: 4, exploratory: 3, trivial: 2, idle: 1,
97
+ };
98
+
99
+ export function outcomePriority(outcome: DayOutcome | null | undefined): number {
100
+ return outcome ? OUTCOME_PRIORITY[outcome] : 0;
101
+ }
@@ -0,0 +1,155 @@
1
+ import type { CyclePeak } from "@/lib/calibration-data";
2
+
3
+ // Horizontal bar chart of the last few cycles' peak utilization. One bar
4
+ // per cycle, height proportional to peak %, color follows the burndown
5
+ // danger thresholds (green / amber / red). The right-most bar is "current"
6
+ // (in-progress) and gets a distinct styling so it isn't read as a finished
7
+ // trend point. Designed for direct reuse on the team-edition member card.
8
+ export function PreviousCyclesTrend({
9
+ windowLabel,
10
+ cycles,
11
+ }: {
12
+ windowLabel: "5h" | "7d";
13
+ cycles: CyclePeak[];
14
+ }) {
15
+ if (cycles.length === 0) return null;
16
+ return (
17
+ <section
18
+ style={{
19
+ border: "1px solid var(--af-border-subtle)",
20
+ borderRadius: 8,
21
+ padding: "12px 16px",
22
+ display: "flex",
23
+ flexDirection: "column",
24
+ gap: 10,
25
+ }}
26
+ >
27
+ <header
28
+ style={{
29
+ display: "flex",
30
+ alignItems: "baseline",
31
+ gap: 10,
32
+ flexWrap: "wrap",
33
+ }}
34
+ >
35
+ <h2 style={{ fontSize: 13, margin: 0, fontWeight: 700 }}>
36
+ Previous {windowLabel} cycles
37
+ </h2>
38
+ <span style={{ fontSize: 11, color: "var(--af-text-tertiary)" }}>
39
+ peak utilization · oldest → newest
40
+ </span>
41
+ <span style={{ marginLeft: "auto", fontSize: 11, color: "var(--af-text-tertiary)" }}>
42
+ {trendLabel(cycles)}
43
+ </span>
44
+ </header>
45
+ <div
46
+ style={{
47
+ display: "grid",
48
+ gridTemplateColumns: `repeat(${cycles.length}, minmax(0, 1fr))`,
49
+ gap: 8,
50
+ alignItems: "end",
51
+ }}
52
+ >
53
+ {cycles.map((c, i) => (
54
+ <CycleBar key={i} cycle={c} />
55
+ ))}
56
+ </div>
57
+ </section>
58
+ );
59
+ }
60
+
61
+ function CycleBar({ cycle }: { cycle: CyclePeak }) {
62
+ const pct = Math.max(0, Math.min(100, cycle.peakPct));
63
+ const color =
64
+ pct >= 90 ? "var(--af-danger)" :
65
+ pct >= 70 ? "#b58400" :
66
+ "var(--af-success)";
67
+ const date = new Date(cycle.endsAt);
68
+ // Compact "Apr 23" date label; "current" cycle gets "ends Apr 30" instead
69
+ const label = cycle.current
70
+ ? `ends ${date.toLocaleDateString(undefined, { month: "short", day: "numeric" })}`
71
+ : date.toLocaleDateString(undefined, { month: "short", day: "numeric" });
72
+ return (
73
+ <div
74
+ style={{
75
+ display: "flex",
76
+ flexDirection: "column",
77
+ alignItems: "stretch",
78
+ gap: 4,
79
+ }}
80
+ title={`${cycle.current ? "Current cycle ends" : "Cycle ended"} ${date.toLocaleString()}${cycle.source === "predicted" ? " · estimated from JSONL" : " · measured from daemon"}`}
81
+ >
82
+ <div
83
+ style={{
84
+ fontSize: 11,
85
+ fontFamily: "var(--font-mono)",
86
+ color,
87
+ fontWeight: 700,
88
+ textAlign: "right",
89
+ fontVariantNumeric: "tabular-nums",
90
+ }}
91
+ >
92
+ {pct.toFixed(0)}%
93
+ </div>
94
+ <div
95
+ style={{
96
+ height: 80,
97
+ display: "flex",
98
+ flexDirection: "column",
99
+ justifyContent: "flex-end",
100
+ background: "var(--af-border-subtle)",
101
+ borderRadius: 4,
102
+ opacity: cycle.current ? 0.85 : 1,
103
+ // Dashed border on in-progress cycle so it visually distinguishes
104
+ // from completed ones.
105
+ border: cycle.current ? `1px dashed ${color}` : "none",
106
+ }}
107
+ >
108
+ <div
109
+ style={{
110
+ height: `${pct}%`,
111
+ background: color,
112
+ borderRadius: 4,
113
+ opacity: cycle.source === "predicted" ? 0.55 : 1,
114
+ // Striped fill for predicted cycles so estimated values are
115
+ // visually distinct from measured ones.
116
+ backgroundImage:
117
+ cycle.source === "predicted"
118
+ ? `repeating-linear-gradient(45deg, transparent 0 4px, rgba(0,0,0,0.08) 4px 8px)`
119
+ : undefined,
120
+ }}
121
+ />
122
+ </div>
123
+ <div
124
+ style={{
125
+ fontSize: 10,
126
+ color: "var(--af-text-tertiary)",
127
+ textAlign: "center",
128
+ fontFamily: "var(--font-mono)",
129
+ letterSpacing: "0.02em",
130
+ }}
131
+ >
132
+ {label}
133
+ {cycle.source === "predicted" && (
134
+ <>
135
+ {" "}
136
+ <span style={{ color: "#b58400" }}>·est</span>
137
+ </>
138
+ )}
139
+ </div>
140
+ </div>
141
+ );
142
+ }
143
+
144
+ // One-line trend hint over the last few cycles. We don't try to be clever —
145
+ // just compare last completed peak to the prior one and label up/down/flat.
146
+ function trendLabel(cycles: CyclePeak[]): string {
147
+ const completed = cycles.filter((c) => !c.current);
148
+ if (completed.length < 2) return "";
149
+ const last = completed[completed.length - 1]!.peakPct;
150
+ const prev = completed[completed.length - 2]!.peakPct;
151
+ const delta = last - prev;
152
+ if (Math.abs(delta) < 5) return `flat vs prior (${delta >= 0 ? "+" : ""}${delta.toFixed(0)}pp)`;
153
+ if (delta > 0) return `↑ up ${delta.toFixed(0)}pp from prior`;
154
+ return `↓ down ${Math.abs(delta).toFixed(0)}pp from prior`;
155
+ }
@@ -0,0 +1,83 @@
1
+ import Link from "next/link";
2
+ import { listEntriesForDay, readDayDigest } from "@claude-lens/entries/fs";
3
+ import { toLocalDay } from "@/lib/entries";
4
+
5
+ type Row = {
6
+ date: string;
7
+ label: string;
8
+ agentMin: number;
9
+ prs: number;
10
+ status: "generated" | "pending" | "empty";
11
+ };
12
+
13
+ export function RecentDaysPanel() {
14
+ const now = Date.now();
15
+ const rows: Row[] = [];
16
+
17
+ for (let i = 0; i < 5; i++) {
18
+ const d = toLocalDay(now - i * 86_400_000);
19
+ const entries = listEntriesForDay(d);
20
+ const agentMin = entries.reduce((s, e) => s + e.numbers.active_min, 0);
21
+ const prs = entries.reduce((s, e) => s + e.pr_titles.length, 0);
22
+ const digest = readDayDigest(d);
23
+ const status: Row["status"] = entries.length === 0 ? "empty"
24
+ : digest && digest.headline ? "generated"
25
+ : "pending";
26
+
27
+ const label = i === 0 ? "Today"
28
+ : i === 1 ? "Yesterday"
29
+ : new Date(`${d}T12:00:00`).toLocaleDateString("en-US", { weekday: "short", month: "short", day: "numeric" });
30
+
31
+ rows.push({ date: d, label, agentMin, prs, status });
32
+ }
33
+
34
+ return (
35
+ <div className="af-panel">
36
+ <div className="af-panel-header">
37
+ <span>Recent days</span>
38
+ <Link href="/digest" style={{ fontSize: 11, color: "var(--af-accent)", marginLeft: "auto" }}>
39
+ Backfill →
40
+ </Link>
41
+ </div>
42
+ <div>
43
+ {rows.map(r => (
44
+ <Link key={r.date} href={`/digest/${r.date}`}
45
+ style={{
46
+ display: "grid",
47
+ gridTemplateColumns: "1fr auto auto auto",
48
+ gap: 10,
49
+ padding: "10px 18px",
50
+ fontSize: 12,
51
+ borderBottom: "1px solid var(--af-border-subtle)",
52
+ alignItems: "center",
53
+ }}>
54
+ <span>{r.label}</span>
55
+ <StatusPill status={r.status} />
56
+ <span style={{ fontFamily: "var(--font-mono)", color: "var(--af-text-tertiary)", fontSize: 11, minWidth: 36, textAlign: "right" }}>
57
+ {r.agentMin > 0 ? `${Math.round(r.agentMin)}m` : "—"}
58
+ </span>
59
+ <span style={{ fontFamily: "var(--font-mono)", color: "var(--af-text-tertiary)", fontSize: 11, minWidth: 42, textAlign: "right" }}>
60
+ {r.prs > 0 ? `${r.prs} PR${r.prs === 1 ? "" : "s"}` : ""}
61
+ </span>
62
+ </Link>
63
+ ))}
64
+ </div>
65
+ </div>
66
+ );
67
+ }
68
+
69
+ function StatusPill({ status }: { status: Row["status"] }) {
70
+ const style = {
71
+ generated: { bg: "rgba(72,187,120,0.12)", fg: "#48bb78", text: "✓" },
72
+ pending: { bg: "rgba(237,137,54,0.12)", fg: "#ed8936", text: "•" },
73
+ empty: { bg: "transparent", fg: "var(--af-text-tertiary)", text: "—" },
74
+ }[status];
75
+ return (
76
+ <span style={{
77
+ fontSize: 10, fontWeight: 600, padding: "1px 7px", borderRadius: 99,
78
+ background: style.bg, color: style.fg, minWidth: 22, textAlign: "center",
79
+ }}>
80
+ {style.text}
81
+ </span>
82
+ );
83
+ }