fleetlens 0.12.3 → 0.13.1

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 (228) hide show
  1. package/app/apps/web/.next/BUILD_ID +1 -1
  2. package/app/apps/web/.next/build-manifest.json +8 -8
  3. package/app/apps/web/.next/prerender-manifest.json +3 -3
  4. package/app/apps/web/.next/server/app/_global-error/page/build-manifest.json +5 -5
  5. package/app/apps/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  6. package/app/apps/web/.next/server/app/_global-error.html +1 -1
  7. package/app/apps/web/.next/server/app/_global-error.rsc +7 -7
  8. package/app/apps/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
  9. package/app/apps/web/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
  10. package/app/apps/web/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
  11. package/app/apps/web/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
  12. package/app/apps/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  13. package/app/apps/web/.next/server/app/_not-found/page/build-manifest.json +5 -5
  14. package/app/apps/web/.next/server/app/_not-found/page.js +1 -1
  15. package/app/apps/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  16. package/app/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  17. package/app/apps/web/.next/server/app/api/ask/route.js.nft.json +1 -1
  18. package/app/apps/web/.next/server/app/api/digest/day/[date]/route.js +1 -1
  19. package/app/apps/web/.next/server/app/api/digest/day/[date]/route.js.nft.json +1 -1
  20. package/app/apps/web/.next/server/app/api/digest/month/[yearMonth]/route.js +1 -1
  21. package/app/apps/web/.next/server/app/api/digest/month/[yearMonth]/route.js.nft.json +1 -1
  22. package/app/apps/web/.next/server/app/api/digest/month-index/route.js.nft.json +1 -1
  23. package/app/apps/web/.next/server/app/api/digest/week/[startDate]/route.js +1 -1
  24. package/app/apps/web/.next/server/app/api/digest/week/[startDate]/route.js.nft.json +1 -1
  25. package/app/apps/web/.next/server/app/api/digest/week-index/route.js.nft.json +1 -1
  26. package/app/apps/web/.next/server/app/api/events/route.js +2 -1
  27. package/app/apps/web/.next/server/app/api/events/route.js.nft.json +1 -1
  28. package/app/apps/web/.next/server/app/api/jobs/route.js.nft.json +1 -1
  29. package/app/apps/web/.next/server/app/api/pdf/[key]/route.js.nft.json +1 -1
  30. package/app/apps/web/.next/server/app/api/runs/[runId]/route.js.nft.json +1 -1
  31. package/app/apps/web/.next/server/app/api/runs/[runId]/stream/route.js.nft.json +1 -1
  32. package/app/apps/web/.next/server/app/api/runs/route.js.nft.json +1 -1
  33. package/app/apps/web/.next/server/app/api/settings/route.js.nft.json +1 -1
  34. package/app/apps/web/.next/server/app/api/team-config/route.js.nft.json +1 -1
  35. package/app/apps/web/.next/server/app/api/workflow-agent/route.js.nft.json +1 -1
  36. package/app/apps/web/.next/server/app/changelog/page/build-manifest.json +5 -5
  37. package/app/apps/web/.next/server/app/changelog/page.js +1 -1
  38. package/app/apps/web/.next/server/app/changelog/page.js.nft.json +1 -1
  39. package/app/apps/web/.next/server/app/changelog/page_client-reference-manifest.js +1 -1
  40. package/app/apps/web/.next/server/app/day/[date]/page/build-manifest.json +5 -5
  41. package/app/apps/web/.next/server/app/day/[date]/page.js +1 -1
  42. package/app/apps/web/.next/server/app/day/[date]/page.js.nft.json +1 -1
  43. package/app/apps/web/.next/server/app/day/[date]/page_client-reference-manifest.js +1 -1
  44. package/app/apps/web/.next/server/app/day/page/build-manifest.json +5 -5
  45. package/app/apps/web/.next/server/app/day/page.js +1 -1
  46. package/app/apps/web/.next/server/app/day/page.js.nft.json +1 -1
  47. package/app/apps/web/.next/server/app/day/page_client-reference-manifest.js +1 -1
  48. package/app/apps/web/.next/server/app/digest/[date]/page/build-manifest.json +5 -5
  49. package/app/apps/web/.next/server/app/digest/[date]/page.js +1 -1
  50. package/app/apps/web/.next/server/app/digest/[date]/page.js.nft.json +1 -1
  51. package/app/apps/web/.next/server/app/digest/[date]/page_client-reference-manifest.js +1 -1
  52. package/app/apps/web/.next/server/app/digest/page/build-manifest.json +5 -5
  53. package/app/apps/web/.next/server/app/digest/page.js +1 -1
  54. package/app/apps/web/.next/server/app/digest/page.js.nft.json +1 -1
  55. package/app/apps/web/.next/server/app/digest/page_client-reference-manifest.js +1 -1
  56. package/app/apps/web/.next/server/app/insights/[key]/page/build-manifest.json +5 -5
  57. package/app/apps/web/.next/server/app/insights/[key]/page.js +1 -1
  58. package/app/apps/web/.next/server/app/insights/[key]/page.js.nft.json +1 -1
  59. package/app/apps/web/.next/server/app/insights/[key]/page_client-reference-manifest.js +1 -1
  60. package/app/apps/web/.next/server/app/insights/page/build-manifest.json +5 -5
  61. package/app/apps/web/.next/server/app/insights/page.js +3 -2
  62. package/app/apps/web/.next/server/app/insights/page.js.nft.json +1 -1
  63. package/app/apps/web/.next/server/app/insights/page_client-reference-manifest.js +1 -1
  64. package/app/apps/web/.next/server/app/page/build-manifest.json +5 -5
  65. package/app/apps/web/.next/server/app/page.js +1 -1
  66. package/app/apps/web/.next/server/app/page.js.nft.json +1 -1
  67. package/app/apps/web/.next/server/app/page_client-reference-manifest.js +1 -1
  68. package/app/apps/web/.next/server/app/parallelism/page/build-manifest.json +5 -5
  69. package/app/apps/web/.next/server/app/parallelism/page.js +1 -1
  70. package/app/apps/web/.next/server/app/parallelism/page.js.nft.json +1 -1
  71. package/app/apps/web/.next/server/app/parallelism/page_client-reference-manifest.js +1 -1
  72. package/app/apps/web/.next/server/app/print/[key]/page/build-manifest.json +5 -5
  73. package/app/apps/web/.next/server/app/print/[key]/page.js +1 -1
  74. package/app/apps/web/.next/server/app/print/[key]/page.js.nft.json +1 -1
  75. package/app/apps/web/.next/server/app/print/[key]/page_client-reference-manifest.js +1 -1
  76. package/app/apps/web/.next/server/app/projects/[slug]/page/build-manifest.json +5 -5
  77. package/app/apps/web/.next/server/app/projects/[slug]/page.js +1 -1
  78. package/app/apps/web/.next/server/app/projects/[slug]/page.js.nft.json +1 -1
  79. package/app/apps/web/.next/server/app/projects/[slug]/page_client-reference-manifest.js +1 -1
  80. package/app/apps/web/.next/server/app/projects/page/build-manifest.json +5 -5
  81. package/app/apps/web/.next/server/app/projects/page.js +1 -1
  82. package/app/apps/web/.next/server/app/projects/page.js.nft.json +1 -1
  83. package/app/apps/web/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  84. package/app/apps/web/.next/server/app/runs/page/build-manifest.json +5 -5
  85. package/app/apps/web/.next/server/app/runs/page.js +1 -1
  86. package/app/apps/web/.next/server/app/runs/page.js.nft.json +1 -1
  87. package/app/apps/web/.next/server/app/runs/page_client-reference-manifest.js +1 -1
  88. package/app/apps/web/.next/server/app/sessions/[id]/page/build-manifest.json +5 -5
  89. package/app/apps/web/.next/server/app/sessions/[id]/page.js +1 -1
  90. package/app/apps/web/.next/server/app/sessions/[id]/page.js.nft.json +1 -1
  91. package/app/apps/web/.next/server/app/sessions/[id]/page_client-reference-manifest.js +1 -1
  92. package/app/apps/web/.next/server/app/sessions/page/build-manifest.json +5 -5
  93. package/app/apps/web/.next/server/app/sessions/page.js +1 -1
  94. package/app/apps/web/.next/server/app/sessions/page.js.nft.json +1 -1
  95. package/app/apps/web/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  96. package/app/apps/web/.next/server/app/settings/page/build-manifest.json +5 -5
  97. package/app/apps/web/.next/server/app/settings/page.js +1 -1
  98. package/app/apps/web/.next/server/app/settings/page.js.nft.json +1 -1
  99. package/app/apps/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  100. package/app/apps/web/.next/server/app/team/page/build-manifest.json +5 -5
  101. package/app/apps/web/.next/server/app/team/page.js +1 -1
  102. package/app/apps/web/.next/server/app/team/page.js.nft.json +1 -1
  103. package/app/apps/web/.next/server/app/team/page_client-reference-manifest.js +1 -1
  104. package/app/apps/web/.next/server/app/usage/page/build-manifest.json +5 -5
  105. package/app/apps/web/.next/server/app/usage/page.js +1 -1
  106. package/app/apps/web/.next/server/app/usage/page.js.nft.json +1 -1
  107. package/app/apps/web/.next/server/app/usage/page_client-reference-manifest.js +1 -1
  108. package/app/apps/web/.next/server/chunks/[externals]__0rv9ct5._.js +3 -0
  109. package/app/apps/web/.next/server/chunks/[root-of-the-server]__0gril0u._.js +9 -0
  110. package/app/apps/web/.next/server/chunks/[root-of-the-server]__0n79hpm._.js +9 -0
  111. package/app/apps/web/.next/server/chunks/[root-of-the-server]__0~utv~v._.js +9 -0
  112. package/app/apps/web/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_02bw8.n.js +5 -0
  113. package/app/apps/web/.next/server/chunks/packages_parser_dist_06d9se1._.js +1 -1
  114. package/app/apps/web/.next/server/chunks/packages_parser_dist_10ihc3~._.js +1 -1
  115. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0exckd4._.js +1 -1
  116. package/app/apps/web/.next/server/chunks/ssr/{[root-of-the-server]__0-1_njm._.js → [root-of-the-server]__0k1x-c9._.js} +2 -2
  117. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0lhwp-k._.js +8 -0
  118. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0n-ax-5._.js +1 -1
  119. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0o03ymy._.js +1 -1
  120. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0~.f_3z._.js +3 -3
  121. package/app/apps/web/.next/server/chunks/ssr/_0kajk31._.js +1 -1
  122. package/app/apps/web/.next/server/chunks/ssr/_0s3n5mz._.js +8 -0
  123. package/app/apps/web/.next/server/chunks/ssr/_0xu2pvc._.js +1 -1
  124. package/app/apps/web/.next/server/chunks/ssr/{_0jw2sm7._.js → _12mbgs5._.js} +2 -2
  125. package/app/apps/web/.next/server/chunks/ssr/apps_web_0.mu7c7._.js +1 -1
  126. package/app/apps/web/.next/server/chunks/ssr/apps_web_app_day_[date]_day-view_tsx_0wjoe1u._.js +1 -1
  127. package/app/apps/web/.next/server/chunks/ssr/apps_web_app_insights_page_tsx_071kwyw._.js +3 -0
  128. package/app/apps/web/.next/server/chunks/ssr/apps_web_app_sessions_sessions-grid_tsx_0bri5x.._.js +3 -0
  129. package/app/apps/web/.next/server/chunks/ssr/apps_web_components_0b-4-4j._.js +1 -1
  130. package/app/apps/web/.next/server/chunks/ssr/apps_web_components_0c-tpft._.js +1 -1
  131. package/app/apps/web/.next/server/chunks/ssr/apps_web_components_0l6hsch._.js +6 -0
  132. package/app/apps/web/.next/server/chunks/ssr/apps_web_components_0txtsv5._.js +1 -1
  133. package/app/apps/web/.next/server/chunks/ssr/apps_web_lib_changelog_ts_0n7_p1d._.js +1 -1
  134. package/app/apps/web/.next/server/chunks/ssr/apps_web_lib_changelog_ts_0nb5_-s._.js +1 -1
  135. package/app/apps/web/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_0cepfi8._.js +3 -0
  136. package/app/apps/web/.next/server/chunks/ssr/packages_entries_dist_node_0_271yr.js +1 -1
  137. package/app/apps/web/.next/server/chunks/ssr/packages_parser_dist_0mx_509._.js +1 -1
  138. package/app/apps/web/.next/server/middleware-build-manifest.js +8 -8
  139. package/app/apps/web/.next/server/middleware-manifest.json +5 -5
  140. package/app/apps/web/.next/server/pages/500.html +1 -1
  141. package/app/apps/web/.next/server/server-reference-manifest.js +1 -1
  142. package/app/apps/web/.next/server/server-reference-manifest.json +1 -1
  143. package/app/apps/web/.next/static/chunks/02bv_ejzhhzvp.js +10 -0
  144. package/app/apps/web/.next/static/chunks/{07lbm-sdh9c2j.js → 0389wb_f0j78j.js} +1 -1
  145. package/app/apps/web/.next/static/chunks/03gy1evbn94qu.js +6 -0
  146. package/app/apps/web/.next/static/chunks/03rd.3cc_t~yf.js +4 -0
  147. package/app/apps/web/.next/static/chunks/{12jvvc_w.cb45.css → 083~hzkv577.5.css} +1 -1
  148. package/app/apps/web/.next/static/chunks/{0osdgl2.9cl1q.js → 0d2x-wfu.m0-z.js} +1 -1
  149. package/app/apps/web/.next/static/chunks/{0lziv8y_6yp5w.js → 0e_fzy0n8ij-o.js} +1 -1
  150. package/app/apps/web/.next/static/chunks/{0l4e3as18eexy.js → 0g223u9amib0q.js} +1 -1
  151. package/app/apps/web/.next/static/chunks/{0h3.-_s-k0mj3.js → 0i.hc~2bj0_3d.js} +1 -1
  152. package/app/apps/web/.next/static/chunks/0m7dd-2zd9vl2.js +4 -0
  153. package/app/apps/web/.next/static/chunks/0nqklmbs5s3ax.js +6 -0
  154. package/app/apps/web/.next/static/chunks/{073081qv4uyn8.js → 0p--hzrway8~3.js} +1 -1
  155. package/app/apps/web/.next/static/chunks/0q8dg4txlzno0.js +1 -0
  156. package/app/apps/web/.next/static/chunks/{0gblp_v.kiu-..js → 0qv-gw888_5nu.js} +1 -1
  157. package/app/apps/web/.next/static/chunks/{14bjditmmrn7l.js → 0tirv_vo6q8uc.js} +1 -1
  158. package/app/apps/web/.next/static/chunks/{0qmh5da6gfm56.js → 0vz4~a~~hq399.js} +1 -1
  159. package/app/apps/web/.next/static/chunks/{13po66tt.68f3.js → 0wwcx42ng8i2e.js} +3 -3
  160. package/app/apps/web/.next/static/chunks/{0n0n.0279ot6c.js → 14vx702c32kn6.js} +1 -1
  161. package/app/apps/web/.next/static/chunks/{turbopack-0lb9w090w5ezx.js → turbopack-0mxu3~9vk.brh.js} +1 -1
  162. package/app/apps/web/app/api/digest/_shared/digest-route-helpers.ts +178 -0
  163. package/app/apps/web/app/api/digest/day/[date]/route.ts +34 -128
  164. package/app/apps/web/app/api/digest/month/[yearMonth]/route.ts +36 -121
  165. package/app/apps/web/app/api/digest/week/[startDate]/route.ts +36 -123
  166. package/app/apps/web/app/api/events/route.ts +47 -4
  167. package/app/apps/web/app/globals.css +23 -0
  168. package/app/apps/web/app/insights/page.tsx +20 -5
  169. package/app/apps/web/app/layout.tsx +1 -0
  170. package/app/apps/web/app/page.tsx +1 -1
  171. package/app/apps/web/app/parallelism/burst-detail-modal.tsx +637 -0
  172. package/app/apps/web/app/parallelism/concurrency-info-modal.tsx +228 -0
  173. package/app/apps/web/app/parallelism/gantt-chart-utils.ts +49 -0
  174. package/app/apps/web/app/parallelism/gantt-chart.tsx +16 -902
  175. package/app/apps/web/app/projects/[slug]/page.tsx +1 -1
  176. package/app/apps/web/app/sessions/[id]/session-view/colors.ts +31 -0
  177. package/app/apps/web/app/sessions/[id]/session-view/debug-list.tsx +78 -0
  178. package/app/apps/web/app/sessions/[id]/session-view/drawer.tsx +414 -0
  179. package/app/apps/web/app/sessions/[id]/session-view/entry-day-strip.tsx +124 -0
  180. package/app/apps/web/app/sessions/[id]/session-view/header-stats.tsx +217 -0
  181. package/app/apps/web/app/sessions/[id]/session-view/helpers.ts +135 -0
  182. package/app/apps/web/app/sessions/[id]/session-view/subagent-drawer.tsx +339 -0
  183. package/app/apps/web/app/sessions/[id]/session-view/token-stats.tsx +111 -0
  184. package/app/apps/web/app/sessions/[id]/session-view/tooltip.tsx +63 -0
  185. package/app/apps/web/app/sessions/[id]/session-view/types.ts +46 -0
  186. package/app/apps/web/app/sessions/[id]/session-view/workflows-shared.tsx +104 -0
  187. package/app/apps/web/app/sessions/[id]/session-view.tsx +701 -1577
  188. package/app/apps/web/app/sessions/[id]/team-tab/minimap-hover-card.tsx +201 -0
  189. package/app/apps/web/app/sessions/[id]/team-tab/minimap-idle-band.tsx +53 -0
  190. package/app/apps/web/app/sessions/[id]/team-tab/minimap-shared.ts +20 -0
  191. package/app/apps/web/app/sessions/[id]/team-tab/team-minimap.tsx +10 -265
  192. package/app/apps/web/app/sessions/sessions-grid.tsx +43 -19
  193. package/app/apps/web/components/digest-actions.tsx +103 -0
  194. package/app/apps/web/components/job-queue-widget.tsx +1 -1
  195. package/app/apps/web/components/live-badge.tsx +11 -3
  196. package/app/apps/web/components/live-sessions-widget.tsx +9 -3
  197. package/app/apps/web/components/month-digest-view.tsx +19 -64
  198. package/app/apps/web/components/outcome-pill.tsx +24 -4
  199. package/app/apps/web/components/searchable-select.tsx +215 -0
  200. package/app/apps/web/components/tail-mode.tsx +39 -8
  201. package/app/apps/web/components/week-digest-view.tsx +16 -71
  202. package/app/apps/web/lib/changelog-data.generated.ts +1 -1
  203. package/app/apps/web/lib/entries-index.ts +7 -8
  204. package/app/apps/web/lib/entries.ts +0 -9
  205. package/app/apps/web/lib/format.test.ts +221 -0
  206. package/app/apps/web/lib/utilization-tone.test.ts +56 -0
  207. package/app/apps/web/package.json +1 -1
  208. package/app/apps/web/tsconfig.tsbuildinfo +1 -1
  209. package/dist/daemon-worker.js +83 -45
  210. package/dist/index.js +452 -198
  211. package/package.json +1 -1
  212. package/app/apps/web/.next/server/chunks/[root-of-the-server]__0455vu3._.js +0 -5
  213. package/app/apps/web/.next/server/chunks/[root-of-the-server]__04j3tng._.js +0 -9
  214. package/app/apps/web/.next/server/chunks/[root-of-the-server]__0cnh3k4._.js +0 -9
  215. package/app/apps/web/.next/server/chunks/[root-of-the-server]__132eosx._.js +0 -9
  216. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__136-0me._.js +0 -8
  217. package/app/apps/web/.next/server/chunks/ssr/_0w.cv64._.js +0 -8
  218. package/app/apps/web/.next/server/chunks/ssr/apps_web_components_01d-iwx._.js +0 -6
  219. package/app/apps/web/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_0-lmm4p._.js +0 -3
  220. package/app/apps/web/.next/static/chunks/00xkqnvk4-d1-.js +0 -10
  221. package/app/apps/web/.next/static/chunks/0htgc_hr1bw67.js +0 -1
  222. package/app/apps/web/.next/static/chunks/0nnjldasalwdu.js +0 -4
  223. package/app/apps/web/.next/static/chunks/0okg13phslr1..js +0 -4
  224. package/app/apps/web/.next/static/chunks/0vf-3rauafbek.js +0 -6
  225. package/app/apps/web/.next/static/chunks/0vl27-vjob2_9.js +0 -6
  226. /package/app/apps/web/.next/static/{7kQ9mNICnVHhf4-LmSGcy → VEfemGVAQ0xCHjj15orZU}/_buildManifest.js +0 -0
  227. /package/app/apps/web/.next/static/{7kQ9mNICnVHhf4-LmSGcy → VEfemGVAQ0xCHjj15orZU}/_clientMiddlewareManifest.js +0 -0
  228. /package/app/apps/web/.next/static/{7kQ9mNICnVHhf4-LmSGcy → VEfemGVAQ0xCHjj15orZU}/_ssgManifest.js +0 -0
