fleetlens 0.2.9 โ†’ 0.4.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 (237) hide show
  1. package/app/apps/web/.next/BUILD_ID +1 -1
  2. package/app/apps/web/.next/app-path-routes-manifest.json +9 -0
  3. package/app/apps/web/.next/build-manifest.json +6 -6
  4. package/app/apps/web/.next/prerender-manifest.json +3 -3
  5. package/app/apps/web/.next/routes-manifest.json +62 -0
  6. package/app/apps/web/.next/server/app/_global-error/page/build-manifest.json +3 -3
  7. package/app/apps/web/.next/server/app/_global-error.html +1 -1
  8. package/app/apps/web/.next/server/app/_global-error.rsc +1 -1
  9. package/app/apps/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  10. package/app/apps/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  11. package/app/apps/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  12. package/app/apps/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  13. package/app/apps/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  14. package/app/apps/web/.next/server/app/_not-found/page/build-manifest.json +3 -3
  15. package/app/apps/web/.next/server/app/_not-found/page.js +1 -1
  16. package/app/apps/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  17. package/app/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  18. package/app/apps/web/.next/server/app/api/ask/route.js +3 -2
  19. package/app/apps/web/.next/server/app/api/ask/route.js.nft.json +1 -1
  20. package/app/apps/web/.next/server/app/api/events/route.js +1 -0
  21. package/app/apps/web/.next/server/app/api/events/route.js.nft.json +1 -1
  22. package/app/apps/web/.next/server/app/api/insights/months-index/route/app-paths-manifest.json +3 -0
  23. package/app/apps/web/.next/server/app/api/insights/months-index/route/build-manifest.json +9 -0
  24. package/app/apps/web/.next/server/app/api/insights/months-index/route/server-reference-manifest.json +4 -0
  25. package/app/apps/web/.next/server/app/api/insights/months-index/route.js +7 -0
  26. package/app/apps/web/.next/server/app/api/insights/months-index/route.js.map +5 -0
  27. package/app/apps/web/.next/server/app/api/insights/months-index/route.js.nft.json +1 -0
  28. package/app/apps/web/.next/server/app/api/insights/months-index/route_client-reference-manifest.js +3 -0
  29. package/app/apps/web/.next/server/app/api/insights/pdf/[key]/route/app-paths-manifest.json +3 -0
  30. package/app/apps/web/.next/server/app/api/insights/pdf/[key]/route/build-manifest.json +9 -0
  31. package/app/apps/web/.next/server/app/api/insights/pdf/[key]/route/server-reference-manifest.json +4 -0
  32. package/app/apps/web/.next/server/app/api/insights/pdf/[key]/route.js +6 -0
  33. package/app/apps/web/.next/server/app/api/insights/pdf/[key]/route.js.map +5 -0
  34. package/app/apps/web/.next/server/app/api/insights/pdf/[key]/route.js.nft.json +1 -0
  35. package/app/apps/web/.next/server/app/api/insights/pdf/[key]/route_client-reference-manifest.js +3 -0
  36. package/app/apps/web/.next/server/app/api/insights/route/app-paths-manifest.json +3 -0
  37. package/app/apps/web/.next/server/app/api/insights/route/build-manifest.json +9 -0
  38. package/app/apps/web/.next/server/app/api/insights/route/server-reference-manifest.json +4 -0
  39. package/app/apps/web/.next/server/app/api/insights/route.js +8 -0
  40. package/app/apps/web/.next/server/app/api/insights/route.js.map +5 -0
  41. package/app/apps/web/.next/server/app/api/insights/route.js.nft.json +1 -0
  42. package/app/apps/web/.next/server/app/api/insights/route_client-reference-manifest.js +3 -0
  43. package/app/apps/web/.next/server/app/api/insights/saved/[key]/route/app-paths-manifest.json +3 -0
  44. package/app/apps/web/.next/server/app/api/insights/saved/[key]/route/build-manifest.json +9 -0
  45. package/app/apps/web/.next/server/app/api/insights/saved/[key]/route/server-reference-manifest.json +4 -0
  46. package/app/apps/web/.next/server/app/api/insights/saved/[key]/route.js +6 -0
  47. package/app/apps/web/.next/server/app/api/insights/saved/[key]/route.js.map +5 -0
  48. package/app/apps/web/.next/server/app/api/insights/saved/[key]/route.js.nft.json +1 -0
  49. package/app/apps/web/.next/server/app/api/insights/saved/[key]/route_client-reference-manifest.js +3 -0
  50. package/app/apps/web/.next/server/app/api/insights/saved/route/app-paths-manifest.json +3 -0
  51. package/app/apps/web/.next/server/app/api/insights/saved/route/build-manifest.json +9 -0
  52. package/app/apps/web/.next/server/app/api/insights/saved/route/server-reference-manifest.json +4 -0
  53. package/app/apps/web/.next/server/app/api/insights/saved/route.js +6 -0
  54. package/app/apps/web/.next/server/app/api/insights/saved/route.js.map +5 -0
  55. package/app/apps/web/.next/server/app/api/insights/saved/route.js.nft.json +1 -0
  56. package/app/apps/web/.next/server/app/api/insights/saved/route_client-reference-manifest.js +3 -0
  57. package/app/apps/web/.next/server/app/api/insights/weeks-index/route/app-paths-manifest.json +3 -0
  58. package/app/apps/web/.next/server/app/api/insights/weeks-index/route/build-manifest.json +9 -0
  59. package/app/apps/web/.next/server/app/api/insights/weeks-index/route/server-reference-manifest.json +4 -0
  60. package/app/apps/web/.next/server/app/api/insights/weeks-index/route.js +7 -0
  61. package/app/apps/web/.next/server/app/api/insights/weeks-index/route.js.map +5 -0
  62. package/app/apps/web/.next/server/app/api/insights/weeks-index/route.js.nft.json +1 -0
  63. package/app/apps/web/.next/server/app/api/insights/weeks-index/route_client-reference-manifest.js +3 -0
  64. package/app/apps/web/.next/server/app/insights/[key]/page/app-paths-manifest.json +3 -0
  65. package/app/apps/web/.next/server/app/insights/[key]/page/build-manifest.json +17 -0
  66. package/app/apps/web/.next/server/app/insights/[key]/page/next-font-manifest.json +6 -0
  67. package/app/apps/web/.next/server/app/insights/[key]/page/react-loadable-manifest.json +1 -0
  68. package/app/apps/web/.next/server/app/insights/[key]/page/server-reference-manifest.json +4 -0
  69. package/app/apps/web/.next/server/app/insights/[key]/page.js +16 -0
  70. package/app/apps/web/.next/server/app/insights/[key]/page.js.map +5 -0
  71. package/app/apps/web/.next/server/app/insights/[key]/page.js.nft.json +1 -0
  72. package/app/apps/web/.next/server/app/insights/[key]/page_client-reference-manifest.js +3 -0
  73. package/app/apps/web/.next/server/app/insights/page/app-paths-manifest.json +3 -0
  74. package/app/apps/web/.next/server/app/insights/page/build-manifest.json +17 -0
  75. package/app/apps/web/.next/server/app/insights/page/next-font-manifest.json +6 -0
  76. package/app/apps/web/.next/server/app/insights/page/react-loadable-manifest.json +1 -0
  77. package/app/apps/web/.next/server/app/insights/page/server-reference-manifest.json +4 -0
  78. package/app/apps/web/.next/server/app/insights/page.js +16 -0
  79. package/app/apps/web/.next/server/app/insights/page.js.map +5 -0
  80. package/app/apps/web/.next/server/app/insights/page.js.nft.json +1 -0
  81. package/app/apps/web/.next/server/app/insights/page_client-reference-manifest.js +3 -0
  82. package/app/apps/web/.next/server/app/insights/print/[key]/page/app-paths-manifest.json +3 -0
  83. package/app/apps/web/.next/server/app/insights/print/[key]/page/build-manifest.json +17 -0
  84. package/app/apps/web/.next/server/app/insights/print/[key]/page/next-font-manifest.json +6 -0
  85. package/app/apps/web/.next/server/app/insights/print/[key]/page/react-loadable-manifest.json +1 -0
  86. package/app/apps/web/.next/server/app/insights/print/[key]/page/server-reference-manifest.json +4 -0
  87. package/app/apps/web/.next/server/app/insights/print/[key]/page.js +16 -0
  88. package/app/apps/web/.next/server/app/insights/print/[key]/page.js.map +5 -0
  89. package/app/apps/web/.next/server/app/insights/print/[key]/page.js.nft.json +1 -0
  90. package/app/apps/web/.next/server/app/insights/print/[key]/page_client-reference-manifest.js +3 -0
  91. package/app/apps/web/.next/server/app/page/build-manifest.json +3 -3
  92. package/app/apps/web/.next/server/app/page.js +3 -3
  93. package/app/apps/web/.next/server/app/page.js.nft.json +1 -1
  94. package/app/apps/web/.next/server/app/page_client-reference-manifest.js +1 -1
  95. package/app/apps/web/.next/server/app/parallelism/page/build-manifest.json +3 -3
  96. package/app/apps/web/.next/server/app/parallelism/page.js +1 -1
  97. package/app/apps/web/.next/server/app/parallelism/page.js.nft.json +1 -1
  98. package/app/apps/web/.next/server/app/parallelism/page_client-reference-manifest.js +1 -1
  99. package/app/apps/web/.next/server/app/projects/[slug]/page/build-manifest.json +3 -3
  100. package/app/apps/web/.next/server/app/projects/[slug]/page.js +2 -3
  101. package/app/apps/web/.next/server/app/projects/[slug]/page.js.nft.json +1 -1
  102. package/app/apps/web/.next/server/app/projects/[slug]/page_client-reference-manifest.js +1 -1
  103. package/app/apps/web/.next/server/app/projects/page/build-manifest.json +3 -3
  104. package/app/apps/web/.next/server/app/projects/page.js +1 -1
  105. package/app/apps/web/.next/server/app/projects/page.js.nft.json +1 -1
  106. package/app/apps/web/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  107. package/app/apps/web/.next/server/app/sessions/[id]/page/build-manifest.json +3 -3
  108. package/app/apps/web/.next/server/app/sessions/[id]/page.js +2 -2
  109. package/app/apps/web/.next/server/app/sessions/[id]/page.js.nft.json +1 -1
  110. package/app/apps/web/.next/server/app/sessions/[id]/page_client-reference-manifest.js +1 -1
  111. package/app/apps/web/.next/server/app/sessions/page/build-manifest.json +3 -3
  112. package/app/apps/web/.next/server/app/sessions/page.js +1 -1
  113. package/app/apps/web/.next/server/app/sessions/page.js.nft.json +1 -1
  114. package/app/apps/web/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  115. package/app/apps/web/.next/server/app/usage/page/build-manifest.json +3 -3
  116. package/app/apps/web/.next/server/app/usage/page.js +1 -1
  117. package/app/apps/web/.next/server/app/usage/page.js.nft.json +1 -1
  118. package/app/apps/web/.next/server/app/usage/page_client-reference-manifest.js +1 -1
  119. package/app/apps/web/.next/server/app-paths-manifest.json +9 -0
  120. package/app/apps/web/.next/server/chunks/02dz_web__next-internal_server_app_api_insights_months-index_route_actions_0~h~zci.js +3 -0
  121. package/app/apps/web/.next/server/chunks/02dz_web__next-internal_server_app_api_insights_saved_[key]_route_actions_0a5j9yw.js +3 -0
  122. package/app/apps/web/.next/server/chunks/02dz_web__next-internal_server_app_api_insights_weeks-index_route_actions_0hh-1c7.js +3 -0
  123. package/app/apps/web/.next/server/chunks/{[externals]__0rv9ct5._.js โ†’ [externals]__0_xztrf._.js} +2 -2
  124. package/app/apps/web/.next/server/chunks/[root-of-the-server]__0.hmj0z._.js +3 -0
  125. package/app/apps/web/.next/server/chunks/[root-of-the-server]__01h_g-p._.js +3 -0
  126. package/app/apps/web/.next/server/chunks/[root-of-the-server]__0nh-z10._.js +3 -0
  127. package/app/apps/web/.next/server/chunks/[root-of-the-server]__0op9af~._.js +1 -1
  128. package/app/apps/web/.next/server/chunks/[root-of-the-server]__0ri7q~r._.js +3 -0
  129. package/app/apps/web/.next/server/chunks/[root-of-the-server]__0rr1~~x._.js +3 -0
  130. package/app/apps/web/.next/server/chunks/[root-of-the-server]__0s0gv.0._.js +3 -0
  131. package/app/apps/web/.next/server/chunks/apps_web__next-internal_server_app_api_insights_pdf_[key]_route_actions_0lu-lnx.js +3 -0
  132. package/app/apps/web/.next/server/chunks/apps_web__next-internal_server_app_api_insights_route_actions_0h8l5lz.js +3 -0
  133. package/app/apps/web/.next/server/chunks/apps_web__next-internal_server_app_api_insights_saved_route_actions_13rlblw.js +3 -0
  134. package/app/apps/web/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_00t2xj6.js +68 -0
  135. package/app/apps/web/.next/server/chunks/{[root-of-the-server]__0sgyieh._.js โ†’ node_modules_next_dist_esm_build_templates_app-route_0ck.78s.js} +5 -5
  136. package/app/apps/web/.next/server/chunks/packages_parser_dist_fs_0bc7ptm.js +3 -0
  137. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__00z7zlm._.js +3 -0
  138. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__08.d5ia._.js +12 -0
  139. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0b323~k._.js +8 -0
  140. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0euu8sa._.js +3 -0
  141. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0gio_ck._.js +3 -0
  142. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0gx-4qa._.js +3 -0
  143. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0w52fbc._.js +3 -3
  144. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0z45d0g._.js +49 -0
  145. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__13itnvx._.js +3 -0
  146. package/app/apps/web/.next/server/chunks/ssr/_09n75_5._.js +1 -1
  147. package/app/apps/web/.next/server/chunks/ssr/_0r~__0v._.js +12 -0
  148. package/app/apps/web/.next/server/chunks/ssr/_0xies90._.js +1 -1
  149. package/app/apps/web/.next/server/chunks/ssr/apps_web__next-internal_server_app_insights_[key]_page_actions_0_z2~e_.js +3 -0
  150. package/app/apps/web/.next/server/chunks/ssr/apps_web__next-internal_server_app_insights_page_actions_0zjdm~n.js +3 -0
  151. package/app/apps/web/.next/server/chunks/ssr/apps_web__next-internal_server_app_insights_print_[key]_page_actions_0a853fw.js +3 -0
  152. package/app/apps/web/.next/server/chunks/ssr/apps_web_components_06j3c.0._.js +1 -1
  153. package/app/apps/web/.next/server/chunks/ssr/apps_web_components_insight-report_tsx_13q2a-c._.js +12 -0
  154. package/app/apps/web/.next/server/chunks/ssr/apps_web_components_insights-view_tsx_11730ta._.js +6 -0
  155. package/app/apps/web/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_0-lmm4p._.js +3 -0
  156. package/app/apps/web/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_0nqz8dw._.js +3 -0
  157. package/app/apps/web/.next/server/chunks/ssr/node_modules_next_dist_0t-hj0x._.js +3 -0
  158. package/app/apps/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0vz7_px.js +4 -0
  159. package/app/apps/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_10cdrh2.js +4 -0
  160. package/app/apps/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_12n1lw_.js +4 -0
  161. package/app/apps/web/.next/server/chunks/ssr/packages_parser_dist_0-jvt~a._.js +1 -1
  162. package/app/apps/web/.next/server/chunks/ssr/packages_parser_dist_analytics_0k4dgst.js +1 -1
  163. package/app/apps/web/.next/server/functions-config-manifest.json +7 -1
  164. package/app/apps/web/.next/server/middleware-build-manifest.js +6 -6
  165. package/app/apps/web/.next/server/pages/500.html +1 -1
  166. package/app/apps/web/.next/server/server-reference-manifest.js +1 -1
  167. package/app/apps/web/.next/server/server-reference-manifest.json +1 -1
  168. package/app/apps/web/.next/static/chunks/03.mv4y4.w-vb.js +6 -0
  169. package/app/apps/web/.next/static/chunks/03_7xtpi9sv4g.js +4 -0
  170. package/app/apps/web/.next/static/chunks/03g5dw5eskotd.js +6 -0
  171. package/app/apps/web/.next/static/chunks/063oimt30jeo9.js +10 -0
  172. package/app/apps/web/.next/static/chunks/08c1pcrocqq5s.js +6 -0
  173. package/app/apps/web/.next/static/chunks/0e-wrhqh4h3r5.js +2 -0
  174. package/app/apps/web/.next/static/chunks/0fc6dk2qtokwh.js +1 -0
  175. package/app/apps/web/.next/static/chunks/0i7er7_bfab36.js +10 -0
  176. package/app/apps/web/.next/static/chunks/0ipytyi01h0ta.js +1 -0
  177. package/app/apps/web/.next/static/chunks/137uw2-qbro07.js +31 -0
  178. package/app/apps/web/.next/static/chunks/{turbopack-17n9y8y0h4q9f.js โ†’ turbopack-169w-1._23ra_.js} +1 -1
  179. package/app/apps/web/app/api/insights/months-index/route.ts +80 -0
  180. package/app/apps/web/app/api/insights/pdf/[key]/route.ts +45 -0
  181. package/app/apps/web/app/api/insights/route.ts +508 -0
  182. package/app/apps/web/app/api/insights/saved/[key]/route.ts +11 -0
  183. package/app/apps/web/app/api/insights/saved/route.ts +9 -0
  184. package/app/apps/web/app/api/insights/weeks-index/route.ts +95 -0
  185. package/app/apps/web/app/insights/[key]/page.tsx +59 -0
  186. package/app/apps/web/app/insights/page.tsx +7 -0
  187. package/app/apps/web/app/insights/print/[key]/page.tsx +73 -0
  188. package/app/apps/web/app/layout.tsx +2 -0
  189. package/app/apps/web/app/projects/[slug]/page.tsx +2 -0
  190. package/app/apps/web/app/sessions/[id]/page.tsx +27 -1
  191. package/app/apps/web/app/sessions/[id]/session-view.tsx +372 -793
  192. package/app/apps/web/app/sessions/[id]/team-tab/adapter.ts +633 -0
  193. package/app/apps/web/app/sessions/[id]/team-tab/format.ts +20 -0
  194. package/app/apps/web/app/sessions/[id]/team-tab/team-minimap.tsx +682 -0
  195. package/app/apps/web/app/sessions/[id]/team-tab/team-tab-client.tsx +78 -0
  196. package/app/apps/web/app/sessions/[id]/team-tab/team-table.tsx +796 -0
  197. package/app/apps/web/app/sessions/[id]/team-tab/turn-drawer.tsx +805 -0
  198. package/app/apps/web/app/sessions/[id]/tool-cards.tsx +461 -0
  199. package/app/apps/web/app/sessions/[id]/turn-steps.tsx +306 -0
  200. package/app/apps/web/app/sessions/sessions-grid.tsx +36 -5
  201. package/app/apps/web/components/insight-report.tsx +1031 -0
  202. package/app/apps/web/components/insights-view.tsx +647 -0
  203. package/app/apps/web/components/live-refresher.tsx +11 -2
  204. package/app/apps/web/components/live-sessions-widget.tsx +20 -6
  205. package/app/apps/web/components/sidebar.tsx +8 -0
  206. package/app/apps/web/components/team-badge.tsx +90 -0
  207. package/app/apps/web/eslint.config.mjs +2 -0
  208. package/app/apps/web/lib/ai/chrome-pdf.ts +64 -0
  209. package/app/apps/web/lib/ai/insights-prompt.ts +71 -0
  210. package/app/apps/web/lib/ai/saved-reports.ts +83 -0
  211. package/app/apps/web/lib/date-range.ts +11 -2
  212. package/app/apps/web/lib/use-live-events.ts +7 -2
  213. package/app/apps/web/package.json +3 -2
  214. package/app/apps/web/tsconfig.tsbuildinfo +1 -1
  215. package/dist/daemon-worker.js +2765 -11
  216. package/dist/index.js +3047 -253
  217. package/package.json +5 -3
  218. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__08cr2u9._.js +0 -3
  219. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0b..h_8._.js +0 -3
  220. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0cdd~8n._.js +0 -3
  221. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0ms7h0~._.js +0 -8
  222. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0~a~v00._.js +0 -3
  223. package/app/apps/web/.next/server/chunks/ssr/_0zv~jv-._.js +0 -12
  224. package/app/apps/web/.next/server/chunks/ssr/_12dtryh._.js +0 -12
  225. package/app/apps/web/.next/server/chunks/ssr/node_modules_0i2xw~e._.js +0 -3
  226. package/app/apps/web/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_0.knjn.._.js +0 -3
  227. package/app/apps/web/.next/static/chunks/0257pdz1-imal.js +0 -2
  228. package/app/apps/web/.next/static/chunks/03fw7f2obcvq~.js +0 -6
  229. package/app/apps/web/.next/static/chunks/07oyxajlp3dvb.js +0 -6
  230. package/app/apps/web/.next/static/chunks/0a24elrqoqqep.js +0 -10
  231. package/app/apps/web/.next/static/chunks/0i4zodv86~~~i.js +0 -1
  232. package/app/apps/web/.next/static/chunks/0qmh881w772ef.js +0 -31
  233. package/app/apps/web/.next/static/chunks/0rbm60-qyshdm.js +0 -6
  234. package/app/apps/web/.next/static/chunks/0wdga7zbwvg70.js +0 -1
  235. /package/app/apps/web/.next/static/{2rEsiJssG30QsuNT0Lp9S โ†’ G_4ofKI9v9ARC_lb9JILZ}/_buildManifest.js +0 -0
  236. /package/app/apps/web/.next/static/{2rEsiJssG30QsuNT0Lp9S โ†’ G_4ofKI9v9ARC_lb9JILZ}/_clientMiddlewareManifest.js +0 -0
  237. /package/app/apps/web/.next/static/{2rEsiJssG30QsuNT0Lp9S โ†’ G_4ofKI9v9ARC_lb9JILZ}/_ssgManifest.js +0 -0
