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,10 +1,26 @@
1
1
  import { listSessions } from "@/lib/data";
2
- import { SessionsGrid } from "./sessions-grid";
2
+ import { buildEntriesIndex } from "@/lib/entries-index";
3
+ import { SessionsGrid, type SessionRow } from "./sessions-grid";
3
4
 
4
5
  export const dynamic = "force-dynamic";
5
6
 
6
7
  export default async function SessionsPage() {
7
- const sessions = await listSessions();
8
+ const [sessions, index] = await Promise.all([listSessions(), buildEntriesIndex()]);
9
+
10
+ const rows: SessionRow[] = sessions.map((s) => {
11
+ const entries = index.bySession.get(s.id) ?? [];
12
+ const enrichedDesc = [...entries]
13
+ .reverse()
14
+ .find((e) => e.enrichment.status === "done");
15
+ const latest = entries[entries.length - 1];
16
+ return {
17
+ session: s,
18
+ outcome: index.sessionOutcome.get(s.id) ?? null,
19
+ briefSummary: enrichedDesc?.enrichment.brief_summary ?? null,
20
+ enrichmentStatus: latest?.enrichment.status ?? null,
21
+ latestLocalDay: latest?.local_day ?? null,
22
+ };
23
+ });
8
24
 
9
25
  return (
10
26
  <div style={{ maxWidth: 1280, padding: "32px 40px" }}>
@@ -27,7 +43,7 @@ export default async function SessionsPage() {
27
43
  </code>
28
44
  </p>
29
45
  </header>
30
- <SessionsGrid sessions={sessions} />
46
+ <SessionsGrid rows={rows} />
31
47
  </div>
32
48
  );
33
49
  }
@@ -4,6 +4,7 @@ import Link from "next/link";
4
4
  import { useMemo, useState } from "react";
5
5
  import { useRouter } from "next/navigation";
6
6
  import type { SessionMeta } from "@claude-lens/parser";
7
+ import type { DayOutcome, EntryEnrichmentStatus } from "@claude-lens/entries";
7
8
  import {
8
9
  formatDuration,
9
10
  formatRelative,
@@ -16,57 +17,71 @@ import { LiveBadge } from "@/components/live-badge";
16
17
  import { TeamBadge } from "@/components/team-badge";
17
18
  import { DataTable, type Column } from "@/components/data-table";
18
19
  import { useViewToggle } from "@/components/view-toggle";
20
+ import { OutcomePill, outcomePriority } from "@/components/outcome-pill";
19
21
 
20
- export function SessionsGrid({ sessions }: { sessions: SessionMeta[] }) {
22
+ export type SessionRow = {
23
+ session: SessionMeta;
24
+ outcome: DayOutcome | null;
25
+ briefSummary: string | null;
26
+ enrichmentStatus: EntryEnrichmentStatus | null;
27
+ latestLocalDay: string | null;
28
+ };
29
+
30
+ export function SessionsGrid({ rows }: { rows: SessionRow[] }) {
21
31
  const router = useRouter();
22
32
  const [query, setQuery] = useState("");
23
33
  const [project, setProject] = useState("all");
24
- const [sortBy, setSortBy] = useState<"newest" | "longest" | "most-tokens">("newest");
34
+ const [sortBy, setSortBy] = useState<"newest" | "longest" | "most-tokens" | "outcome">("newest");
25
35
  const { mode: viewMode, toggle: viewToggle } = useViewToggle("cclens:sessions:view");
26
36
 
27
37
  const projects = useMemo(() => {
28
- const s = new Set(sessions.map((x) => x.projectName));
38
+ const s = new Set(rows.map((r) => r.session.projectName));
29
39
  return ["all", ...Array.from(s).sort()];
30
- }, [sessions]);
40
+ }, [rows]);
31
41
 
32
42
  const filtered = useMemo(() => {
33
- let rows = sessions.slice();
34
- if (project !== "all") rows = rows.filter((s) => s.projectName === project);
43
+ let items = rows.slice();
44
+ if (project !== "all") items = items.filter((r) => r.session.projectName === project);
35
45
  if (query) {
36
46
  const q = query.toLowerCase();
37
- rows = rows.filter(
38
- (s) =>
47
+ items = items.filter(
48
+ ({ session: s, briefSummary }) =>
39
49
  s.id.toLowerCase().includes(q) ||
50
+ (briefSummary ?? "").toLowerCase().includes(q) ||
40
51
  (s.firstUserPreview ?? "").toLowerCase().includes(q) ||
41
52
  (s.lastAgentPreview ?? "").toLowerCase().includes(q) ||
42
53
  s.projectName.toLowerCase().includes(q),
43
54
  );
44
55
  }
45
56
  if (sortBy === "newest")
46
- rows.sort(
57
+ items.sort(
47
58
  (a, b) =>
48
- (b.firstTimestamp ? Date.parse(b.firstTimestamp) : 0) -
49
- (a.firstTimestamp ? Date.parse(a.firstTimestamp) : 0),
59
+ (b.session.firstTimestamp ? Date.parse(b.session.firstTimestamp) : 0) -
60
+ (a.session.firstTimestamp ? Date.parse(a.session.firstTimestamp) : 0),
50
61
  );
51
62
  else if (sortBy === "longest")
52
- rows.sort(
63
+ items.sort(
53
64
  (a, b) =>
54
- (b.airTimeMs ?? b.durationMs ?? 0) - (a.airTimeMs ?? a.durationMs ?? 0),
65
+ (b.session.airTimeMs ?? b.session.durationMs ?? 0) -
66
+ (a.session.airTimeMs ?? a.session.durationMs ?? 0),
55
67
  );
56
68
  else if (sortBy === "most-tokens")
57
- rows.sort(
69
+ items.sort(
58
70
  (a, b) =>
59
- b.totalUsage.input +
60
- b.totalUsage.output +
61
- b.totalUsage.cacheRead -
62
- (a.totalUsage.input + a.totalUsage.output + a.totalUsage.cacheRead),
71
+ b.session.totalUsage.input +
72
+ b.session.totalUsage.output +
73
+ b.session.totalUsage.cacheRead -
74
+ (a.session.totalUsage.input +
75
+ a.session.totalUsage.output +
76
+ a.session.totalUsage.cacheRead),
63
77
  );
64
- return rows;
65
- }, [sessions, project, query, sortBy]);
78
+ else if (sortBy === "outcome")
79
+ items.sort((a, b) => outcomePriority(b.outcome) - outcomePriority(a.outcome));
80
+ return items;
81
+ }, [rows, project, query, sortBy]);
66
82
 
67
83
  return (
68
84
  <div>
69
- {/* Toolbar */}
70
85
  <div
71
86
  style={{
72
87
  display: "flex",
@@ -76,14 +91,7 @@ export function SessionsGrid({ sessions }: { sessions: SessionMeta[] }) {
76
91
  alignItems: "center",
77
92
  }}
78
93
  >
79
- <div
80
- style={{
81
- position: "relative",
82
- flex: 1,
83
- minWidth: 260,
84
- maxWidth: 480,
85
- }}
86
- >
94
+ <div style={{ position: "relative", flex: 1, minWidth: 260, maxWidth: 480 }}>
87
95
  <Search
88
96
  size={13}
89
97
  color="var(--af-text-tertiary)"
@@ -112,6 +120,7 @@ export function SessionsGrid({ sessions }: { sessions: SessionMeta[] }) {
112
120
  <option value="newest">Newest</option>
113
121
  <option value="longest">Longest</option>
114
122
  <option value="most-tokens">Most tokens</option>
123
+ <option value="outcome">Outcome</option>
115
124
  </select>
116
125
  <span
117
126
  style={{
@@ -129,10 +138,10 @@ export function SessionsGrid({ sessions }: { sessions: SessionMeta[] }) {
129
138
  {filtered.length === 0 ? (
130
139
  <div className="af-empty">No sessions found.</div>
131
140
  ) : viewMode === "table" ? (
132
- <DataTable<SessionMeta>
141
+ <DataTable<SessionRow>
133
142
  rows={filtered}
134
- getRowKey={(s) => `${s.projectDir}/${s.id}`}
135
- onRowClick={(s) => router.push(`/sessions/${s.id}`)}
143
+ getRowKey={(r) => `${r.session.projectDir}/${r.session.id}`}
144
+ onRowClick={(r) => router.push(`/sessions/${r.session.id}`)}
136
145
  defaultSortKey="lastActive"
137
146
  defaultSortDir="desc"
138
147
  columns={sessionTableColumns}
@@ -145,12 +154,8 @@ export function SessionsGrid({ sessions }: { sessions: SessionMeta[] }) {
145
154
  gap: 14,
146
155
  }}
147
156
  >
148
- {filtered.map((s) => (
149
- // Compose key from projectDir + id because Claude Code reuses
150
- // session UUIDs when the same conversation continues across
151
- // git worktrees — same UUID in two project dirs is a real
152
- // pattern in `~/.claude/projects/`.
153
- <SessionCard key={`${s.projectDir}/${s.id}`} session={s} />
157
+ {filtered.map((r) => (
158
+ <SessionCard key={`${r.session.projectDir}/${r.session.id}`} row={r} />
154
159
  ))}
155
160
  </div>
156
161
  )}
@@ -158,12 +163,18 @@ export function SessionsGrid({ sessions }: { sessions: SessionMeta[] }) {
158
163
  );
159
164
  }
160
165
 
161
- const sessionTableColumns: Column<SessionMeta>[] = [
166
+ const sessionTableColumns: Column<SessionRow>[] = [
167
+ {
168
+ key: "outcome",
169
+ header: "Outcome",
170
+ sortValue: (r) => outcomePriority(r.outcome),
171
+ render: (r) => <OutcomeCell row={r} />,
172
+ },
162
173
  {
163
174
  key: "project",
164
175
  header: "Project",
165
- sortValue: (s) => s.projectName,
166
- render: (s) => (
176
+ sortValue: (r) => r.session.projectName,
177
+ render: (r) => (
167
178
  <div
168
179
  style={{
169
180
  maxWidth: 180,
@@ -171,7 +182,7 @@ const sessionTableColumns: Column<SessionMeta>[] = [
171
182
  textOverflow: "ellipsis",
172
183
  whiteSpace: "nowrap",
173
184
  }}
174
- title={s.projectName}
185
+ title={r.session.projectName}
175
186
  >
176
187
  <div style={{ fontWeight: 500, display: "flex", alignItems: "center", gap: 6 }}>
177
188
  <span
@@ -182,9 +193,9 @@ const sessionTableColumns: Column<SessionMeta>[] = [
182
193
  minWidth: 0,
183
194
  }}
184
195
  >
185
- {prettyProjectName(s.projectName)}
196
+ {prettyProjectName(r.session.projectName)}
186
197
  </span>
187
- <TeamBadge session={s} />
198
+ <TeamBadge session={r.session} />
188
199
  </div>
189
200
  <div
190
201
  style={{
@@ -193,107 +204,106 @@ const sessionTableColumns: Column<SessionMeta>[] = [
193
204
  fontFamily: "var(--font-mono)",
194
205
  }}
195
206
  >
196
- {shortId(s.id)}
207
+ {shortId(r.session.id)}
197
208
  </div>
198
209
  </div>
199
210
  ),
200
211
  },
201
212
  {
202
213
  key: "preview",
203
- header: "First message",
214
+ header: "Summary",
204
215
  sortable: false,
205
- render: (s) => (
206
- <div
207
- style={{
208
- maxWidth: 360,
209
- overflow: "hidden",
210
- textOverflow: "ellipsis",
211
- whiteSpace: "nowrap",
212
- color: "var(--af-text-secondary)",
213
- }}
214
- title={s.firstUserPreview}
215
- >
216
- {s.firstUserPreview || ""}
217
- </div>
218
- ),
216
+ render: (r) => {
217
+ const text = r.briefSummary ?? r.session.firstUserPreview ?? "";
218
+ const isFallback = !r.briefSummary;
219
+ return (
220
+ <div
221
+ style={{
222
+ maxWidth: 360,
223
+ overflow: "hidden",
224
+ textOverflow: "ellipsis",
225
+ whiteSpace: "nowrap",
226
+ color: isFallback ? "var(--af-text-tertiary)" : "var(--af-text-secondary)",
227
+ fontStyle: isFallback ? "italic" : "normal",
228
+ }}
229
+ title={isFallback ? `(raw user message) ${text}` : text}
230
+ >
231
+ {text || "—"}
232
+ </div>
233
+ );
234
+ },
219
235
  },
220
236
  {
221
237
  key: "created",
222
238
  header: "Created",
223
- sortValue: (s) => (s.firstTimestamp ? Date.parse(s.firstTimestamp) : 0),
239
+ sortValue: (r) => (r.session.firstTimestamp ? Date.parse(r.session.firstTimestamp) : 0),
224
240
  align: "right",
225
- render: (s) => (
226
- <span
227
- suppressHydrationWarning
228
- style={{ fontFamily: "var(--font-mono)", fontSize: 11 }}
229
- >
230
- {s.firstTimestamp ? formatRelative(s.firstTimestamp) : "—"}
241
+ render: (r) => (
242
+ <span suppressHydrationWarning style={{ fontFamily: "var(--font-mono)", fontSize: 11 }}>
243
+ {r.session.firstTimestamp ? formatRelative(r.session.firstTimestamp) : "—"}
231
244
  </span>
232
245
  ),
233
246
  },
234
247
  {
235
248
  key: "lastActive",
236
249
  header: "Last active",
237
- sortValue: (s) => (s.lastTimestamp ? Date.parse(s.lastTimestamp) : 0),
250
+ sortValue: (r) => (r.session.lastTimestamp ? Date.parse(r.session.lastTimestamp) : 0),
238
251
  align: "right",
239
- render: (s) => (
240
- <span
241
- suppressHydrationWarning
242
- style={{ fontFamily: "var(--font-mono)", fontSize: 11 }}
243
- >
244
- {s.lastTimestamp ? formatRelative(s.lastTimestamp) : "—"}
252
+ render: (r) => (
253
+ <span suppressHydrationWarning style={{ fontFamily: "var(--font-mono)", fontSize: 11 }}>
254
+ {r.session.lastTimestamp ? formatRelative(r.session.lastTimestamp) : "—"}
245
255
  </span>
246
256
  ),
247
257
  },
248
258
  {
249
259
  key: "airtime",
250
260
  header: "Agent time",
251
- sortValue: (s) => s.airTimeMs ?? s.durationMs ?? 0,
261
+ sortValue: (r) => r.session.airTimeMs ?? r.session.durationMs ?? 0,
252
262
  align: "right",
253
- render: (s) => (
263
+ render: (r) => (
254
264
  <span style={{ fontFamily: "var(--font-mono)", fontSize: 11 }}>
255
- {formatDuration(s.airTimeMs ?? s.durationMs ?? 0)}
265
+ {formatDuration(r.session.airTimeMs ?? r.session.durationMs ?? 0)}
256
266
  </span>
257
267
  ),
258
268
  },
259
269
  {
260
270
  key: "turns",
261
271
  header: "Turns",
262
- sortValue: (s) => s.turnCount ?? 0,
272
+ sortValue: (r) => r.session.turnCount ?? 0,
263
273
  align: "right",
264
- render: (s) => (
274
+ render: (r) => (
265
275
  <span style={{ fontFamily: "var(--font-mono)", fontSize: 11 }}>
266
- {(s.turnCount ?? 0).toLocaleString()}
276
+ {(r.session.turnCount ?? 0).toLocaleString()}
267
277
  </span>
268
278
  ),
269
279
  },
270
280
  {
271
281
  key: "tools",
272
282
  header: "Tool calls",
273
- sortValue: (s) => s.toolCallCount ?? 0,
283
+ sortValue: (r) => r.session.toolCallCount ?? 0,
274
284
  align: "right",
275
- render: (s) => (
285
+ render: (r) => (
276
286
  <span style={{ fontFamily: "var(--font-mono)", fontSize: 11 }}>
277
- {(s.toolCallCount ?? 0).toLocaleString()}
287
+ {(r.session.toolCallCount ?? 0).toLocaleString()}
278
288
  </span>
279
289
  ),
280
290
  },
281
291
  {
282
292
  key: "tokens",
283
293
  header: "Tokens",
284
- sortValue: (s) =>
285
- s.totalUsage.input +
286
- s.totalUsage.output +
287
- s.totalUsage.cacheRead +
288
- s.totalUsage.cacheWrite,
294
+ sortValue: (r) =>
295
+ r.session.totalUsage.input +
296
+ r.session.totalUsage.output +
297
+ r.session.totalUsage.cacheRead +
298
+ r.session.totalUsage.cacheWrite,
289
299
  align: "right",
290
- render: (s) => (
300
+ render: (r) => (
291
301
  <span style={{ fontFamily: "var(--font-mono)", fontSize: 11 }}>
292
302
  {formatTokens(
293
- s.totalUsage.input +
294
- s.totalUsage.output +
295
- s.totalUsage.cacheRead +
296
- s.totalUsage.cacheWrite,
303
+ r.session.totalUsage.input +
304
+ r.session.totalUsage.output +
305
+ r.session.totalUsage.cacheRead +
306
+ r.session.totalUsage.cacheWrite,
297
307
  )}
298
308
  </span>
299
309
  ),
@@ -301,16 +311,38 @@ const sessionTableColumns: Column<SessionMeta>[] = [
301
311
  {
302
312
  key: "status",
303
313
  header: "Status",
304
- sortValue: (s) => (s.status === "running" ? 1 : 0),
314
+ sortValue: (r) => (r.session.status === "running" ? 1 : 0),
305
315
  align: "center",
306
- render: (s) =>
307
- s.status === "running" ? <LiveBadge /> : <span style={{ opacity: 0.4 }}>—</span>,
316
+ render: (r) =>
317
+ r.session.status === "running" ? <LiveBadge /> : <span style={{ opacity: 0.4 }}>—</span>,
308
318
  },
309
319
  ];
310
320
 
311
- function SessionCard({ session: s }: { session: SessionMeta }) {
321
+ function OutcomeCell({ row }: { row: SessionRow }) {
322
+ if (row.outcome) return <OutcomePill outcome={row.outcome} size="sm" label="text" />;
323
+ if (row.enrichmentStatus && row.latestLocalDay && row.enrichmentStatus !== "skipped_trivial") {
324
+ return (
325
+ <OutcomePill
326
+ outcome={null}
327
+ pending
328
+ sessionId={row.session.id}
329
+ localDay={row.latestLocalDay}
330
+ size="sm"
331
+ />
332
+ );
333
+ }
334
+ return <span style={{ color: "var(--af-text-tertiary)", fontSize: 10 }}>—</span>;
335
+ }
336
+
337
+ function SessionCard({ row }: { row: SessionRow }) {
338
+ const { session: s, briefSummary, outcome, latestLocalDay, enrichmentStatus } = row;
312
339
  const totalTokens =
313
340
  s.totalUsage.input + s.totalUsage.output + s.totalUsage.cacheRead + s.totalUsage.cacheWrite;
341
+ const showPending =
342
+ !outcome && enrichmentStatus && enrichmentStatus !== "skipped_trivial" && latestLocalDay;
343
+ const body = briefSummary ?? s.firstUserPreview ?? "";
344
+ const bodyIsFallback = !briefSummary;
345
+
314
346
  return (
315
347
  <Link
316
348
  href={`/sessions/${s.id}`}
@@ -322,7 +354,6 @@ function SessionCard({ session: s }: { session: SessionMeta }) {
322
354
  padding: "14px 16px",
323
355
  }}
324
356
  >
325
- {/* Header: project + id + time */}
326
357
  <div
327
358
  style={{
328
359
  display: "flex",
@@ -347,11 +378,7 @@ function SessionCard({ session: s }: { session: SessionMeta }) {
347
378
  >
348
379
  <LiveBadge mtimeIso={s.lastTimestamp} />
349
380
  <span
350
- style={{
351
- overflow: "hidden",
352
- textOverflow: "ellipsis",
353
- whiteSpace: "nowrap",
354
- }}
381
+ style={{ overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }}
355
382
  >
356
383
  {prettyProjectName(s.projectName)}
357
384
  </span>
@@ -370,11 +397,27 @@ function SessionCard({ session: s }: { session: SessionMeta }) {
370
397
  </div>
371
398
  </div>
372
399
 
373
- {/* First user message (prompt) */}
400
+ {(outcome || showPending) && (
401
+ <div onClick={(e) => e.stopPropagation()}>
402
+ {outcome ? (
403
+ <OutcomePill outcome={outcome} size="md" />
404
+ ) : showPending ? (
405
+ <OutcomePill
406
+ outcome={null}
407
+ pending
408
+ sessionId={s.id}
409
+ localDay={latestLocalDay!}
410
+ size="md"
411
+ />
412
+ ) : null}
413
+ </div>
414
+ )}
415
+
374
416
  <div
375
417
  style={{
376
418
  fontSize: 13,
377
- color: "var(--af-text)",
419
+ color: bodyIsFallback ? "var(--af-text-secondary)" : "var(--af-text)",
420
+ fontStyle: bodyIsFallback ? "italic" : "normal",
378
421
  display: "-webkit-box",
379
422
  WebkitBoxOrient: "vertical",
380
423
  WebkitLineClamp: 2,
@@ -382,32 +425,30 @@ function SessionCard({ session: s }: { session: SessionMeta }) {
382
425
  minHeight: 36,
383
426
  lineHeight: 1.4,
384
427
  }}
385
- title={s.firstUserPreview}
428
+ title={bodyIsFallback ? `(raw user message) ${body}` : body}
386
429
  >
387
- {s.firstUserPreview || (
388
- <em style={{ color: "var(--af-text-tertiary)" }}>(no user message)</em>
389
- )}
430
+ {body || <em style={{ color: "var(--af-text-tertiary)" }}>(no user message)</em>}
390
431
  </div>
391
432
 
392
- {/* Last agent message (conclusion) */}
393
- <div
394
- style={{
395
- fontSize: 11.5,
396
- color: "var(--af-text-secondary)",
397
- display: "-webkit-box",
398
- WebkitBoxOrient: "vertical",
399
- WebkitLineClamp: 2,
400
- overflow: "hidden",
401
- lineHeight: 1.4,
402
- paddingLeft: 10,
403
- borderLeft: "2px solid var(--af-accent-subtle)",
404
- }}
405
- title={s.lastAgentPreview}
406
- >
407
- {s.lastAgentPreview || <em style={{ color: "var(--af-text-tertiary)" }}>—</em>}
408
- </div>
433
+ {bodyIsFallback && (
434
+ <div
435
+ style={{
436
+ fontSize: 11.5,
437
+ color: "var(--af-text-secondary)",
438
+ display: "-webkit-box",
439
+ WebkitBoxOrient: "vertical",
440
+ WebkitLineClamp: 2,
441
+ overflow: "hidden",
442
+ lineHeight: 1.4,
443
+ paddingLeft: 10,
444
+ borderLeft: "2px solid var(--af-accent-subtle)",
445
+ }}
446
+ title={s.lastAgentPreview}
447
+ >
448
+ {s.lastAgentPreview || <em style={{ color: "var(--af-text-tertiary)" }}>—</em>}
449
+ </div>
450
+ )}
409
451
 
410
- {/* Footer stats */}
411
452
  <div
412
453
  style={{
413
454
  display: "flex",
@@ -420,12 +461,12 @@ function SessionCard({ session: s }: { session: SessionMeta }) {
420
461
  fontFamily: "var(--font-mono)",
421
462
  }}
422
463
  >
423
- <Stat icon={<MessagesSquare size={11} />} label={`${s.turnCount ?? 0} turn${s.turnCount === 1 ? "" : "s"}`} />
424
- <Stat icon={<Wrench size={11} />} label={`${s.toolCallCount ?? 0} tools`} />
425
464
  <Stat
426
- icon={<Clock size={11} />}
427
- label={formatDuration(s.airTimeMs ?? s.durationMs)}
465
+ icon={<MessagesSquare size={11} />}
466
+ label={`${s.turnCount ?? 0} turn${s.turnCount === 1 ? "" : "s"}`}
428
467
  />
468
+ <Stat icon={<Wrench size={11} />} label={`${s.toolCallCount ?? 0} tools`} />
469
+ <Stat icon={<Clock size={11} />} label={formatDuration(s.airTimeMs ?? s.durationMs)} />
429
470
  <span style={{ marginLeft: "auto" }}>{formatTokens(totalTokens)}</span>
430
471
  </div>
431
472
  </Link>
@@ -0,0 +1,45 @@
1
+ "use client";
2
+ import { useState } from "react";
3
+
4
+ type Initial = {
5
+ enabled: boolean;
6
+ };
7
+
8
+ export function AiFeaturesForm({ initial }: { initial: Initial }) {
9
+ const [enabled, setEnabled] = useState(initial.enabled);
10
+ const [saving, setSaving] = useState(false);
11
+ const [savedMsg, setSavedMsg] = useState<string | null>(null);
12
+
13
+ async function handleSubmit(e: React.FormEvent) {
14
+ e.preventDefault();
15
+ setSaving(true);
16
+ setSavedMsg(null);
17
+ const res = await fetch("/api/settings", {
18
+ method: "PUT",
19
+ headers: { "content-type": "application/json" },
20
+ body: JSON.stringify({
21
+ ai_features: { enabled },
22
+ }),
23
+ });
24
+ setSaving(false);
25
+ setSavedMsg(res.ok ? "Saved." : `Error: ${res.status}`);
26
+ }
27
+
28
+ return (
29
+ <form onSubmit={handleSubmit} className="space-y-4">
30
+ <label className="flex items-center gap-2">
31
+ <input type="checkbox" checked={enabled} onChange={e => setEnabled(e.target.checked)} />
32
+ <span>Enable AI digests and enrichment</span>
33
+ </label>
34
+
35
+ <button
36
+ type="submit"
37
+ disabled={saving}
38
+ className="px-3 py-1 border rounded bg-black text-white disabled:opacity-60"
39
+ >
40
+ {saving ? "Saving…" : "Save"}
41
+ </button>
42
+ {savedMsg && <p className="text-sm">{savedMsg}</p>}
43
+ </form>
44
+ );
45
+ }
@@ -0,0 +1,20 @@
1
+ import { readSettings } from "@claude-lens/entries/node";
2
+ import { AiFeaturesForm } from "./ai-features-form";
3
+
4
+ export default function SettingsPage() {
5
+ const s = readSettings();
6
+ return (
7
+ <main className="mx-auto max-w-2xl p-6 space-y-8">
8
+ <h1 className="text-2xl font-semibold">Fleetlens Settings</h1>
9
+ <section>
10
+ <h2 className="text-lg font-medium mb-2">AI Features</h2>
11
+ <p className="text-sm text-gray-500 mb-4">
12
+ When enabled, Fleetlens synthesizes daily digests and per-entry
13
+ narratives by spawning your local <code>claude</code> CLI (uses your
14
+ existing Claude Code auth — no API key required).
15
+ </p>
16
+ <AiFeaturesForm initial={{ enabled: s.ai_features.enabled }} />
17
+ </section>
18
+ </main>
19
+ );
20
+ }