@@ -0,0 +1,111 @@
1
+ "use client";
2
+
3
+ /**
4
+ * Token display chips.
5
+ *
6
+ * - `TokenChip` — per-event token chip showing `{cache-inflated input} /
7
+ * output`. Used in event rows.
8
+ * - `TurnTokenChip` — per-turn aggregate. Primary display is fresh
9
+ * input / output (not the cache-inflated sum), consistent with the
10
+ * session header. Tooltip shows the full breakdown plus a footnote
11
+ * reminding that cache reads are cumulative across all requests in
12
+ * the turn.
13
+ */
14
+ import React, { useState } from "react";
15
+ import type { SessionEvent } from "@claude-lens/parser";
16
+ import { formatTokens } from "@/lib/format";
17
+ import { Tooltip, TooltipRow } from "./tooltip";
18
+
19
+ export function TokenChip({
20
+ usage,
21
+ }: {
22
+ usage: NonNullable<SessionEvent["usage"]>;
23
+ }) {
24
+ const [hover, setHover] = useState(false);
25
+ const totalIn = usage.input + usage.cacheRead + usage.cacheWrite;
26
+ const pctRead = totalIn > 0 ? Math.round((usage.cacheRead / totalIn) * 100) : 0;
27
+ return (
28
+ <span
29
+ style={{
30
+ position: "relative",
31
+ fontFamily: "var(--font-mono)",
32
+ fontSize: 11,
33
+ color: "var(--af-text-secondary)",
34
+ display: "inline-flex",
35
+ alignItems: "center",
36
+ gap: 4,
37
+ whiteSpace: "nowrap",
38
+ }}
39
+ onMouseEnter={() => setHover(true)}
40
+ onMouseLeave={() => setHover(false)}
41
+ >
42
+ <span style={{ opacity: 0.6 }}>▤</span>
43
+ {formatTokens(totalIn)} / {formatTokens(usage.output)}
44
+ {hover && (
45
+ <Tooltip style={{ right: 0, top: "calc(100% + 6px)", minWidth: 180 }}>
46
+ <TooltipRow label="Input" value={usage.input.toLocaleString()} />
47
+ <TooltipRow
48
+ label="Cache read"
49
+ value={`${usage.cacheRead.toLocaleString()} (${pctRead}%)`}
50
+ />
51
+ <TooltipRow label="Cache write" value={usage.cacheWrite.toLocaleString()} />
52
+ <TooltipRow label="Output" value={usage.output.toLocaleString()} />
53
+ </Tooltip>
54
+ )}
55
+ </span>
56
+ );
57
+ }
58
+
59
+ export function TurnTokenChip({
60
+ usage,
61
+ }: {
62
+ usage: { input: number; output: number; cacheRead: number; cacheWrite: number };
63
+ }) {
64
+ const [hover, setHover] = useState(false);
65
+ const totalIn = usage.input + usage.cacheRead + usage.cacheWrite;
66
+ const pctRead = totalIn > 0 ? Math.round((usage.cacheRead / totalIn) * 100) : 0;
67
+ return (
68
+ <span
69
+ style={{
70
+ position: "relative",
71
+ fontFamily: "var(--font-mono)",
72
+ fontSize: 11,
73
+ color: "var(--af-text-tertiary)",
74
+ display: "inline-flex",
75
+ alignItems: "center",
76
+ gap: 4,
77
+ whiteSpace: "nowrap",
78
+ cursor: "default",
79
+ }}
80
+ onMouseEnter={() => setHover(true)}
81
+ onMouseLeave={() => setHover(false)}
82
+ >
83
+ <span style={{ opacity: 0.6 }}>▤</span>
84
+ {formatTokens(usage.input)} / {formatTokens(usage.output)}
85
+ {hover && (
86
+ <Tooltip style={{ right: 0, top: "calc(100% + 6px)", minWidth: 220 }}>
87
+ <TooltipRow label="Input (fresh)" value={usage.input.toLocaleString()} />
88
+ <TooltipRow label="Output" value={usage.output.toLocaleString()} />
89
+ <TooltipRow
90
+ label="Cache read"
91
+ value={`${usage.cacheRead.toLocaleString()} (${pctRead}%)`}
92
+ />
93
+ <TooltipRow label="Cache write" value={usage.cacheWrite.toLocaleString()} />
94
+ <div
95
+ style={{
96
+ marginTop: 6,
97
+ paddingTop: 6,
98
+ borderTop: "1px solid rgba(241,245,249,0.12)",
99
+ opacity: 0.65,
100
+ fontSize: 10,
101
+ whiteSpace: "normal",
102
+ lineHeight: 1.4,
103
+ }}
104
+ >
105
+ Cumulative across all requests in this turn.
106
+ </div>
107
+ </Tooltip>
108
+ )}
109
+ </span>
110
+ );
111
+ }
@@ -0,0 +1,63 @@
1
+ "use client";
2
+
3
+ /**
4
+ * Tooltip + TooltipRow — generic absolutely-positioned tooltip used by
5
+ * inline header stats, token chips, hover cards, etc. The parent owns
6
+ * positioning via the `style` prop; this component only handles the
7
+ * shell (background, border-radius, pointer-events: none).
8
+ *
9
+ * TooltipRow is a small key/value row helper for the common
10
+ * label-on-left / value-on-right pattern inside a Tooltip.
11
+ */
12
+ import React, { type CSSProperties } from "react";
13
+
14
+ export function Tooltip({
15
+ children,
16
+ style,
17
+ }: {
18
+ children: React.ReactNode;
19
+ style?: CSSProperties;
20
+ }) {
21
+ return (
22
+ <div
23
+ style={{
24
+ position: "absolute",
25
+ zIndex: 100,
26
+ background: "#1A1A1A",
27
+ color: "#F5F1EC",
28
+ borderRadius: 8,
29
+ padding: "10px 12px",
30
+ fontSize: 11,
31
+ fontFamily: "var(--font-mono)",
32
+ lineHeight: 1.5,
33
+ boxShadow: "0 4px 20px rgba(0,0,0,0.18)",
34
+ pointerEvents: "none",
35
+ whiteSpace: "nowrap",
36
+ ...style,
37
+ }}
38
+ >
39
+ {children}
40
+ </div>
41
+ );
42
+ }
43
+
44
+ export function TooltipRow({
45
+ label,
46
+ value,
47
+ }: {
48
+ label: string;
49
+ value: string;
50
+ }) {
51
+ return (
52
+ <div
53
+ style={{
54
+ display: "flex",
55
+ justifyContent: "space-between",
56
+ gap: 12,
57
+ }}
58
+ >
59
+ <span style={{ opacity: 0.7 }}>{label}</span>
60
+ <span>{value}</span>
61
+ </div>
62
+ );
63
+ }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Shared types for the session-view module split.
3
+ *
4
+ * - DisplayRow: a flat list item rendered by TranscriptList. Either a
5
+ * presentation row, a collapsed turn summary, or an expanded-turn
6
+ * header/footer with its inner rows interleaved between them.
7
+ * - MinimapSeg: one segment in the minimap (a row, a whole turn, or an
8
+ * idle stripe).
9
+ *
10
+ * Also re-exports `rowPrimaryIndex` from the parser so consumers can
11
+ * import it from one place alongside the types.
12
+ */
13
+ import {
14
+ rowPrimaryIndex as rowPrimaryIndexFromLib,
15
+ type MegaRow,
16
+ type PresentationRow,
17
+ type TurnMegaRow,
18
+ } from "@claude-lens/parser";
19
+
20
+ export const rowPrimaryIndex = rowPrimaryIndexFromLib;
21
+
22
+ export type DisplayRow =
23
+ | { kind: "presentation"; row: PresentationRow; indented?: boolean }
24
+ | { kind: "turn-collapsed"; turn: TurnMegaRow }
25
+ | { kind: "turn-expanded-header"; turn: TurnMegaRow }
26
+ | { kind: "turn-expanded-footer"; turn: TurnMegaRow };
27
+
28
+ export type MinimapSeg =
29
+ | {
30
+ kind: "row";
31
+ row: PresentationRow;
32
+ primaryIndex: number;
33
+ start: number;
34
+ end: number;
35
+ }
36
+ | {
37
+ kind: "turn";
38
+ turn: TurnMegaRow;
39
+ primaryIndex: number;
40
+ start: number;
41
+ end: number;
42
+ }
43
+ | { kind: "idle"; start: number; end: number; durationMs: number };
44
+
45
+ // Re-export underlying types so consumers needing them can import here.
46
+ export type { MegaRow, PresentationRow, TurnMegaRow };
@@ -0,0 +1,104 @@
1
+ "use client";
2
+
3
+ /**
4
+ * Small layout helpers shared between SubagentDrawer and WorkflowsPanel.
5
+ *
6
+ * - WfMiniStat — inline icon+value chip used in workflow card headers.
7
+ * - SectionLabel — small all-caps label above a content section.
8
+ * - StatCell — 3-column "Events / Messages / Tool calls" stat grid cell.
9
+ * - TokenLine — label-value row for a token breakdown.
10
+ */
11
+ import React from "react";
12
+
13
+ export function WfMiniStat({
14
+ icon,
15
+ value,
16
+ }: {
17
+ icon?: React.ReactNode;
18
+ value: string;
19
+ }) {
20
+ return (
21
+ <span
22
+ style={{
23
+ display: "inline-flex",
24
+ alignItems: "center",
25
+ gap: 4,
26
+ fontSize: 11.5,
27
+ color: "var(--af-text-secondary)",
28
+ fontFamily: "var(--font-mono)",
29
+ whiteSpace: "nowrap",
30
+ }}
31
+ >
32
+ {icon && (
33
+ <span style={{ color: "var(--af-text-tertiary)", display: "inline-flex" }}>{icon}</span>
34
+ )}
35
+ {value}
36
+ </span>
37
+ );
38
+ }
39
+
40
+ export function SectionLabel({ children }: { children: React.ReactNode }) {
41
+ return (
42
+ <div
43
+ style={{
44
+ fontSize: 10,
45
+ fontWeight: 600,
46
+ textTransform: "uppercase",
47
+ letterSpacing: "0.04em",
48
+ color: "var(--af-text-tertiary)",
49
+ marginBottom: 8,
50
+ }}
51
+ >
52
+ {children}
53
+ </div>
54
+ );
55
+ }
56
+
57
+ export function StatCell({ label, value }: { label: string; value: string }) {
58
+ return (
59
+ <div>
60
+ <div
61
+ style={{
62
+ fontSize: 9,
63
+ color: "var(--af-text-tertiary)",
64
+ textTransform: "uppercase",
65
+ letterSpacing: "0.04em",
66
+ fontWeight: 600,
67
+ }}
68
+ >
69
+ {label}
70
+ </div>
71
+ <div
72
+ style={{
73
+ fontSize: 18,
74
+ fontWeight: 700,
75
+ fontFamily: "var(--font-mono)",
76
+ color: "var(--af-text)",
77
+ marginTop: 2,
78
+ }}
79
+ >
80
+ {value}
81
+ </div>
82
+ </div>
83
+ );
84
+ }
85
+
86
+ export function TokenLine({
87
+ label,
88
+ value,
89
+ suffix,
90
+ }: {
91
+ label: string;
92
+ value: number;
93
+ suffix?: string;
94
+ }) {
95
+ return (
96
+ <div style={{ display: "flex", justifyContent: "space-between", gap: 12 }}>
97
+ <span style={{ opacity: 0.7 }}>{label}</span>
98
+ <span>
99
+ {value.toLocaleString()}
100
+ {suffix && <span style={{ opacity: 0.65 }}>{suffix}</span>}
101
+ </span>
102
+ </div>
103
+ );
104
+ }