@@ -0,0 +1,461 @@
1
+ import React from "react";
2
+ import { shortenToolName } from "./turn-steps";
3
+
4
+ export type ToolUseInput = Record<string, unknown> | unknown;
5
+
6
+ function splitPath(p: string): { dir: string; file: string } {
7
+ const parts = p.split("/");
8
+ const file = parts[parts.length - 1] ?? p;
9
+ const dirParts = parts.slice(0, -1).filter(Boolean);
10
+ const dir =
11
+ dirParts.length > 3
12
+ ? "โ€ฆ/" + dirParts.slice(-3).join("/")
13
+ : dirParts.join("/");
14
+ return { dir: dir || "", file };
15
+ }
16
+
17
+ export function PathLabel({ path }: { path: string }) {
18
+ const { dir, file } = splitPath(path);
19
+ return (
20
+ <code
21
+ style={{
22
+ fontSize: 11,
23
+ fontFamily: "var(--font-mono)",
24
+ color: "var(--af-text)",
25
+ }}
26
+ >
27
+ {dir && <span style={{ color: "var(--af-text-tertiary)" }}>{dir}/</span>}
28
+ <b style={{ fontWeight: 600 }}>{file}</b>
29
+ </code>
30
+ );
31
+ }
32
+
33
+ export function ToolCardShell({
34
+ icon,
35
+ label,
36
+ children,
37
+ }: {
38
+ icon: React.ReactNode;
39
+ label: React.ReactNode;
40
+ children?: React.ReactNode;
41
+ }) {
42
+ return (
43
+ <div
44
+ style={{
45
+ border: "1px solid var(--af-border-subtle)",
46
+ borderRadius: 8,
47
+ background: "var(--background)",
48
+ overflow: "hidden",
49
+ }}
50
+ >
51
+ <div
52
+ style={{
53
+ padding: "8px 12px",
54
+ display: "flex",
55
+ alignItems: "center",
56
+ gap: 8,
57
+ borderBottom: children ? "1px solid var(--af-border-subtle)" : "none",
58
+ fontSize: 12,
59
+ color: "var(--af-text-secondary)",
60
+ }}
61
+ >
62
+ <span style={{ fontSize: 13 }}>{icon}</span>
63
+ <span>{label}</span>
64
+ </div>
65
+ {children}
66
+ </div>
67
+ );
68
+ }
69
+
70
+ export function CodeBlock({
71
+ text,
72
+ maxHeight = 280,
73
+ }: {
74
+ text: string;
75
+ maxHeight?: number;
76
+ }) {
77
+ return (
78
+ <pre
79
+ style={{
80
+ margin: 0,
81
+ padding: "10px 12px",
82
+ fontFamily: "var(--font-mono)",
83
+ fontSize: 11.5,
84
+ lineHeight: 1.55,
85
+ color: "var(--af-text)",
86
+ whiteSpace: "pre",
87
+ overflow: "auto",
88
+ maxHeight,
89
+ }}
90
+ >
91
+ {text}
92
+ </pre>
93
+ );
94
+ }
95
+
96
+ export function DiffView({
97
+ oldText,
98
+ newText,
99
+ }: {
100
+ oldText: string;
101
+ newText: string;
102
+ }) {
103
+ const oldLines = oldText.split("\n");
104
+ const newLines = newText.split("\n");
105
+ return (
106
+ <pre
107
+ style={{
108
+ margin: 0,
109
+ padding: "10px 12px",
110
+ fontFamily: "var(--font-mono)",
111
+ fontSize: 11.5,
112
+ lineHeight: 1.55,
113
+ whiteSpace: "pre",
114
+ overflow: "auto",
115
+ maxHeight: 320,
116
+ }}
117
+ >
118
+ {oldLines.map((line, i) => (
119
+ <div
120
+ key={`o${i}`}
121
+ style={{
122
+ background: "rgba(220, 38, 38, 0.08)",
123
+ color: "#991B1B",
124
+ padding: "0 4px",
125
+ borderLeft: "3px solid #DC2626",
126
+ }}
127
+ >
128
+ <span style={{ opacity: 0.6, userSelect: "none" }}>โˆ’ </span>
129
+ {line || "\u00A0"}
130
+ </div>
131
+ ))}
132
+ {newLines.map((line, i) => (
133
+ <div
134
+ key={`n${i}`}
135
+ style={{
136
+ background: "rgba(5, 150, 105, 0.08)",
137
+ color: "#065F46",
138
+ padding: "0 4px",
139
+ borderLeft: "3px solid #059669",
140
+ }}
141
+ >
142
+ <span style={{ opacity: 0.6, userSelect: "none" }}>+ </span>
143
+ {line || "\u00A0"}
144
+ </div>
145
+ ))}
146
+ </pre>
147
+ );
148
+ }
149
+
150
+ export function ToolUseCard({
151
+ name,
152
+ input,
153
+ }: {
154
+ name: string;
155
+ input: ToolUseInput;
156
+ }) {
157
+ const i = (input ?? {}) as Record<string, unknown>;
158
+ const str = (k: string): string | undefined =>
159
+ typeof i[k] === "string" ? (i[k] as string) : undefined;
160
+ const num = (k: string): number | undefined =>
161
+ typeof i[k] === "number" ? (i[k] as number) : undefined;
162
+
163
+ if (name === "Write") {
164
+ const filePath = str("file_path") ?? "";
165
+ const content = str("content") ?? "";
166
+ return (
167
+ <ToolCardShell
168
+ icon="๐Ÿ“"
169
+ label={
170
+ <>
171
+ <b>Write</b> <PathLabel path={filePath} />
172
+ </>
173
+ }
174
+ >
175
+ <CodeBlock text={content} />
176
+ </ToolCardShell>
177
+ );
178
+ }
179
+
180
+ if (name === "Edit") {
181
+ const filePath = str("file_path") ?? "";
182
+ const oldStr = str("old_string") ?? "";
183
+ const newStr = str("new_string") ?? "";
184
+ const replaceAll = i.replace_all === true;
185
+ return (
186
+ <ToolCardShell
187
+ icon="โœ๏ธ"
188
+ label={
189
+ <>
190
+ <b>Edit</b> <PathLabel path={filePath} />
191
+ {replaceAll && (
192
+ <span
193
+ style={{
194
+ fontSize: 10,
195
+ color: "var(--af-warning)",
196
+ background: "var(--af-warning-subtle)",
197
+ padding: "1px 6px",
198
+ borderRadius: 10,
199
+ }}
200
+ >
201
+ replace all
202
+ </span>
203
+ )}
204
+ </>
205
+ }
206
+ >
207
+ <DiffView oldText={oldStr} newText={newStr} />
208
+ </ToolCardShell>
209
+ );
210
+ }
211
+
212
+ if (name === "Read") {
213
+ const filePath = str("file_path") ?? "";
214
+ const offset = num("offset");
215
+ const limit = num("limit");
216
+ const range =
217
+ offset !== undefined || limit !== undefined
218
+ ? ` ยท lines ${offset ?? 1}${limit !== undefined ? `โ€“${(offset ?? 0) + limit}` : "โ€ฆ"}`
219
+ : "";
220
+ return (
221
+ <ToolCardShell
222
+ icon="๐Ÿ“–"
223
+ label={
224
+ <>
225
+ <b>Read</b> <PathLabel path={filePath} />
226
+ <span style={{ color: "var(--af-text-tertiary)" }}>{range}</span>
227
+ </>
228
+ }
229
+ />
230
+ );
231
+ }
232
+
233
+ if (name === "Bash") {
234
+ const command = str("command") ?? "";
235
+ const description = str("description");
236
+ const runInBg = i.run_in_background === true;
237
+ return (
238
+ <ToolCardShell
239
+ icon="โšก"
240
+ label={
241
+ <>
242
+ <b>Bash</b>
243
+ {description && (
244
+ <span style={{ color: "var(--af-text)", fontStyle: "italic" }}>
245
+ {description}
246
+ </span>
247
+ )}
248
+ {runInBg && (
249
+ <span
250
+ style={{
251
+ fontSize: 10,
252
+ color: "var(--af-info)",
253
+ background: "var(--af-info-subtle)",
254
+ padding: "1px 6px",
255
+ borderRadius: 10,
256
+ }}
257
+ >
258
+ background
259
+ </span>
260
+ )}
261
+ </>
262
+ }
263
+ >
264
+ <CodeBlock text={command} maxHeight={220} />
265
+ </ToolCardShell>
266
+ );
267
+ }
268
+
269
+ if (name === "Grep") {
270
+ const pattern = str("pattern") ?? "";
271
+ const path = str("path");
272
+ const glob = str("glob");
273
+ const type = str("type");
274
+ const outputMode = str("output_mode");
275
+ return (
276
+ <ToolCardShell
277
+ icon="๐Ÿ”"
278
+ label={
279
+ <>
280
+ <b>Grep</b>{" "}
281
+ <code
282
+ style={{
283
+ background: "var(--af-border-subtle)",
284
+ padding: "1px 6px",
285
+ borderRadius: 4,
286
+ fontFamily: "var(--font-mono)",
287
+ fontSize: 11,
288
+ }}
289
+ >
290
+ {pattern}
291
+ </code>
292
+ {path && (
293
+ <>
294
+ {" in "}
295
+ <PathLabel path={path} />
296
+ </>
297
+ )}
298
+ {(glob || type || outputMode) && (
299
+ <span
300
+ style={{
301
+ color: "var(--af-text-tertiary)",
302
+ fontSize: 11,
303
+ marginLeft: 6,
304
+ }}
305
+ >
306
+ {[
307
+ glob && `glob=${glob}`,
308
+ type && `type=${type}`,
309
+ outputMode && `mode=${outputMode}`,
310
+ ]
311
+ .filter(Boolean)
312
+ .join(" ยท ")}
313
+ </span>
314
+ )}
315
+ </>
316
+ }
317
+ />
318
+ );
319
+ }
320
+
321
+ if (name === "Glob") {
322
+ const pattern = str("pattern") ?? "";
323
+ const path = str("path");
324
+ return (
325
+ <ToolCardShell
326
+ icon="๐Ÿ“"
327
+ label={
328
+ <>
329
+ <b>Glob</b>{" "}
330
+ <code
331
+ style={{
332
+ background: "var(--af-border-subtle)",
333
+ padding: "1px 6px",
334
+ borderRadius: 4,
335
+ fontFamily: "var(--font-mono)",
336
+ fontSize: 11,
337
+ }}
338
+ >
339
+ {pattern}
340
+ </code>
341
+ {path && (
342
+ <>
343
+ {" in "}
344
+ <PathLabel path={path} />
345
+ </>
346
+ )}
347
+ </>
348
+ }
349
+ />
350
+ );
351
+ }
352
+
353
+ if (name === "Skill") {
354
+ const skill = str("skill") ?? "";
355
+ const args = str("args");
356
+ return (
357
+ <ToolCardShell
358
+ icon="๐Ÿงฉ"
359
+ label={
360
+ <>
361
+ <b>/{skill}</b>
362
+ {args && (
363
+ <span style={{ color: "var(--af-text-secondary)" }}>{args}</span>
364
+ )}
365
+ </>
366
+ }
367
+ />
368
+ );
369
+ }
370
+
371
+ if (name === "ToolSearch") {
372
+ const query = str("query") ?? "";
373
+ const max = num("max_results");
374
+ return (
375
+ <ToolCardShell
376
+ icon="๐Ÿ”Ž"
377
+ label={
378
+ <>
379
+ <b>ToolSearch</b>{" "}
380
+ <code
381
+ style={{
382
+ background: "var(--af-border-subtle)",
383
+ padding: "1px 6px",
384
+ borderRadius: 4,
385
+ fontFamily: "var(--font-mono)",
386
+ fontSize: 11,
387
+ }}
388
+ >
389
+ {query}
390
+ </code>
391
+ {max !== undefined && (
392
+ <span
393
+ style={{ color: "var(--af-text-tertiary)", fontSize: 11 }}
394
+ >
395
+ max={max}
396
+ </span>
397
+ )}
398
+ </>
399
+ }
400
+ />
401
+ );
402
+ }
403
+
404
+ if (name === "TodoWrite") {
405
+ const todos = Array.isArray(i.todos)
406
+ ? (i.todos as Array<Record<string, unknown>>)
407
+ : [];
408
+ return (
409
+ <ToolCardShell icon="โœ…" label={<b>TodoWrite ยท {todos.length} items</b>}>
410
+ <div style={{ padding: "10px 12px", fontSize: 12 }}>
411
+ {todos.map((t, ti) => {
412
+ const status = String(t.status ?? "pending");
413
+ const content =
414
+ typeof t.content === "string"
415
+ ? t.content
416
+ : typeof t.activeForm === "string"
417
+ ? t.activeForm
418
+ : "";
419
+ const icon =
420
+ status === "completed"
421
+ ? "โœ”"
422
+ : status === "in_progress"
423
+ ? "โ—"
424
+ : "โ—‹";
425
+ return (
426
+ <div
427
+ key={ti}
428
+ style={{
429
+ display: "flex",
430
+ gap: 8,
431
+ padding: "2px 0",
432
+ opacity: status === "completed" ? 0.6 : 1,
433
+ textDecoration:
434
+ status === "completed" ? "line-through" : "none",
435
+ }}
436
+ >
437
+ <span style={{ color: "var(--af-text-tertiary)" }}>{icon}</span>
438
+ <span>{content}</span>
439
+ </div>
440
+ );
441
+ })}
442
+ </div>
443
+ </ToolCardShell>
444
+ );
445
+ }
446
+
447
+ if (name.startsWith("mcp__")) {
448
+ const short = shortenToolName(name);
449
+ return (
450
+ <ToolCardShell icon="๐Ÿ”Œ" label={<b>{short}</b>}>
451
+ <CodeBlock text={JSON.stringify(input, null, 2)} maxHeight={200} />
452
+ </ToolCardShell>
453
+ );
454
+ }
455
+
456
+ return (
457
+ <ToolCardShell icon="๐Ÿ”ง" label={<b>{name}</b>}>
458
+ <CodeBlock text={JSON.stringify(input, null, 2)} maxHeight={220} />
459
+ </ToolCardShell>
460
+ );
461
+ }