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,508 +0,0 @@
1
- /**
2
- * Insights agent — structured ReportData pipeline with persistence.
3
- *
4
- * POST /api/insights
5
- * { range_type: "prior_week" | "week" | "4weeks_completed" | "4weeks" | "custom",
6
- * since?: "YYYY-MM-DD", until?: "YYYY-MM-DD" }
7
- *
8
- * Streams SSE:
9
- * { type: "status", phase: "data"|"analyst"|"compose", text }
10
- * { type: "report", report }
11
- * { type: "saved", key, saved_at }
12
- * { type: "done" }
13
- * { type: "error", message }
14
- */
15
- import { listSessions, getSession, loadUsageByDay } from "@claude-lens/parser/fs";
16
- import {
17
- buildCapsule,
18
- buildPeriodBundle,
19
- aggregateConcurrency,
20
- calendarWeek,
21
- priorCalendarWeek,
22
- last4CompletedWeeks,
23
- calendarMonth,
24
- priorCalendarMonth,
25
- computeBurstsFromSessions,
26
- type SessionCapsule,
27
- type PeriodBundle,
28
- } from "@claude-lens/parser";
29
- import { INSIGHTS_SYSTEM_PROMPT } from "@/lib/ai/insights-prompt";
30
- import { saveReport, keyForRange, listSavedReports, getSavedReport } from "@/lib/ai/saved-reports";
31
- import { spawn } from "node:child_process";
32
- import type { ReportData, IconKey } from "@/components/insight-report";
33
-
34
- export const dynamic = "force-dynamic";
35
- export const runtime = "nodejs";
36
-
37
- type Narrative = {
38
- archetype: { label: string; icon: string; tagline: string; why: string; vs_usual?: string };
39
- theme_headline: string;
40
- shipped_summaries: Record<string, string>;
41
- patterns: { icon: string; title: string; stat: string; note: string }[];
42
- concurrency_insight: string;
43
- concurrency_suggestion: string;
44
- outlier_notes: {
45
- longest_run?: string;
46
- fastest_ship?: string;
47
- most_errors?: string;
48
- wandered?: string;
49
- };
50
- suggestion_headline: string;
51
- suggestion_body: string;
52
- };
53
-
54
- const VALID_ICONS: IconKey[] = [
55
- "BrainCircuit", "ClipboardList", "Compass", "GitCommit", "Layers3",
56
- "Network", "Repeat", "Rocket", "Sparkles", "TrendingDown", "TrendingUp",
57
- "Users", "Zap",
58
- ];
59
-
60
- function safeIcon(v: string): IconKey {
61
- return VALID_ICONS.includes(v as IconKey) ? (v as IconKey) : "Sparkles";
62
- }
63
-
64
- function resolveRange(body: { range_type?: string; since?: string; until?: string }): {
65
- start: Date; end: Date; range_type: ReportData["range_type"]; in_progress: boolean;
66
- } {
67
- switch (body.range_type) {
68
- case "prior_week": {
69
- const r = priorCalendarWeek();
70
- return { ...r, range_type: "week", in_progress: false };
71
- }
72
- case "4weeks_completed": {
73
- const r = last4CompletedWeeks();
74
- return { ...r, range_type: "4weeks", in_progress: false };
75
- }
76
- case "4weeks": {
77
- const end = calendarWeek().end;
78
- const start = new Date(end);
79
- start.setDate(end.getDate() - 27);
80
- return { start, end, range_type: "4weeks", in_progress: true };
81
- }
82
- case "prior_month": {
83
- const r = priorCalendarMonth();
84
- return { ...r, range_type: "month", in_progress: false };
85
- }
86
- case "month": {
87
- const r = calendarMonth();
88
- return { ...r, range_type: "month", in_progress: true };
89
- }
90
- case "custom": {
91
- if (!body.since || !body.until) throw new Error("custom range requires since + until");
92
- const start = new Date(body.since);
93
- const end = new Date(body.until);
94
- // Normalise: pin Mon-Sun 7-day windows to `week`, and full-calendar-month
95
- // windows to `month`, so they participate in baselines and pickers with
96
- // the right key instead of living off in custom-* land.
97
- const days = Math.round((end.getTime() - start.getTime()) / 86_400_000) + 1;
98
- const isCalendarWeek = days === 7 && start.getDay() === 1;
99
- const monthEnd = new Date(start.getFullYear(), start.getMonth() + 1, 0);
100
- const isCalendarMonth = start.getDate() === 1
101
- && end.getFullYear() === monthEnd.getFullYear()
102
- && end.getMonth() === monthEnd.getMonth()
103
- && end.getDate() === monthEnd.getDate();
104
- const normalised: "week" | "month" | "custom" =
105
- isCalendarWeek ? "week" : isCalendarMonth ? "month" : "custom";
106
- return {
107
- start, end,
108
- range_type: normalised,
109
- in_progress: false,
110
- };
111
- }
112
- case "week":
113
- default: {
114
- const r = calendarWeek();
115
- return { ...r, range_type: "week", in_progress: true };
116
- }
117
- }
118
- }
119
-
120
- export async function POST(request: Request) {
121
- let body: { range_type?: string; since?: string; until?: string };
122
- try {
123
- body = await request.json();
124
- } catch {
125
- return Response.json({ error: "invalid JSON" }, { status: 400 });
126
- }
127
-
128
- const encoder = new TextEncoder();
129
- const stream = new ReadableStream({
130
- async start(controller) {
131
- let closed = false;
132
- function send(data: Record<string, unknown>) {
133
- if (closed) return;
134
- try { controller.enqueue(encoder.encode(`data: ${JSON.stringify(data)}\n\n`)); }
135
- catch { closed = true; }
136
- }
137
- const status = (phase: "data" | "analyst" | "compose", text: string) =>
138
- send({ type: "status", phase, text });
139
- function finish() {
140
- if (!closed) {
141
- try { controller.close(); } catch { /* already closed */ }
142
- closed = true;
143
- }
144
- }
145
-
146
- const t0 = Date.now();
147
-
148
- try {
149
- const range = resolveRange(body);
150
- const rangeLabel = range.range_type === "week"
151
- ? (range.in_progress ? "this week (in progress)" : "last week")
152
- : range.range_type === "4weeks"
153
- ? (range.in_progress ? "last 4 weeks (incl. current)" : "last 4 completed weeks")
154
- : range.range_type === "month"
155
- ? (range.in_progress ? "this month (in progress)" : "last month")
156
- : "custom range";
157
- status("data", `Window: ${rangeLabel}`);
158
-
159
- // Phase 1 · Data
160
- const metas = await listSessions({ limit: 10000 });
161
- const inRange = metas.filter((m) => {
162
- if (!m.firstTimestamp) return false;
163
- const t = new Date(m.firstTimestamp).getTime();
164
- return t >= range.start.getTime() && t <= range.end.getTime();
165
- });
166
- status("data", `${inRange.length} sessions found in range`);
167
-
168
- const caps: SessionCapsule[] = [];
169
- let trivial = 0;
170
- const CONCURRENCY = 8;
171
- for (let i = 0; i < inRange.length; i += CONCURRENCY) {
172
- const slice = inRange.slice(i, i + CONCURRENCY);
173
- const results = await Promise.all(slice.map(async (m) => {
174
- try {
175
- const d = await getSession(m.id);
176
- if (!d) return null;
177
- return buildCapsule(d, { compact: true });
178
- } catch { return null; }
179
- }));
180
- for (const cap of results) {
181
- if (!cap) continue;
182
- if (cap.outcome === "trivial") trivial++;
183
- else caps.push(cap);
184
- }
185
- status("data", `Built ${caps.length}/${inRange.length} capsules (${trivial} trivial)`);
186
- }
187
-
188
- status("data", `Aggregating ${caps.length} sessions over ${Math.round((range.end.getTime() - range.start.getTime()) / 86400000) + 1} days`);
189
- const bundle: PeriodBundle = buildPeriodBundle(caps, {
190
- period: range,
191
- trivial_dropped: trivial,
192
- sessions_total: inRange.length,
193
- });
194
-
195
- status("data", "Computing concurrency bursts");
196
- bundle.concurrency = aggregateConcurrency(computeBurstsFromSessions(inRange), range);
197
-
198
- status("data", "Loading license utilization");
199
- try { bundle.usage = await loadUsageByDay(range.start, range.end); }
200
- catch { /* optional */ }
201
-
202
- status("data", "Loading prior reports for baseline comparison");
203
- const priorBaseline = await loadPriorWeeks(4);
204
-
205
- // Phase 2 · Analyst — stringify the payload once; reuse for status, prompt, and context_kb.
206
- const payloadJson = JSON.stringify({
207
- period: bundle.period,
208
- aggregates: bundle,
209
- capsules: caps,
210
- prior: priorBaseline,
211
- });
212
- const payloadKb = Math.round(payloadJson.length / 1024);
213
- status("analyst", `Sending ${payloadKb} KB to Claude (sonnet)`);
214
-
215
- const narrative = await callAnalyst(payloadJson, status);
216
- if (!narrative) {
217
- send({ type: "error", message: "Analyst returned no parseable JSON." });
218
- finish();
219
- return;
220
- }
221
-
222
- // Phase 3 · Compose
223
- status("compose", "Merging aggregates + narrative");
224
- const report = mergeReport(bundle, narrative, range, payloadKb, priorBaseline);
225
- report.meta.pipeline_ms = Date.now() - t0;
226
-
227
- send({ type: "report", report });
228
-
229
- // Persistence
230
- if (!range.in_progress) {
231
- status("compose", "Saving report to disk");
232
- const key = keyForRange(range.range_type, bundle.period.start);
233
- try {
234
- await saveReport(key, report);
235
- send({ type: "saved", key, saved_at: new Date().toISOString() });
236
- } catch (e) {
237
- send({ type: "status", phase: "compose", text: `(save failed: ${(e as Error).message})` });
238
- }
239
- }
240
-
241
- send({ type: "done" });
242
- finish();
243
- } catch (err) {
244
- send({ type: "error", message: (err as Error).message });
245
- finish();
246
- }
247
- },
248
- });
249
-
250
- return new Response(stream, {
251
- headers: {
252
- "Content-Type": "text/event-stream",
253
- "Cache-Control": "no-cache, no-transform",
254
- Connection: "keep-alive",
255
- "X-Accel-Buffering": "no",
256
- },
257
- });
258
- }
259
-
260
- // ──────────────────────────────────────────────────────────────────
261
- // Spawn claude -p, parse JSON
262
- // ──────────────────────────────────────────────────────────────────
263
-
264
- async function callAnalyst(
265
- payloadJson: string,
266
- status: (phase: "data" | "analyst" | "compose", text: string) => void,
267
- ): Promise<Narrative | null> {
268
- const userPrompt = `Period payload:\n\n${payloadJson}\n\n---\n\nReturn the JSON per your system instructions.`;
269
-
270
- return new Promise((resolve) => {
271
- const args = [
272
- "-p",
273
- "--output-format", "stream-json",
274
- "--verbose",
275
- "--model", "sonnet",
276
- "--tools", "",
277
- "--disable-slash-commands",
278
- "--no-session-persistence",
279
- "--setting-sources", "",
280
- "--append-system-prompt", INSIGHTS_SYSTEM_PROMPT,
281
- ];
282
- const proc = spawn("claude", args, { stdio: ["pipe", "pipe", "pipe"], env: { ...process.env } });
283
- proc.stdin.write(userPrompt);
284
- proc.stdin.end();
285
-
286
- let buffer = "";
287
- let lastReportedKb = -1;
288
- const phaseStart = Date.now();
289
- proc.stdout.on("data", (chunk: Buffer) => {
290
- const text = chunk.toString("utf8");
291
- for (const line of text.split("\n")) {
292
- const trimmed = line.trim();
293
- if (!trimmed) continue;
294
- try {
295
- const obj = JSON.parse(trimmed) as Record<string, unknown>;
296
- if (obj.type === "assistant") {
297
- const msg = obj.message as Record<string, unknown> | undefined;
298
- const content = msg?.content as Array<Record<string, unknown>> | undefined;
299
- if (Array.isArray(content)) {
300
- for (const block of content) {
301
- if (block.type === "text" && typeof block.text === "string") {
302
- buffer += block.text;
303
- const kb = Math.floor(buffer.length / 1024);
304
- if (kb > lastReportedKb) {
305
- lastReportedKb = kb;
306
- const secs = Math.round((Date.now() - phaseStart) / 1000);
307
- status("analyst", `Claude composing… ${buffer.length.toLocaleString()} chars (${secs}s)`);
308
- }
309
- }
310
- }
311
- }
312
- }
313
- } catch { /* skip non-JSON framing */ }
314
- }
315
- });
316
- proc.on("close", () => {
317
- const json = extractJsonBlock(buffer);
318
- if (!json) { resolve(null); return; }
319
- try { resolve(JSON.parse(json) as Narrative); }
320
- catch { resolve(null); }
321
- });
322
- proc.on("error", () => resolve(null));
323
- });
324
- }
325
-
326
- function extractJsonBlock(s: string): string | null {
327
- const fence = /```json\s*([\s\S]*?)```/m.exec(s);
328
- if (fence) return fence[1]!.trim();
329
- const first = s.indexOf("{");
330
- const last = s.lastIndexOf("}");
331
- if (first !== -1 && last > first) return s.slice(first, last + 1);
332
- return null;
333
- }
334
-
335
- // ──────────────────────────────────────────────────────────────────
336
- // Merge → ReportData
337
- // ──────────────────────────────────────────────────────────────────
338
-
339
- type PriorWeek = {
340
- period_label: string;
341
- archetype: string;
342
- sessions: number;
343
- prs: number;
344
- subagents: number;
345
- agent_minutes: number;
346
- };
347
-
348
- async function loadPriorWeeks(limit: number): Promise<PriorWeek[]> {
349
- const all = await listSavedReports();
350
- const weeks = all.filter((r) => r.key.startsWith("week-")).slice(0, limit);
351
- const out: PriorWeek[] = [];
352
- for (const meta of weeks) {
353
- const r = await getSavedReport(meta.key);
354
- if (!r) continue;
355
- out.push({
356
- period_label: r.period_label,
357
- archetype: r.archetype.label,
358
- sessions: r.meta.sessions_used,
359
- prs: r.shipped.length,
360
- subagents: r.concurrency.peak, // rough proxy for ambition
361
- agent_minutes: r.days.reduce((a, d) => a + d.agent_minutes, 0),
362
- });
363
- }
364
- return out;
365
- }
366
-
367
- function mergeReport(
368
- bundle: PeriodBundle,
369
- n: Narrative,
370
- range: { in_progress: boolean },
371
- contextKb: number,
372
- priorWeeks: PriorWeek[],
373
- ): ReportData {
374
- const skillEntries = Object.entries(bundle.skills_total).sort((a, b) => b[1] - a[1]);
375
- const top_skills = skillEntries.slice(0, 6).map(([name, count]) => ({ name, count }));
376
-
377
- const days = bundle.by_day.map((d, i) => {
378
- const concOfDay = bundle.concurrency?.by_day[i];
379
- const useOfDay = bundle.usage?.by_day.find((u) => u.date === d.date);
380
- return {
381
- day_name: d.day_name,
382
- date_label: new Date(d.date).toLocaleDateString("en-US", { month: "short", day: "numeric" }),
383
- agent_minutes: Math.round(d.agent_min),
384
- sessions: d.sessions,
385
- concurrency_peak: concOfDay?.peak ?? 0,
386
- has_cross_project: Boolean(concOfDay?.has_cross_project),
387
- plan_util_pct: useOfDay?.peak_util_pct ?? 0,
388
- is_partial: new Date(d.date).getTime() > Date.now(),
389
- };
390
- });
391
-
392
- const projects = bundle.project_shares.map((p) => ({
393
- name: p.name,
394
- display_name: p.display_name,
395
- agent_minutes: Math.round(p.agent_min),
396
- share_pct: p.share_pct,
397
- prs: p.prs,
398
- commits: p.commits,
399
- }));
400
-
401
- const shipped = bundle.shipped_prs.map((s) => ({
402
- title: s.title,
403
- project: s.project,
404
- duration_label: fmtDuration(s.active_min),
405
- commits: s.commits,
406
- subagents: s.subagents,
407
- flags: s.flags,
408
- summary: n.shipped_summaries[s.session_id] ?? "",
409
- }));
410
-
411
- const outliers: ReportData["outliers"] = [];
412
- if (bundle.outliers.longest_run) {
413
- outliers.push({
414
- label: "Longest run",
415
- detail: fmtDuration(bundle.outliers.longest_run.active_min),
416
- note: n.outlier_notes.longest_run ?? bundle.outliers.longest_run.project,
417
- });
418
- }
419
- if (bundle.outliers.fastest_ship) {
420
- outliers.push({
421
- label: "Fastest ship",
422
- detail: fmtDuration(bundle.outliers.fastest_ship.active_min),
423
- note: n.outlier_notes.fastest_ship ?? bundle.outliers.fastest_ship.pr_title,
424
- });
425
- }
426
- if (bundle.outliers.most_errors) {
427
- outliers.push({
428
- label: "Most errors",
429
- detail: String(bundle.outliers.most_errors.tool_errors),
430
- note: n.outlier_notes.most_errors ?? bundle.outliers.most_errors.project,
431
- });
432
- }
433
- if (bundle.outliers.wandered) {
434
- outliers.push({
435
- label: "Wandered",
436
- detail: fmtDuration(bundle.outliers.wandered.active_min),
437
- note: n.outlier_notes.wandered ?? bundle.outliers.wandered.project,
438
- });
439
- }
440
-
441
- const in_progress_suffix = range.in_progress ? " · in progress" : "";
442
- const periodPrefix =
443
- bundle.period.range_type === "4weeks" ? "Last 4 weeks ·"
444
- : bundle.period.range_type === "month" ? "Month of"
445
- : "Week of";
446
- const sublabel =
447
- bundle.period.range_type === "4weeks" ? "Calendar 4-week rollup"
448
- : bundle.period.range_type === "month" ? "Calendar month"
449
- : "Calendar week · Mon–Sun";
450
-
451
- return {
452
- period_label: `${periodPrefix} ${bundle.period.label}`,
453
- period_sublabel: `${sublabel}${in_progress_suffix}`,
454
- range_type: bundle.period.range_type,
455
- archetype: {
456
- label: n.archetype.label,
457
- icon: safeIcon(n.archetype.icon),
458
- tagline: n.archetype.tagline,
459
- why: n.archetype.why,
460
- vs_usual: n.archetype.vs_usual,
461
- },
462
- top_skills,
463
- days,
464
- theme_headline: n.theme_headline,
465
- projects,
466
- shipped,
467
- patterns: n.patterns.map((p) => ({
468
- icon: safeIcon(p.icon), title: p.title, stat: p.stat, note: p.note,
469
- })),
470
- concurrency: {
471
- multi_agent_days: bundle.concurrency?.multi_agent_days ?? 0,
472
- peak: bundle.concurrency?.peak ?? 0,
473
- peak_day: bundle.concurrency?.peak_day
474
- ? new Date(bundle.concurrency.peak_day).toLocaleDateString("en-US", { weekday: "short", month: "short", day: "numeric" })
475
- : "—",
476
- cross_project_days: bundle.concurrency?.cross_project_days ?? 0,
477
- insight: n.concurrency_insight,
478
- suggestion: n.concurrency_suggestion,
479
- },
480
- outliers,
481
- suggestion_headline: n.suggestion_headline,
482
- suggestion_body: n.suggestion_body,
483
- prior_weeks: priorWeeks,
484
- saved_reports: [],
485
- meta: {
486
- generated_at: new Date().toISOString().replace("T", " ").slice(0, 16),
487
- sessions_total: bundle.counts.sessions_total,
488
- sessions_used: bundle.counts.substantive,
489
- trivial_dropped: bundle.counts.trivial_dropped,
490
- model: "claude-sonnet-4-6",
491
- pipeline_ms: 0,
492
- context_kb: contextKb,
493
- },
494
- };
495
- }
496
-
497
- function fmtDuration(minutes: number): string {
498
- if (minutes < 60) {
499
- const whole = Math.floor(minutes);
500
- const secs = Math.round((minutes - whole) * 60);
501
- if (whole === 0 && secs > 0) return `${secs}s`;
502
- if (secs === 0) return `${whole}m`;
503
- return `${whole}m ${secs}s`;
504
- }
505
- const h = Math.floor(minutes / 60);
506
- const m = Math.round(minutes - h * 60);
507
- return `${h}h ${m}m`;
508
- }
@@ -1,11 +0,0 @@
1
- import { getSavedReport } from "@/lib/ai/saved-reports";
2
-
3
- export const dynamic = "force-dynamic";
4
- export const runtime = "nodejs";
5
-
6
- export async function GET(_req: Request, ctx: { params: Promise<{ key: string }> }) {
7
- const { key } = await ctx.params;
8
- const report = await getSavedReport(key);
9
- if (!report) return Response.json({ error: "not found" }, { status: 404 });
10
- return Response.json({ report });
11
- }
@@ -1,9 +0,0 @@
1
- import { listSavedReports } from "@/lib/ai/saved-reports";
2
-
3
- export const dynamic = "force-dynamic";
4
- export const runtime = "nodejs";
5
-
6
- export async function GET() {
7
- const reports = await listSavedReports();
8
- return Response.json({ reports });
9
- }
@@ -1,73 +0,0 @@
1
- /**
2
- * Print-mode rendering target for `/api/insights/pdf/[key]`.
3
- *
4
- * Server-renders the saved report with the sidebar and floating widgets
5
- * hidden, light theme forced, and print-optimised spacing. Chrome headless
6
- * points at this URL when generating the PDF.
7
- */
8
- import { notFound } from "next/navigation";
9
- import { InsightReport } from "@/components/insight-report";
10
- import { getSavedReport } from "@/lib/ai/saved-reports";
11
-
12
- export const dynamic = "force-dynamic";
13
-
14
- export default async function PrintInsightPage({
15
- params,
16
- }: { params: Promise<{ key: string }> }) {
17
- const { key } = await params;
18
- const report = await getSavedReport(key);
19
- if (!report) notFound();
20
-
21
- return (
22
- <div data-theme="light" data-print-mode="true" style={{ background: "white" }}>
23
- <style>{`
24
- /* Neutralise the root-layout viewport lock so content paginates freely. */
25
- html, body {
26
- height: auto !important;
27
- min-height: 0 !important;
28
- overflow: visible !important;
29
- background: white !important;
30
- margin: 0 !important;
31
- padding: 0 !important;
32
- }
33
- body > div[style*="height: 100vh"],
34
- body > div[style*="height:100vh"] {
35
- display: block !important;
36
- height: auto !important;
37
- min-height: 0 !important;
38
- }
39
- main {
40
- flex: none !important;
41
- padding: 0 !important;
42
- margin: 0 !important;
43
- width: 100% !important;
44
- min-height: 0 !important;
45
- overflow: visible !important;
46
- }
47
-
48
- /* Hide everything that isn't the report itself. */
49
- aside, [data-sidebar], .af-sidebar,
50
- [data-live-refresher], .af-live-widget,
51
- nav[aria-label="Main"], header[data-app-header] { display: none !important; }
52
- .no-print { display: none !important; }
53
-
54
- /* Report layout tuned for letter paper. */
55
- .report-root {
56
- max-width: none !important;
57
- margin: 0 !important;
58
- padding: 36px 48px 48px !important;
59
- color: var(--af-text) !important;
60
- }
61
- .report-root section { page-break-inside: auto; }
62
- .report-root section > header,
63
- .report-root [role="heading"],
64
- .report-root h1, .report-root h2, .report-root h3 {
65
- page-break-after: avoid;
66
- break-after: avoid;
67
- }
68
- @page { size: letter; margin: 0.4in; }
69
- `}</style>
70
- <InsightReport data={report} />
71
- </div>
72
- );
73
- }