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
@@ -24,6 +24,8 @@ import type {
24
24
  SubagentRun,
25
25
  PrMarker,
26
26
  } from "@claude-lens/parser";
27
+ import type { Entry } from "@claude-lens/entries";
28
+ import { OutcomePill } from "@/components/outcome-pill";
27
29
  import {
28
30
  buildPresentation,
29
31
  buildMegaRows,
@@ -35,7 +37,7 @@ import {
35
37
  type TurnMegaRow,
36
38
  type TurnSummary,
37
39
  } from "@claude-lens/parser";
38
- import { formatGap, formatOffset, formatRelative, formatTokens, shortId } from "@/lib/format";
40
+ import { estimateCost, formatCost, formatGap, formatOffset, formatRelative, formatTokens, shortId } from "@/lib/format";
39
41
  import { LiveBadge } from "@/components/live-badge";
40
42
  import { AskClaudeButton, AskClaudeDrawer } from "@/components/ask-claude";
41
43
  import { TailMode } from "@/components/tail-mode";
@@ -97,10 +99,12 @@ export function SessionView({
97
99
  session,
98
100
  team,
99
101
  teamLead,
102
+ entries = [],
100
103
  }: {
101
104
  session: SessionDetail;
102
105
  team?: (TimelineData & { teamName: string }) | null;
103
106
  teamLead?: { leadSessionId: string; teamName: string; agentName: string } | null;
107
+ entries?: Entry[];
104
108
  }) {
105
109
  const readHash = (): TabId => {
106
110
  if (typeof window === "undefined") return "transcript";
@@ -286,6 +290,21 @@ export function SessionView({
286
290
  /** Detect PR creations in this session. */
287
291
  const prMarkers = useMemo(() => detectPrMarkers(session), [session]);
288
292
 
293
+ const coldResumeMarkers = useMemo(() => {
294
+ const seen = new Set<string>();
295
+ const out: {
296
+ tOffsetMs: number;
297
+ info: NonNullable<SessionEvent["coldResume"]>;
298
+ }[] = [];
299
+ for (const e of events) {
300
+ if (!e.coldResume || !e.messageId || e.tOffsetMs === undefined) continue;
301
+ if (seen.has(e.messageId)) continue;
302
+ seen.add(e.messageId);
303
+ out.push({ tOffsetMs: e.tOffsetMs, info: e.coldResume });
304
+ }
305
+ return out;
306
+ }, [events]);
307
+
289
308
  /** Build the full presentation stream once. */
290
309
  const allRows = useMemo(() => buildPresentation(visibleEvents), [visibleEvents]);
291
310
 
@@ -541,6 +560,18 @@ export function SessionView({
541
560
  )}
542
561
  <InlineStatDivider />
543
562
  <InlineTokenStat usage={totalUsage} />
563
+ {session.coldResumeCount !== undefined &&
564
+ session.coldResumeCount > 0 &&
565
+ session.cacheRebuildTokens !== undefined && (
566
+ <>
567
+ <InlineStatDivider />
568
+ <ColdResumeSessionStat
569
+ count={session.coldResumeCount}
570
+ writeTokens={session.cacheRebuildTokens}
571
+ model={model}
572
+ />
573
+ </>
574
+ )}
544
575
  <InlineStatDivider />
545
576
  <InlineStat value={`${eventCount} events`} />
546
577
  {prMarkers.length > 0 && (
@@ -675,6 +706,8 @@ export function SessionView({
675
706
  subagents={session.subagents}
676
707
  collapsed={collapsed}
677
708
  prMarkers={prMarkers}
709
+ coldResumeMarkers={coldResumeMarkers}
710
+ model={model}
678
711
  selectedSubagentId={selectedSubagentId}
679
712
  onSelectSubagent={(id) => {
680
713
  setSelectedSubagentId(id);
@@ -709,6 +742,11 @@ export function SessionView({
709
742
  />
710
743
  ) : tab === "transcript" ? (
711
744
  <>
745
+ {entries.length > 0 && (
746
+ <div style={{ display: "flex", flexDirection: "column", gap: 10, marginBottom: 14 }}>
747
+ {entries.map((e) => <EntryDayStrip key={e.local_day} entry={e} />)}
748
+ </div>
749
+ )}
712
750
  {teammateCount > 0 && (
713
751
  <div
714
752
  style={{
@@ -749,6 +787,7 @@ export function SessionView({
749
787
  stickyOffset={headerH + 16}
750
788
  isSessionLive={isSessionLive}
751
789
  team={team}
790
+ model={model}
752
791
  />
753
792
  </>
754
793
  ) : (
@@ -1031,7 +1070,7 @@ function InlineStatDivider() {
1031
1070
  }
1032
1071
 
1033
1072
  function InlineTokenStat({ usage }: { usage: SessionEvent["usage"] }) {
1034
- const [hover, setHover] = useState(false);
1073
+ const { ref, anchor, open, close } = useAnchoredTooltip();
1035
1074
  const u = usage ?? { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };
1036
1075
  const totalIn = u.input + u.cacheRead + u.cacheWrite;
1037
1076
  const pctRead = totalIn > 0 ? Math.round((u.cacheRead / totalIn) * 100) : 0;
@@ -1039,8 +1078,8 @@ function InlineTokenStat({ usage }: { usage: SessionEvent["usage"] }) {
1039
1078
 
1040
1079
  return (
1041
1080
  <span
1081
+ ref={ref}
1042
1082
  style={{
1043
- position: "relative",
1044
1083
  display: "inline-flex",
1045
1084
  alignItems: "center",
1046
1085
  gap: 6,
@@ -1049,20 +1088,15 @@ function InlineTokenStat({ usage }: { usage: SessionEvent["usage"] }) {
1049
1088
  cursor: "default",
1050
1089
  fontFamily: "var(--font-mono)",
1051
1090
  }}
1052
- onMouseEnter={() => setHover(true)}
1053
- onMouseLeave={() => setHover(false)}
1091
+ onMouseEnter={open}
1092
+ onMouseLeave={close}
1054
1093
  >
1055
- {/* Primary: fresh input / output. This is the actually-new
1056
- per-request context — distinct from the cached context that
1057
- dominates most agentic sessions (often 99%+). */}
1058
1094
  <span>
1059
1095
  {formatTokens(u.input)}
1060
1096
  <span style={{ color: "var(--af-text-tertiary)", margin: "0 3px" }}>in</span>
1061
1097
  {formatTokens(u.output)}
1062
1098
  <span style={{ color: "var(--af-text-tertiary)", marginLeft: 3 }}>out</span>
1063
1099
  </span>
1064
- {/* Secondary: cached context as a separate hint so the header
1065
- doesn't lump 50M+ cache hits into the "tokens" number. */}
1066
1100
  {cached > 0 && (
1067
1101
  <span
1068
1102
  style={{
@@ -1075,14 +1109,8 @@ function InlineTokenStat({ usage }: { usage: SessionEvent["usage"] }) {
1075
1109
  +{formatTokens(cached)} cached
1076
1110
  </span>
1077
1111
  )}
1078
- {hover && (
1079
- <Tooltip
1080
- style={{
1081
- bottom: "calc(100% + 6px)",
1082
- left: 0,
1083
- minWidth: 240,
1084
- }}
1085
- >
1112
+ {anchor && (
1113
+ <AnchoredTooltip anchor={anchor} width={280}>
1086
1114
  <TooltipRow label="Input (fresh)" value={u.input.toLocaleString()} />
1087
1115
  <TooltipRow label="Output" value={u.output.toLocaleString()} />
1088
1116
  <TooltipRow label="Cache read" value={`${u.cacheRead.toLocaleString()} (${pctRead}%)`} />
@@ -1100,12 +1128,60 @@ function InlineTokenStat({ usage }: { usage: SessionEvent["usage"] }) {
1100
1128
  >
1101
1129
  Cache reads are cumulative across all API requests and billed at ~10% of regular input.
1102
1130
  </div>
1103
- </Tooltip>
1131
+ </AnchoredTooltip>
1104
1132
  )}
1105
1133
  </span>
1106
1134
  );
1107
1135
  }
1108
1136
 
1137
+ // Used for tooltips that live inside an overflow:hidden ancestor (like the
1138
+ // session-header row). getBoundingClientRect + position:fixed lets the
1139
+ // tooltip escape the clipping context instead of being cropped.
1140
+ function useAnchoredTooltip() {
1141
+ const ref = useRef<HTMLSpanElement>(null);
1142
+ const [anchor, setAnchor] = useState<{ top: number; left: number } | null>(null);
1143
+ const open = () => {
1144
+ if (!ref.current) return;
1145
+ const r = ref.current.getBoundingClientRect();
1146
+ setAnchor({ top: r.bottom + 6, left: r.left });
1147
+ };
1148
+ const close = () => setAnchor(null);
1149
+ return { ref, anchor, open, close };
1150
+ }
1151
+
1152
+ function AnchoredTooltip({
1153
+ anchor,
1154
+ width,
1155
+ children,
1156
+ }: {
1157
+ anchor: { top: number; left: number };
1158
+ width: number;
1159
+ children: React.ReactNode;
1160
+ }) {
1161
+ return (
1162
+ <div
1163
+ style={{
1164
+ position: "fixed",
1165
+ top: anchor.top,
1166
+ left: anchor.left,
1167
+ zIndex: 1000,
1168
+ background: "#1A1A1A",
1169
+ color: "#F5F1EC",
1170
+ padding: "8px 12px",
1171
+ borderRadius: 6,
1172
+ fontSize: 11,
1173
+ fontFamily: "var(--font-mono)",
1174
+ lineHeight: 1.5,
1175
+ pointerEvents: "none",
1176
+ boxShadow: "0 4px 16px rgba(15,23,42,0.24)",
1177
+ width,
1178
+ }}
1179
+ >
1180
+ {children}
1181
+ </div>
1182
+ );
1183
+ }
1184
+
1109
1185
  /* ------------------------------------------------------------------ */
1110
1186
  /* Generic Tooltip */
1111
1187
  /* ------------------------------------------------------------------ */
@@ -1208,6 +1284,8 @@ function Minimap({
1208
1284
  selectedSubagentId,
1209
1285
  onSelectSubagent,
1210
1286
  prMarkers,
1287
+ coldResumeMarkers,
1288
+ model,
1211
1289
  }: {
1212
1290
  displayRows: DisplayRow[];
1213
1291
  durationMs: number;
@@ -1219,6 +1297,11 @@ function Minimap({
1219
1297
  selectedSubagentId?: string | null;
1220
1298
  onSelectSubagent?: (id: string | null) => void;
1221
1299
  prMarkers?: PrMarker[];
1300
+ coldResumeMarkers?: {
1301
+ tOffsetMs: number;
1302
+ info: NonNullable<SessionEvent["coldResume"]>;
1303
+ }[];
1304
+ model?: string;
1222
1305
  }) {
1223
1306
  const WIDTH = 1400;
1224
1307
  /** Main timeline height. Sub-agent lanes stack below this. */
@@ -1247,6 +1330,10 @@ function Minimap({
1247
1330
  idleMs?: number;
1248
1331
  subagent?: SubagentRun;
1249
1332
  pr?: PrMarker;
1333
+ cold?: {
1334
+ tOffsetMs: number;
1335
+ info: NonNullable<SessionEvent["coldResume"]>;
1336
+ };
1250
1337
  } | null>(null);
1251
1338
  const [playheadMs, setPlayheadMs] = useState<number | null>(null);
1252
1339
  const containerRef = useRef<HTMLDivElement>(null);
@@ -1777,6 +1864,41 @@ function Minimap({
1777
1864
  );
1778
1865
  })}
1779
1866
 
1867
+ {coldResumeMarkers?.map((cr, i) => {
1868
+ const x = msToX(cr.tOffsetMs);
1869
+ return (
1870
+ <g
1871
+ key={`cold-${i}`}
1872
+ style={{ cursor: "pointer" }}
1873
+ onMouseEnter={(e) => setHover({ clientX: e.clientX, cold: cr })}
1874
+ >
1875
+ <line
1876
+ x1={x}
1877
+ x2={x}
1878
+ y1={0}
1879
+ y2={TOTAL_H}
1880
+ stroke="#D97706"
1881
+ strokeWidth="1.5"
1882
+ strokeDasharray="4 3"
1883
+ opacity="0.75"
1884
+ />
1885
+ <rect
1886
+ x={x - 8}
1887
+ y={0}
1888
+ width={16}
1889
+ height={TOTAL_H}
1890
+ fill="transparent"
1891
+ />
1892
+ <polygon
1893
+ points={`${x},${MAIN_H / 2 - 5} ${x + 5},${MAIN_H / 2} ${x},${MAIN_H / 2 + 5} ${x - 5},${MAIN_H / 2}`}
1894
+ fill="#D97706"
1895
+ stroke="var(--af-surface)"
1896
+ strokeWidth="1.5"
1897
+ />
1898
+ </g>
1899
+ );
1900
+ })}
1901
+
1780
1902
  {/* Playhead — positioned against the relaxed layout, not raw time.
1781
1903
  Spans the full SVG height (main + subagent lanes) so you can see
1782
1904
  which subagents were running at the current scroll position. */}
@@ -1804,6 +1926,8 @@ function Minimap({
1804
1926
  idleMs={hover.idleMs}
1805
1927
  subagent={hover.subagent}
1806
1928
  pr={hover.pr}
1929
+ cold={hover.cold}
1930
+ model={model}
1807
1931
  />
1808
1932
  )}
1809
1933
 
@@ -1891,6 +2015,8 @@ function MinimapHoverCard({
1891
2015
  idleMs,
1892
2016
  subagent,
1893
2017
  pr,
2018
+ cold,
2019
+ model,
1894
2020
  }: {
1895
2021
  containerRef: React.RefObject<HTMLDivElement | null>;
1896
2022
  clientX: number;
@@ -1899,6 +2025,8 @@ function MinimapHoverCard({
1899
2025
  idleMs?: number;
1900
2026
  subagent?: SubagentRun;
1901
2027
  pr?: PrMarker;
2028
+ cold?: { tOffsetMs: number; info: NonNullable<SessionEvent["coldResume"]> };
2029
+ model?: string;
1902
2030
  }) {
1903
2031
  const rect = containerRef.current?.getBoundingClientRect();
1904
2032
  const localX = rect ? clientX - rect.left : 0;
@@ -2014,6 +2142,77 @@ function MinimapHoverCard({
2014
2142
  );
2015
2143
  }
2016
2144
 
2145
+ if (cold) {
2146
+ const { trigger, gapMs, writeTokens, compact } = cold.info;
2147
+ const isCompact = trigger === "compact";
2148
+ const estUsd = estimateCost(
2149
+ { input: 0, output: 0, cacheRead: 0, cacheWrite: writeTokens },
2150
+ model,
2151
+ );
2152
+ let label: string;
2153
+ if (!isCompact) label = "⚡ CACHE REBUILD";
2154
+ else if (compact?.trigger === "auto") label = "⚡ AUTO-COMPACT";
2155
+ else label = "⚡ /COMPACT";
2156
+ const detailLine = isCompact
2157
+ ? `${formatTokens(writeTokens)} rewritten · pre-compact ${formatTokens(compact?.preTokens ?? 0)}`
2158
+ : `${formatTokens(writeTokens)} rewritten · idle ${formatGap(gapMs)}`;
2159
+ const hint = isCompact
2160
+ ? "Conversation was summarized; prefix had to be rewritten into a fresh cache."
2161
+ : "Prompt cache expired during idle; resuming within 5 min keeps it warm.";
2162
+ return (
2163
+ <div
2164
+ style={{
2165
+ position: "absolute",
2166
+ ...posStyle,
2167
+ zIndex: 100,
2168
+ background: "#0F172A",
2169
+ color: "#F1F5F9",
2170
+ borderRadius: 10,
2171
+ padding: "10px 14px",
2172
+ fontSize: 11,
2173
+ pointerEvents: "none",
2174
+ boxShadow: "0 6px 24px rgba(15,23,42,0.22)",
2175
+ maxWidth: 340,
2176
+ minWidth: 220,
2177
+ lineHeight: 1.45,
2178
+ }}
2179
+ >
2180
+ <div style={{ display: "flex", alignItems: "center", gap: 8, marginBottom: 4 }}>
2181
+ <span
2182
+ style={{
2183
+ fontSize: 10,
2184
+ fontWeight: 600,
2185
+ padding: "2px 8px",
2186
+ borderRadius: 4,
2187
+ background: "#D97706",
2188
+ color: "#fff",
2189
+ }}
2190
+ >
2191
+ {label}
2192
+ </span>
2193
+ <span style={{ fontFamily: "var(--font-mono)", fontSize: 10, opacity: 0.7 }}>
2194
+ at {formatOffset(cold.tOffsetMs)}
2195
+ </span>
2196
+ </div>
2197
+ <div style={{ fontWeight: 500, fontFamily: "var(--font-mono)" }}>
2198
+ {detailLine}
2199
+ {estUsd >= 0.005 && ` · est. ${formatCost(estUsd)}`}
2200
+ </div>
2201
+ <div
2202
+ style={{
2203
+ marginTop: 4,
2204
+ fontSize: 10,
2205
+ opacity: 0.65,
2206
+ fontStyle: "italic",
2207
+ whiteSpace: "normal",
2208
+ }}
2209
+ >
2210
+ {hint}
2211
+ </div>
2212
+ </div>
2213
+ );
2214
+ }
2215
+
2017
2216
  if (pr) {
2018
2217
  const label = pr.title
2019
2218
  ? `PR${pr.prNumber ? ` #${pr.prNumber}` : ""}: ${pr.title}`
@@ -2314,6 +2513,7 @@ function TranscriptList({
2314
2513
  stickyOffset,
2315
2514
  isSessionLive,
2316
2515
  team,
2516
+ model,
2317
2517
  }: {
2318
2518
  displayRows: DisplayRow[];
2319
2519
  rowRefs: React.MutableRefObject<Record<number, HTMLDivElement | null>>;
@@ -2323,6 +2523,7 @@ function TranscriptList({
2323
2523
  stickyOffset: number;
2324
2524
  isSessionLive?: boolean;
2325
2525
  team?: (TimelineData & { teamName: string }) | null;
2526
+ model?: string;
2326
2527
  }) {
2327
2528
  // Find the last collapsed turn index so we can mark it as in-progress
2328
2529
  // when the session is live.
@@ -2343,6 +2544,7 @@ function TranscriptList({
2343
2544
  // Collapsed turn summary row
2344
2545
  if (d.kind === "turn-collapsed") {
2345
2546
  const idx = d.turn.firstPrimaryIndex;
2547
+ const turnCold = findColdResumeInDisplayRow(d);
2346
2548
  out.push(
2347
2549
  <CollapsedTurnRow
2348
2550
  key={`turn-${idx}`}
@@ -2351,6 +2553,8 @@ function TranscriptList({
2351
2553
  onClick={() => onToggleTurn(idx)}
2352
2554
  inProgress={i === lastCollapsedTurnIdx}
2353
2555
  team={team}
2556
+ coldResume={turnCold ?? undefined}
2557
+ model={model}
2354
2558
  refCb={(el) => {
2355
2559
  rowRefs.current[idx] = el;
2356
2560
  }}
@@ -2361,11 +2565,14 @@ function TranscriptList({
2361
2565
 
2362
2566
  // Expanded turn header
2363
2567
  if (d.kind === "turn-expanded-header") {
2568
+ const turnCold = findColdResumeInDisplayRow(d);
2364
2569
  out.push(
2365
2570
  <ExpandedTurnHeader
2366
2571
  key={`turnhead-${d.turn.firstPrimaryIndex}`}
2367
2572
  turn={d.turn}
2368
2573
  onClick={() => onToggleTurn(d.turn.firstPrimaryIndex)}
2574
+ coldResume={turnCold ?? undefined}
2575
+ model={model}
2369
2576
  />,
2370
2577
  );
2371
2578
  continue;
@@ -2430,6 +2637,212 @@ function IdleDivider({ gapMs }: { gapMs: number }) {
2430
2637
  );
2431
2638
  }
2432
2639
 
2640
+ function findColdResumeInDisplayRow(
2641
+ d: DisplayRow,
2642
+ ): SessionEvent["coldResume"] | null {
2643
+ if (d.kind === "presentation") return findColdResumeInRow(d.row);
2644
+ if (d.kind === "turn-collapsed" || d.kind === "turn-expanded-header") {
2645
+ for (const r of d.turn.rows) {
2646
+ const hit = findColdResumeInRow(r);
2647
+ if (hit) return hit;
2648
+ }
2649
+ }
2650
+ return null;
2651
+ }
2652
+
2653
+ function findColdResumeInRow(
2654
+ r: PresentationRow,
2655
+ ): SessionEvent["coldResume"] | null {
2656
+ if (r.kind === "agent") {
2657
+ if (r.event.coldResume) return r.event.coldResume;
2658
+ for (const ge of r.groupedEvents) {
2659
+ if (ge.coldResume) return ge.coldResume;
2660
+ }
2661
+ } else if (r.kind === "tool-group") {
2662
+ for (const e of r.events) if (e.coldResume) return e.coldResume;
2663
+ }
2664
+ return null;
2665
+ }
2666
+
2667
+ function ColdResumeNotice({
2668
+ info,
2669
+ model,
2670
+ }: {
2671
+ info: NonNullable<SessionEvent["coldResume"]>;
2672
+ model?: string;
2673
+ }) {
2674
+ const { trigger, gapMs, writeTokens, writeRatio, compact } = info;
2675
+ const estUsd = estimateCost(
2676
+ { input: 0, output: 0, cacheRead: 0, cacheWrite: writeTokens },
2677
+ model,
2678
+ );
2679
+ const isCompact = trigger === "compact";
2680
+ const fullyCold = writeRatio >= 0.9;
2681
+ let title: string;
2682
+ if (!isCompact) title = `Session resumed cold · idle ${formatGap(gapMs)}`;
2683
+ else if (compact?.trigger === "auto") title = "Auto-compact rebuilt the cache";
2684
+ else title = "Conversation compacted · cache rebuilt";
2685
+ const hint = isCompact
2686
+ ? "Compaction summarizes the conversation, so the prefix must be rewritten into a fresh cache. Any /compact or auto-compact will cost this rewrite."
2687
+ : "Prompt cache expired during idle. Resuming within 5 min keeps the cache warm and avoids the rewrite tax.";
2688
+ return (
2689
+ <div
2690
+ style={{
2691
+ padding: "8px 12px",
2692
+ background: "rgba(217, 119, 6, 0.08)",
2693
+ border: "1px solid rgba(217, 119, 6, 0.35)",
2694
+ borderLeft: "3px solid rgba(217, 119, 6, 0.9)",
2695
+ borderRadius: 6,
2696
+ fontSize: 11.5,
2697
+ color: "var(--af-text-secondary)",
2698
+ lineHeight: 1.5,
2699
+ }}
2700
+ >
2701
+ <div
2702
+ style={{
2703
+ display: "flex",
2704
+ alignItems: "center",
2705
+ gap: 8,
2706
+ fontWeight: 600,
2707
+ color: "#78350F",
2708
+ letterSpacing: "0.01em",
2709
+ }}
2710
+ >
2711
+ <span style={{ fontSize: 13 }}>⚡</span>
2712
+ {title}
2713
+ </div>
2714
+ <div style={{ marginTop: 4, fontFamily: "var(--font-mono)", fontSize: 11 }}>
2715
+ Rewrote <b>{formatTokens(writeTokens)}</b> tokens into prompt cache
2716
+ {estUsd >= 0.005 && (
2717
+ <>
2718
+ {" "}
2719
+ · est. <b>{formatCost(estUsd)}</b>
2720
+ </>
2721
+ )}
2722
+ {isCompact && compact && (
2723
+ <>
2724
+ {" "}
2725
+ · pre-compact <b>{formatTokens(compact.preTokens)}</b>
2726
+ </>
2727
+ )}
2728
+ {!isCompact && (
2729
+ <>
2730
+ {" "}
2731
+ · {fullyCold ? "fully cold" : "partial"} ({Math.round(writeRatio * 100)}% write)
2732
+ </>
2733
+ )}
2734
+ </div>
2735
+ <div
2736
+ style={{
2737
+ marginTop: 3,
2738
+ fontSize: 10.5,
2739
+ color: "var(--af-text-tertiary)",
2740
+ fontStyle: "italic",
2741
+ }}
2742
+ >
2743
+ {hint}
2744
+ </div>
2745
+ </div>
2746
+ );
2747
+ }
2748
+
2749
+ function ColdResumeSessionStat({
2750
+ count,
2751
+ writeTokens,
2752
+ model,
2753
+ }: {
2754
+ count: number;
2755
+ writeTokens: number;
2756
+ model?: string;
2757
+ }) {
2758
+ const { ref, anchor, open, close } = useAnchoredTooltip();
2759
+ const estUsd = estimateCost(
2760
+ { input: 0, output: 0, cacheRead: 0, cacheWrite: writeTokens },
2761
+ model,
2762
+ );
2763
+ return (
2764
+ <span
2765
+ ref={ref}
2766
+ style={{
2767
+ display: "inline-flex",
2768
+ alignItems: "center",
2769
+ gap: 5,
2770
+ fontSize: 11.5,
2771
+ fontWeight: 600,
2772
+ color: "#78350F",
2773
+ background: "rgba(217, 119, 6, 0.12)",
2774
+ padding: "2px 8px",
2775
+ borderRadius: 100,
2776
+ cursor: "default",
2777
+ }}
2778
+ onMouseEnter={open}
2779
+ onMouseLeave={close}
2780
+ >
2781
+ <span style={{ fontSize: 12 }}>⚡</span>
2782
+ {count} cache rebuild{count === 1 ? "" : "s"} · {formatTokens(writeTokens)} rewritten
2783
+ {anchor && (
2784
+ <AnchoredTooltip anchor={anchor} width={320}>
2785
+ <TooltipRow label="Cache rebuilds" value={count.toLocaleString()} />
2786
+ <TooltipRow label="Tokens rewritten" value={writeTokens.toLocaleString()} />
2787
+ {estUsd >= 0.005 && (
2788
+ <TooltipRow label="Est. rebuild cost" value={formatCost(estUsd)} />
2789
+ )}
2790
+ <div
2791
+ style={{
2792
+ marginTop: 6,
2793
+ paddingTop: 6,
2794
+ borderTop: "1px solid rgba(241,245,249,0.12)",
2795
+ opacity: 0.65,
2796
+ fontSize: 10,
2797
+ whiteSpace: "normal",
2798
+ lineHeight: 1.4,
2799
+ }}
2800
+ >
2801
+ Turns where the whole prompt-cache prefix had to be rewritten.
2802
+ Either the cache expired during a long idle gap, or a /compact
2803
+ (manual or auto) summarized the conversation. Both cost tokens
2804
+ at 1.25× base input price.
2805
+ </div>
2806
+ </AnchoredTooltip>
2807
+ )}
2808
+ </span>
2809
+ );
2810
+ }
2811
+
2812
+ function ColdResumeChip({
2813
+ info,
2814
+ model,
2815
+ }: {
2816
+ info: NonNullable<SessionEvent["coldResume"]>;
2817
+ model?: string;
2818
+ }) {
2819
+ const { writeTokens } = info;
2820
+ const estUsd = estimateCost(
2821
+ { input: 0, output: 0, cacheRead: 0, cacheWrite: writeTokens },
2822
+ model,
2823
+ );
2824
+ return (
2825
+ <span
2826
+ title={`Prompt cache expired during idle; this turn rewrote ${writeTokens.toLocaleString()} tokens into cache${estUsd >= 0.005 ? ` (est. ${formatCost(estUsd)})` : ""}.`}
2827
+ style={{
2828
+ display: "inline-flex",
2829
+ alignItems: "center",
2830
+ gap: 4,
2831
+ fontSize: 10.5,
2832
+ fontWeight: 600,
2833
+ padding: "2px 7px",
2834
+ borderRadius: 3,
2835
+ background: "rgba(217, 119, 6, 0.14)",
2836
+ color: "#78350F",
2837
+ letterSpacing: "0.01em",
2838
+ cursor: "default",
2839
+ }}
2840
+ >
2841
+ ⚡ cold resume · {formatTokens(writeTokens)} rewritten
2842
+ </span>
2843
+ );
2844
+ }
2845
+
2433
2846
  /* ------------------------------------------------------------------ */
2434
2847
  /* Collapsed turn row */
2435
2848
  /* */
@@ -2446,6 +2859,8 @@ function CollapsedTurnRow({
2446
2859
  stickyOffset,
2447
2860
  inProgress,
2448
2861
  team,
2862
+ coldResume,
2863
+ model,
2449
2864
  }: {
2450
2865
  turn: TurnMegaRow;
2451
2866
  /** Fires when the user wants to fully expand this turn into the
@@ -2456,6 +2871,8 @@ function CollapsedTurnRow({
2456
2871
  stickyOffset: number;
2457
2872
  inProgress?: boolean;
2458
2873
  team?: (TimelineData & { teamName: string }) | null;
2874
+ coldResume?: NonNullable<SessionEvent["coldResume"]>;
2875
+ model?: string;
2459
2876
  }) {
2460
2877
  const theme = ROLE_THEMES.agent;
2461
2878
  const s = turn.summary;
@@ -2526,7 +2943,7 @@ function CollapsedTurnRow({
2526
2943
  Agent
2527
2944
  </span>
2528
2945
 
2529
- {/* Col 3 — content (first · stats · steps · last · bottom bar) */}
2946
+ {/* Col 3 — content (cold-resume notice · first · stats · steps · last · bottom bar) */}
2530
2947
  <div
2531
2948
  style={{
2532
2949
  minWidth: 0,
@@ -2536,6 +2953,12 @@ function CollapsedTurnRow({
2536
2953
  paddingBottom: 10,
2537
2954
  }}
2538
2955
  >
2956
+ {coldResume && (
2957
+ <div onClick={stop}>
2958
+ <ColdResumeNotice info={coldResume} model={model} />
2959
+ </div>
2960
+ )}
2961
+
2539
2962
  {/* 1. First agent message — clickable to expand into full markdown */}
2540
2963
  {firstAgentRow && (
2541
2964
  <ExpandableMessage
@@ -3027,7 +3450,17 @@ function TurnStatsLine({
3027
3450
  );
3028
3451
  }
3029
3452
 
3030
- function ExpandedTurnHeader({ turn, onClick }: { turn: TurnMegaRow; onClick: () => void }) {
3453
+ function ExpandedTurnHeader({
3454
+ turn,
3455
+ onClick,
3456
+ coldResume,
3457
+ model,
3458
+ }: {
3459
+ turn: TurnMegaRow;
3460
+ onClick: () => void;
3461
+ coldResume?: NonNullable<SessionEvent["coldResume"]>;
3462
+ model?: string;
3463
+ }) {
3031
3464
  const s = turn.summary;
3032
3465
  return (
3033
3466
  <div
@@ -3060,6 +3493,11 @@ function ExpandedTurnHeader({ turn, onClick }: { turn: TurnMegaRow; onClick: ()
3060
3493
  {s.toolCalls === 1 ? "" : "s"}
3061
3494
  {turn.durationMs !== undefined ? ` · ${formatGap(turn.durationMs)}` : ""}
3062
3495
  </span>
3496
+ {coldResume && (
3497
+ <span style={{ marginLeft: "auto" }}>
3498
+ <ColdResumeChip info={coldResume} model={model} />
3499
+ </span>
3500
+ )}
3063
3501
  </div>
3064
3502
  );
3065
3503
  }
@@ -4227,3 +4665,113 @@ function formatDurationHeader(ms: number): string {
4227
4665
  const rem = s % 60;
4228
4666
  return `${m}m ${rem}s`;
4229
4667
  }
4668
+
4669
+ function EntryDayStrip({ entry }: { entry: Entry }) {
4670
+ const fmtDate = new Date(`${entry.local_day}T12:00:00`).toLocaleDateString("en-US", {
4671
+ weekday: "short", month: "short", day: "numeric",
4672
+ });
4673
+ const durMin = Math.round(entry.numbers.active_min);
4674
+ const enr = entry.enrichment;
4675
+ const isPending = enr.status === "pending" || enr.status === "error";
4676
+ const isTrivial = enr.status === "skipped_trivial";
4677
+
4678
+ return (
4679
+ <div
4680
+ style={{
4681
+ border: "1px solid var(--af-border-subtle)",
4682
+ borderRadius: 10,
4683
+ padding: "12px 16px",
4684
+ background: "var(--af-surface)",
4685
+ fontSize: 13,
4686
+ lineHeight: 1.5,
4687
+ }}
4688
+ >
4689
+ <div style={{ display: "flex", alignItems: "center", gap: 10, flexWrap: "wrap" }}>
4690
+ <span
4691
+ style={{
4692
+ fontSize: 12,
4693
+ color: "var(--af-text-tertiary)",
4694
+ display: "inline-flex",
4695
+ alignItems: "center",
4696
+ gap: 4,
4697
+ }}
4698
+ >
4699
+ 📅 {fmtDate}
4700
+ </span>
4701
+ {isTrivial ? (
4702
+ <OutcomePill outcome="trivial" size="md" />
4703
+ ) : isPending ? (
4704
+ <OutcomePill
4705
+ outcome={null}
4706
+ pending
4707
+ sessionId={entry.session_id}
4708
+ localDay={entry.local_day}
4709
+ size="md"
4710
+ />
4711
+ ) : enr.outcome ? (
4712
+ <OutcomePill outcome={enr.outcome} size="md" />
4713
+ ) : null}
4714
+ <span
4715
+ style={{
4716
+ fontFamily: "var(--font-mono)",
4717
+ fontSize: 11,
4718
+ color: "var(--af-text-tertiary)",
4719
+ marginLeft: "auto",
4720
+ }}
4721
+ >
4722
+ {durMin}m active
4723
+ </span>
4724
+ </div>
4725
+
4726
+ {isTrivial && (
4727
+ <div style={{ fontSize: 12, color: "var(--af-text-tertiary)", fontStyle: "italic", marginTop: 8 }}>
4728
+ Warmup — no enrichment generated.
4729
+ </div>
4730
+ )}
4731
+
4732
+ {isPending && (
4733
+ <div style={{ fontSize: 12, color: "var(--af-text-secondary)", marginTop: 8 }}>
4734
+ Click the pending pill to generate this day's digest →
4735
+ </div>
4736
+ )}
4737
+
4738
+ {enr.status === "done" && (
4739
+ <>
4740
+ {enr.brief_summary && (
4741
+ <p style={{ margin: "10px 0 0", color: "var(--af-text)" }}>{enr.brief_summary}</p>
4742
+ )}
4743
+ {(enr.friction_detail || enr.user_instructions.length > 0) && (
4744
+ <div style={{ marginTop: 10, display: "flex", flexDirection: "column", gap: 6 }}>
4745
+ {enr.friction_detail && (
4746
+ <div style={{ fontSize: 12, color: "var(--af-text-secondary)" }}>
4747
+ <span style={{ color: "#ed8936" }}>⚠ </span>
4748
+ {enr.friction_detail}
4749
+ </div>
4750
+ )}
4751
+ {enr.user_instructions.length > 0 && (
4752
+ <details style={{ fontSize: 12, color: "var(--af-text-secondary)" }}>
4753
+ <summary style={{ cursor: "pointer", color: "var(--af-text-tertiary)" }}>
4754
+ Top user instructions ({enr.user_instructions.length})
4755
+ </summary>
4756
+ <ul style={{ margin: "6px 0 0", paddingLeft: 18 }}>
4757
+ {enr.user_instructions.slice(0, 5).map((u, i) => (
4758
+ <li key={i} style={{ marginBottom: 2 }}>{u}</li>
4759
+ ))}
4760
+ </ul>
4761
+ </details>
4762
+ )}
4763
+ </div>
4764
+ )}
4765
+ <div style={{ marginTop: 10, fontSize: 11 }}>
4766
+ <Link
4767
+ href={`/digest/${entry.local_day}`}
4768
+ style={{ color: "var(--af-accent)", textDecoration: "none" }}
4769
+ >
4770
+ Open day digest →
4771
+ </Link>
4772
+ </div>
4773
+ </>
4774
+ )}
4775
+ </div>
4776
+ );
4777
+ }