fleetlens 0.15.2 → 0.15.4

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 (222) hide show
  1. package/app/apps/web/.next/BUILD_ID +1 -1
  2. package/app/apps/web/.next/app-path-routes-manifest.json +3 -0
  3. package/app/apps/web/.next/build-manifest.json +3 -3
  4. package/app/apps/web/.next/prerender-manifest.json +3 -3
  5. package/app/apps/web/.next/routes-manifest.json +18 -0
  6. package/app/apps/web/.next/server/app/_global-error.html +1 -1
  7. package/app/apps/web/.next/server/app/_global-error.rsc +1 -1
  8. package/app/apps/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  9. package/app/apps/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  10. package/app/apps/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  11. package/app/apps/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  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.js +1 -1
  14. package/app/apps/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  15. package/app/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  16. package/app/apps/web/.next/server/app/api/ask/route.js.nft.json +1 -1
  17. package/app/apps/web/.next/server/app/api/digest/day/[date]/route.js.nft.json +1 -1
  18. package/app/apps/web/.next/server/app/api/digest/month/[yearMonth]/route.js.nft.json +1 -1
  19. package/app/apps/web/.next/server/app/api/digest/month-index/route.js.nft.json +1 -1
  20. package/app/apps/web/.next/server/app/api/digest/week/[startDate]/route.js.nft.json +1 -1
  21. package/app/apps/web/.next/server/app/api/digest/week-index/route.js.nft.json +1 -1
  22. package/app/apps/web/.next/server/app/api/menubar/route/app-paths-manifest.json +3 -0
  23. package/app/apps/web/.next/server/app/api/menubar/route/build-manifest.json +9 -0
  24. package/app/apps/web/.next/server/app/api/menubar/route/server-reference-manifest.json +4 -0
  25. package/app/apps/web/.next/server/app/api/menubar/route.js +6 -0
  26. package/app/apps/web/.next/server/app/api/menubar/route.js.map +5 -0
  27. package/app/apps/web/.next/server/app/api/menubar/route.js.nft.json +1 -0
  28. package/app/apps/web/.next/server/app/api/menubar/route_client-reference-manifest.js +3 -0
  29. package/app/apps/web/.next/server/app/api/pdf/[key]/route.js +1 -1
  30. package/app/apps/web/.next/server/app/api/pdf/[key]/route.js.nft.json +1 -1
  31. package/app/apps/web/.next/server/app/api/projects/open-folder/route/app-paths-manifest.json +3 -0
  32. package/app/apps/web/.next/server/app/api/projects/open-folder/route/build-manifest.json +9 -0
  33. package/app/apps/web/.next/server/app/api/projects/open-folder/route/server-reference-manifest.json +4 -0
  34. package/app/apps/web/.next/server/app/api/projects/open-folder/route.js +7 -0
  35. package/app/apps/web/.next/server/app/api/projects/open-folder/route.js.map +5 -0
  36. package/app/apps/web/.next/server/app/api/projects/open-folder/route.js.nft.json +1 -0
  37. package/app/apps/web/.next/server/app/api/projects/open-folder/route_client-reference-manifest.js +3 -0
  38. package/app/apps/web/.next/server/app/api/runs/[runId]/route.js.nft.json +1 -1
  39. package/app/apps/web/.next/server/app/api/runs/[runId]/stream/route.js.nft.json +1 -1
  40. package/app/apps/web/.next/server/app/api/settings/credentials/route/app-paths-manifest.json +3 -0
  41. package/app/apps/web/.next/server/app/api/settings/credentials/route/build-manifest.json +9 -0
  42. package/app/apps/web/.next/server/app/api/settings/credentials/route/server-reference-manifest.json +4 -0
  43. package/app/apps/web/.next/server/app/api/settings/credentials/route.js +10 -0
  44. package/app/apps/web/.next/server/app/api/settings/credentials/route.js.map +5 -0
  45. package/app/apps/web/.next/server/app/api/settings/credentials/route.js.nft.json +1 -0
  46. package/app/apps/web/.next/server/app/api/settings/credentials/route_client-reference-manifest.js +3 -0
  47. package/app/apps/web/.next/server/app/api/settings/route.js +4 -4
  48. package/app/apps/web/.next/server/app/api/settings/route.js.nft.json +1 -1
  49. package/app/apps/web/.next/server/app/changelog/page.js +1 -1
  50. package/app/apps/web/.next/server/app/changelog/page.js.nft.json +1 -1
  51. package/app/apps/web/.next/server/app/changelog/page_client-reference-manifest.js +1 -1
  52. package/app/apps/web/.next/server/app/day/[date]/page.js +1 -1
  53. package/app/apps/web/.next/server/app/day/[date]/page.js.nft.json +1 -1
  54. package/app/apps/web/.next/server/app/day/[date]/page_client-reference-manifest.js +1 -1
  55. package/app/apps/web/.next/server/app/day/page.js +1 -1
  56. package/app/apps/web/.next/server/app/day/page.js.nft.json +1 -1
  57. package/app/apps/web/.next/server/app/day/page_client-reference-manifest.js +1 -1
  58. package/app/apps/web/.next/server/app/digest/[date]/page.js +1 -1
  59. package/app/apps/web/.next/server/app/digest/[date]/page.js.nft.json +1 -1
  60. package/app/apps/web/.next/server/app/digest/[date]/page_client-reference-manifest.js +1 -1
  61. package/app/apps/web/.next/server/app/digest/page.js +1 -1
  62. package/app/apps/web/.next/server/app/digest/page.js.nft.json +1 -1
  63. package/app/apps/web/.next/server/app/digest/page_client-reference-manifest.js +1 -1
  64. package/app/apps/web/.next/server/app/insights/[key]/page.js +1 -1
  65. package/app/apps/web/.next/server/app/insights/[key]/page.js.nft.json +1 -1
  66. package/app/apps/web/.next/server/app/insights/[key]/page_client-reference-manifest.js +1 -1
  67. package/app/apps/web/.next/server/app/insights/page.js +1 -1
  68. package/app/apps/web/.next/server/app/insights/page.js.nft.json +1 -1
  69. package/app/apps/web/.next/server/app/insights/page_client-reference-manifest.js +1 -1
  70. package/app/apps/web/.next/server/app/page.js +1 -1
  71. package/app/apps/web/.next/server/app/page.js.nft.json +1 -1
  72. package/app/apps/web/.next/server/app/page_client-reference-manifest.js +1 -1
  73. package/app/apps/web/.next/server/app/parallelism/page.js +1 -1
  74. package/app/apps/web/.next/server/app/parallelism/page.js.nft.json +1 -1
  75. package/app/apps/web/.next/server/app/parallelism/page_client-reference-manifest.js +1 -1
  76. package/app/apps/web/.next/server/app/print/[key]/page.js +1 -1
  77. package/app/apps/web/.next/server/app/print/[key]/page.js.nft.json +1 -1
  78. package/app/apps/web/.next/server/app/print/[key]/page_client-reference-manifest.js +1 -1
  79. package/app/apps/web/.next/server/app/projects/[slug]/page.js +2 -2
  80. package/app/apps/web/.next/server/app/projects/[slug]/page.js.nft.json +1 -1
  81. package/app/apps/web/.next/server/app/projects/[slug]/page_client-reference-manifest.js +1 -1
  82. package/app/apps/web/.next/server/app/projects/page.js +1 -1
  83. package/app/apps/web/.next/server/app/projects/page.js.nft.json +1 -1
  84. package/app/apps/web/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  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.js +1 -1
  89. package/app/apps/web/.next/server/app/sessions/[id]/page.js.nft.json +1 -1
  90. package/app/apps/web/.next/server/app/sessions/[id]/page_client-reference-manifest.js +1 -1
  91. package/app/apps/web/.next/server/app/sessions/page.js +1 -1
  92. package/app/apps/web/.next/server/app/sessions/page.js.nft.json +1 -1
  93. package/app/apps/web/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  94. package/app/apps/web/.next/server/app/settings/page.js +2 -2
  95. package/app/apps/web/.next/server/app/settings/page.js.nft.json +1 -1
  96. package/app/apps/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  97. package/app/apps/web/.next/server/app/team/onboarding/page.js +1 -1
  98. package/app/apps/web/.next/server/app/team/onboarding/page.js.nft.json +1 -1
  99. package/app/apps/web/.next/server/app/team/onboarding/page_client-reference-manifest.js +1 -1
  100. package/app/apps/web/.next/server/app/team/page.js +1 -1
  101. package/app/apps/web/.next/server/app/team/page.js.nft.json +1 -1
  102. package/app/apps/web/.next/server/app/team/page_client-reference-manifest.js +1 -1
  103. package/app/apps/web/.next/server/app/usage/page.js +1 -1
  104. package/app/apps/web/.next/server/app/usage/page.js.nft.json +1 -1
  105. package/app/apps/web/.next/server/app/usage/page_client-reference-manifest.js +1 -1
  106. package/app/apps/web/.next/server/app-paths-manifest.json +3 -0
  107. package/app/apps/web/.next/server/chunks/02dz_web__next-internal_server_app_api_projects_open-folder_route_actions_0m~419c.js +3 -0
  108. package/app/apps/web/.next/server/chunks/02dz_web__next-internal_server_app_api_settings_credentials_route_actions_04an_i2.js +3 -0
  109. package/app/apps/web/.next/server/chunks/[root-of-the-server]__05z0pcw._.js +3 -0
  110. package/app/apps/web/.next/server/chunks/[root-of-the-server]__0_nle98._.js +3 -0
  111. package/app/apps/web/.next/server/chunks/[root-of-the-server]__0b5r~-1._.js +3 -0
  112. package/app/apps/web/.next/server/chunks/{[root-of-the-server]__0a0~7d6._.js → [root-of-the-server]__0t7i-hy._.js} +2 -2
  113. package/app/apps/web/.next/server/chunks/[root-of-the-server]__12iid50._.js +3 -0
  114. package/app/apps/web/.next/server/chunks/apps_web__next-internal_server_app_api_menubar_route_actions_0xep8_i.js +3 -0
  115. package/app/apps/web/.next/server/chunks/{node_modules_next_036my~r._.js → node_modules_next_04~_e52._.js} +5 -5
  116. package/app/apps/web/.next/server/chunks/packages_entries_dist_node_0bckr7-.js +14 -14
  117. package/app/apps/web/.next/server/chunks/packages_parser_dist_06d9se1._.js +1 -1
  118. package/app/apps/web/.next/server/chunks/packages_parser_dist_10ihc3~._.js +1 -1
  119. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0.zquoa._.js +1 -1
  120. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__03svi~4._.js +8 -0
  121. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__04eq6z2._.js +1 -1
  122. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__04il6m2._.js +1 -1
  123. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__08l86e-._.js +1 -1
  124. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__09rjz7_._.js +1 -1
  125. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0ar_8wr._.js +1 -1
  126. package/app/apps/web/.next/server/chunks/ssr/{[root-of-the-server]__10~b4bf._.js → [root-of-the-server]__0blm9gz._.js} +3 -3
  127. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0e.gxk3._.js +1 -1
  128. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0g-tomj._.js +3 -0
  129. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0i.q-1h._.js +1 -1
  130. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0k1x-c9._.js +1 -1
  131. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0lz4a~g._.js +1 -1
  132. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0nr2~y1._.js +3 -0
  133. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0o1_g.~._.js +1 -1
  134. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0p1x6v2._.js +1 -1
  135. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0r4tks8._.js +1 -1
  136. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0rvzdnx._.js +1 -1
  137. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0stu~~r._.js +1 -1
  138. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0tejjy_._.js +1 -1
  139. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0u39afl._.js +1 -1
  140. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0ufi3.w._.js +1 -1
  141. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0xy1qim._.js +1 -1
  142. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0~.f_3z._.js +3 -3
  143. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__10srpu0._.js +1 -1
  144. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__10xgshr._.js +1 -1
  145. package/app/apps/web/.next/server/chunks/ssr/_02r-a1a._.js +8 -0
  146. package/app/apps/web/.next/server/chunks/ssr/_0k62ejd._.js +8 -0
  147. package/app/apps/web/.next/server/chunks/ssr/{_0xu2pvc._.js → _0k8yioi._.js} +2 -2
  148. package/app/apps/web/.next/server/chunks/ssr/{_0wj750k._.js → _0t~mx7w._.js} +2 -2
  149. package/app/apps/web/.next/server/chunks/ssr/{_0kajk31._.js → _0whg~r-._.js} +2 -2
  150. package/app/apps/web/.next/server/chunks/ssr/_13jdm1g._.js +3 -0
  151. package/app/apps/web/.next/server/chunks/ssr/apps_web_0~aj0~u._.js +3 -0
  152. package/app/apps/web/.next/server/chunks/ssr/apps_web_app_sessions_sessions-grid_tsx_0bri5x.._.js +1 -1
  153. package/app/apps/web/.next/server/chunks/ssr/apps_web_components_0x014hn._.js +16 -0
  154. package/app/apps/web/.next/server/chunks/ssr/apps_web_lib_changelog_ts_0n7_p1d._.js +1 -1
  155. package/app/apps/web/.next/server/chunks/ssr/apps_web_lib_changelog_ts_0nb5_-s._.js +1 -1
  156. package/app/apps/web/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_12vc-v-._.js +3 -0
  157. package/app/apps/web/.next/server/chunks/ssr/packages_entries_dist_node_0_271yr.js +1 -1
  158. package/app/apps/web/.next/server/chunks/ssr/packages_parser_dist_0mx_509._.js +1 -1
  159. package/app/apps/web/.next/server/functions-config-manifest.json +3 -0
  160. package/app/apps/web/.next/server/middleware-build-manifest.js +3 -3
  161. package/app/apps/web/.next/server/middleware-manifest.json +5 -5
  162. package/app/apps/web/.next/server/pages/500.html +1 -1
  163. package/app/apps/web/.next/server/server-reference-manifest.js +1 -1
  164. package/app/apps/web/.next/server/server-reference-manifest.json +1 -1
  165. package/app/apps/web/.next/static/chunks/0-z49mtd-zwgv.js +1 -0
  166. package/app/apps/web/.next/static/chunks/043slkg3juwck.js +1 -0
  167. package/app/apps/web/.next/static/chunks/{0~qdw1b2uz._5.js → 044mtrzh7d7va.js} +3 -3
  168. package/app/apps/web/.next/static/chunks/05b0dn.r00hq1.js +1 -0
  169. package/app/apps/web/.next/static/chunks/{14vx702c32kn6.js → 0_0~~ipv90vm3.js} +1 -1
  170. package/app/apps/web/.next/static/chunks/0awkd5df28gvj.js +6 -0
  171. package/app/apps/web/.next/static/chunks/{0m7dd-2zd9vl2.js → 0eoc4yy0s0gpe.js} +1 -1
  172. package/app/apps/web/.next/static/chunks/0g0hv.dt-de9g.js +14 -0
  173. package/app/apps/web/.next/static/chunks/0rsp61c8wb.sx.js +6 -0
  174. package/app/apps/web/.next/static/chunks/{03rd.3cc_t~yf.js → 0s~0-8l~_kqnf.js} +1 -1
  175. package/app/apps/web/.next/static/chunks/0t2on1dhydyb2.css +1 -0
  176. package/app/apps/web/.next/static/chunks/0y3448zrint0k.js +6 -0
  177. package/app/apps/web/app/api/menubar/route.ts +66 -0
  178. package/app/apps/web/app/api/projects/open-folder/route.ts +60 -0
  179. package/app/apps/web/app/api/settings/credentials/route.ts +45 -0
  180. package/app/apps/web/app/layout.tsx +2 -0
  181. package/app/apps/web/app/projects/[slug]/local-folders-button.tsx +406 -0
  182. package/app/apps/web/app/projects/[slug]/page.tsx +155 -20
  183. package/app/apps/web/app/projects/page.tsx +2 -2
  184. package/app/apps/web/app/sessions/[id]/page.tsx +4 -1
  185. package/app/apps/web/app/sessions/[id]/session-view/header-stats.tsx +81 -0
  186. package/app/apps/web/app/sessions/[id]/session-view.tsx +11 -0
  187. package/app/apps/web/app/sessions/sessions-grid.tsx +56 -25
  188. package/app/apps/web/app/settings/page.tsx +26 -0
  189. package/app/apps/web/app/usage/page.tsx +80 -0
  190. package/app/apps/web/components/menubar-install-banner.tsx +117 -0
  191. package/app/apps/web/components/menubar-install.tsx +107 -0
  192. package/app/apps/web/components/zai-credentials-form.tsx +116 -0
  193. package/app/apps/web/lib/changelog-data.generated.ts +1 -1
  194. package/app/apps/web/lib/entries-index.ts +4 -4
  195. package/app/apps/web/lib/menubar-data.ts +50 -0
  196. package/app/apps/web/lib/usage-data.ts +4 -0
  197. package/app/apps/web/package.json +1 -1
  198. package/app/apps/web/tsconfig.tsbuildinfo +1 -1
  199. package/dist/daemon-worker.js +640 -240
  200. package/dist/index.js +938 -283
  201. package/package.json +3 -2
  202. package/app/apps/web/.next/server/chunks/[root-of-the-server]__065lib8._.js +0 -3
  203. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0a7n44-._.js +0 -3
  204. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0c00i76._.js +0 -3
  205. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0lhwp-k._.js +0 -8
  206. package/app/apps/web/.next/server/chunks/ssr/_0s3n5mz._.js +0 -8
  207. package/app/apps/web/.next/server/chunks/ssr/_12mbgs5._.js +0 -3
  208. package/app/apps/web/.next/server/chunks/ssr/apps_web_0q2x4a~._.js +0 -3
  209. package/app/apps/web/.next/server/chunks/ssr/apps_web_components_0b-4-4j._.js +0 -8
  210. package/app/apps/web/.next/server/chunks/ssr/apps_web_components_0txtsv5._.js +0 -16
  211. package/app/apps/web/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_0cepfi8._.js +0 -3
  212. package/app/apps/web/.next/static/chunks/00a9oyw~h5i1p.js +0 -1
  213. package/app/apps/web/.next/static/chunks/03gy1evbn94qu.js +0 -6
  214. package/app/apps/web/.next/static/chunks/040s42ypidk7s.css +0 -1
  215. package/app/apps/web/.next/static/chunks/0d2x-wfu.m0-z.js +0 -6
  216. package/app/apps/web/.next/static/chunks/0i77er85v.rj..js +0 -1
  217. package/app/apps/web/.next/static/chunks/0nqklmbs5s3ax.js +0 -6
  218. package/app/apps/web/.next/static/chunks/0tirv_vo6q8uc.js +0 -1
  219. package/app/apps/web/.next/static/chunks/0u6gxpqhl0gc7.js +0 -14
  220. /package/app/apps/web/.next/static/{mTj8nKiazosAKJec15dLe → nmAGY0LiBgXuibWTKZ1RD}/_buildManifest.js +0 -0
  221. /package/app/apps/web/.next/static/{mTj8nKiazosAKJec15dLe → nmAGY0LiBgXuibWTKZ1RD}/_clientMiddlewareManifest.js +0 -0
  222. /package/app/apps/web/.next/static/{mTj8nKiazosAKJec15dLe → nmAGY0LiBgXuibWTKZ1RD}/_ssgManifest.js +0 -0
@@ -1,4 +1,4 @@
1
- (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,40484,e=>{"use strict";var t=e.i(18050);let r={build:"var(--af-accent)",plan:"#9f7aea",debug:"#ed8936",review:"#4299e1",refactor:"#38b2ac",test:"#48bb78",release:"#ed64a6",research:"#a0aec0",steer:"#f6ad55",meta:"#718096",warmup_minimal:"#cbd5e0"};e.s(["GoalBar",0,function({goals:e,total:i,height:a=12}){return 0===i||0===e.length?(0,t.jsx)("p",{style:{fontSize:12,color:"var(--af-text-tertiary)",margin:0},children:"No goal data."}):(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{style:{display:"flex",gap:2,height:a,borderRadius:3,overflow:"hidden"},children:e.map(e=>{let a=e.minutes/i*100;return(0,t.jsx)("div",{style:{width:`${a}%`,background:r[e.category]??"#888"},title:`${e.category}: ${Math.round(e.minutes)}m (${a.toFixed(0)}%)`},e.category)})}),(0,t.jsx)("div",{style:{display:"flex",gap:14,marginTop:8,flexWrap:"wrap",fontSize:11,color:"var(--af-text-tertiary)"},children:e.map(e=>(0,t.jsxs)("span",{style:{display:"inline-flex",alignItems:"center",gap:5},children:[(0,t.jsx)("span",{style:{width:8,height:8,borderRadius:2,background:r[e.category]??"#888"}}),e.category," ",Math.round(e.minutes),"m"]},e.category))})]})}])},84500,e=>{"use strict";var t=e.i(18050),r=e.i(22016);let i={essential:"#48bb78",helpful:"#4299e1",neutral:"#a0aec0",unhelpful:"#f56565"};function a({helpfulness_by_week:e}){return e.some(e=>null!==e.helpfulness)?(0,t.jsx)("div",{style:{display:"flex",gap:6,alignItems:"stretch",padding:"12px 0",marginBottom:24},children:e.map((e,r)=>(0,t.jsxs)("div",{style:{flex:1,padding:"10px 4px",borderRadius:6,textAlign:"center",background:e.helpfulness?`color-mix(in srgb, ${i[e.helpfulness]} 14%, transparent)`:"var(--af-surface)",border:`1px solid ${e.helpfulness?`color-mix(in srgb, ${i[e.helpfulness]} 28%, transparent)`:"var(--af-border-subtle)"}`},children:[(0,t.jsx)("div",{style:{fontSize:9,fontWeight:700,letterSpacing:"0.04em",color:"var(--af-text-tertiary)",marginBottom:4,fontFamily:"var(--font-mono)"},children:e.week_start.slice(5)}),(0,t.jsx)("div",{style:{fontSize:10,fontWeight:600,color:e.helpfulness?i[e.helpfulness]:"var(--af-text-tertiary)"},children:e.helpfulness??"—"})]},r))}):null}function n({title:e,children:r}){return(0,t.jsxs)("section",{style:{marginBottom:28},children:[(0,t.jsx)("h2",{style:{fontSize:11,fontWeight:700,letterSpacing:"0.08em",textTransform:"uppercase",color:"var(--af-text-tertiary)",margin:"0 0 12px"},children:e}),r]})}e.s(["MonthDigest",0,function({digest:e,aiEnabled:i,actions:s}){let l=Object.values(e.outcome_mix).reduce((e,t)=>e+(t??0),0),o=e.shipped.length,d=e.agent_min_total/60,c=d>=1?`${d.toFixed(1)}h`:`${Math.round(e.agent_min_total)}m`,f=function(e){let[t,r]=e.split("-");return new Date(Number(t),Number(r)-1,1).toLocaleDateString("en-US",{month:"long",year:"numeric"})}(e.key);return(0,t.jsxs)("div",{style:{maxWidth:980,margin:"0 auto",padding:"24px 40px"},children:[(0,t.jsxs)("header",{style:{marginBottom:28},children:[(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:10,marginBottom:8,fontSize:12,color:"var(--af-text-tertiary)",fontWeight:500,flexWrap:"wrap"},children:[(0,t.jsx)("span",{style:{textTransform:"uppercase",letterSpacing:"0.06em"},children:f}),(0,t.jsx)("span",{style:{color:"var(--af-text-tertiary)"},children:"·"}),(0,t.jsxs)("span",{style:{fontFamily:"var(--font-mono)",color:"var(--af-text-secondary)"},children:[c," agent time · ",l," active day",1===l?"":"s"," · ",o," PR",1===o?"":"s"]}),s&&(0,t.jsx)("div",{style:{marginLeft:"auto",display:"inline-flex",alignItems:"center",gap:8},children:s})]}),e.headline?(0,t.jsx)("h1",{style:{fontSize:26,fontWeight:700,lineHeight:1.3,letterSpacing:"-0.02em",margin:"0 0 14px",maxWidth:820,color:"var(--af-text)"},children:e.headline}):(0,t.jsx)("h1",{style:{fontSize:20,color:"var(--af-text-secondary)",margin:"0 0 14px"},children:i?"No narrative yet.":`Worked ${c} across ${e.projects.length} project${1===e.projects.length?"":"s"}.`})]}),!i&&(0,t.jsxs)("div",{style:{padding:14,marginBottom:24,background:"var(--af-accent-subtle)",borderRadius:8,fontSize:13,color:"var(--af-text)"},children:["Enable AI features in ",(0,t.jsx)(r.default,{href:"/settings",style:{color:"var(--af-accent)"},children:"Settings"})," to see monthly narratives."]}),(0,t.jsx)(a,{helpfulness_by_week:e.helpfulness_by_week}),e.standout_weeks&&e.standout_weeks.length>0&&(0,t.jsx)(n,{title:"Standout weeks",children:(0,t.jsx)("ul",{style:{listStyle:"none",padding:0,margin:0,display:"flex",flexDirection:"column",gap:10},children:e.standout_weeks.map(e=>(0,t.jsxs)("li",{style:{padding:"12px 14px",borderRadius:8,background:"var(--af-surface)",border:"1px solid var(--af-border-subtle)",display:"flex",gap:12,alignItems:"flex-start"},children:[(0,t.jsxs)(r.default,{href:`/insights/week-${e.week_start}`,style:{fontSize:11,fontWeight:600,color:"var(--af-accent)",textDecoration:"none",flexShrink:0,paddingTop:2,fontFamily:"var(--font-mono)"},children:["Week ",e.week_start.slice(5)]}),(0,t.jsx)("span",{style:{fontSize:13,lineHeight:1.55,color:"var(--af-text)"},children:e.why})]},e.week_start))})}),e.trajectory&&e.trajectory.length>0&&(0,t.jsx)(n,{title:"Trajectory",children:(0,t.jsx)("ol",{style:{listStyle:"none",padding:0,margin:0,display:"flex",flexDirection:"column",gap:8},children:e.trajectory.map(e=>(0,t.jsxs)("li",{style:{display:"flex",gap:12,alignItems:"flex-start"},children:[(0,t.jsxs)(r.default,{href:`/insights/week-${e.week_start}`,style:{fontSize:10,fontWeight:600,color:"var(--af-text-tertiary)",fontFamily:"var(--font-mono)",flexShrink:0,width:92,paddingTop:3,textDecoration:"none"},children:["Week ",e.week_start.slice(5)]}),(0,t.jsx)("span",{style:{fontSize:13,lineHeight:1.55,color:"var(--af-text-secondary)"},children:e.line})]},e.week_start))})}),e.friction_themes&&e.friction_themes.trim().length>0&&(0,t.jsx)(n,{title:"Friction patterns",children:(0,t.jsx)("p",{style:{fontSize:13,lineHeight:1.6,margin:0,color:"var(--af-text)"},children:e.friction_themes})}),e.suggestion&&(0,t.jsx)(n,{title:"Suggestion",children:(0,t.jsxs)("div",{style:{padding:"14px 16px",borderRadius:8,background:"var(--af-accent-subtle)",border:"1px solid color-mix(in srgb, var(--af-accent) 18%, var(--af-border))"},children:[(0,t.jsx)("div",{style:{fontSize:14,fontWeight:600,color:"var(--af-text)",marginBottom:6},children:e.suggestion.headline}),(0,t.jsx)("div",{style:{fontSize:13,lineHeight:1.55,color:"var(--af-text-secondary)"},children:e.suggestion.body})]})}),e.projects.length>0&&(0,t.jsx)(n,{title:"Projects",children:(0,t.jsx)("ul",{style:{listStyle:"none",padding:0,margin:0,display:"flex",flexDirection:"column",gap:4},children:e.projects.map(e=>(0,t.jsxs)("li",{style:{display:"flex",gap:10,alignItems:"baseline",padding:"6px 10px",borderRadius:6,fontSize:12,color:"var(--af-text)"},children:[(0,t.jsx)("span",{style:{flex:1,minWidth:0,fontWeight:500},children:e.display_name}),(0,t.jsxs)("span",{style:{fontFamily:"var(--font-mono)",fontSize:10,color:"var(--af-text-tertiary)"},children:[Math.round(e.agent_min),"m · ",e.share_pct.toFixed(0),"% · ",e.shipped_count," PR"]})]},e.name))})})]})}])},63059,e=>{"use strict";let t=(0,e.i(75254).default)("ChevronRight",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);e.s(["ChevronRight",0,t],63059)},37727,e=>{"use strict";let t=(0,e.i(75254).default)("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);e.s(["X",0,t],37727)},74886,e=>{"use strict";let t=(0,e.i(75254).default)("Copy",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]);e.s(["Copy",0,t],74886)},73375,e=>{"use strict";let t=(0,e.i(75254).default)("ChevronLeft",[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]);e.s(["ChevronLeft",0,t],73375)},21886,e=>{"use strict";var t=e.i(18050),r=e.i(71645);let i=(0,e.i(75254).default)("Download",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"7 10 12 15 17 10",key:"2ggqvy"}],["line",{x1:"12",x2:"12",y1:"15",y2:"3",key:"1vk2je"}]]);function a({digestKey:e}){let[n,s]=(0,r.useState)("idle"),[l,o]=(0,r.useState)(null);async function d(){s("loading"),o(null);try{var t,r;let i,a,n=await fetch(`/api/pdf/${e}`,{method:"POST"});if(!n.ok){let e=await n.json().catch(()=>({error:`HTTP ${n.status}`}));throw Error(e.error??`HTTP ${n.status}`)}let l=await n.blob(),o=function(e){if(!e)return null;let t=/filename="([^"]+)"/.exec(e)??/filename=([^;]+)/.exec(e);return t?t[1].trim():null}(n.headers.get("content-disposition"))??`fleetlens-${e}.pdf`;t=l,r=o,i=URL.createObjectURL(t),(a=document.createElement("a")).href=i,a.download=r,document.body.appendChild(a),a.click(),a.remove(),setTimeout(()=>URL.revokeObjectURL(i),1e3),s("idle")}catch(e){o(e instanceof Error?e.message:String(e)),s("error")}}let c="loading"===n;return(0,t.jsx)("span",{style:{display:"inline-flex",alignItems:"center",gap:6},children:(0,t.jsxs)("button",{onClick:d,disabled:c,title:l??"Download as PDF",style:{padding:"2px 8px",background:"transparent",border:"1px solid var(--af-border-subtle)",borderRadius:4,fontSize:10,color:"error"===n?"#f56565":"var(--af-text-secondary)",cursor:c?"default":"pointer",opacity:c?.6:1,display:"inline-flex",alignItems:"center",gap:4},children:[(0,t.jsx)(i,{size:11}),"loading"===n?"Exporting…":"error"===n?"Retry PDF":"PDF"]})})}e.s(["DigestActions",0,function({digestKey:e,period:r,hasDigest:i,narrativeFresh:n,isStreaming:s,aiEnabled:l,progress:o,onGenerate:d,onReroll:c,rerollTitle:f}){var p,g;let h=`Re-roll the narrative for this ${r}`,x=i?(0,t.jsx)(a,{digestKey:`${r}-${e}`}):null,y=null;return!n&&l?y=(0,t.jsx)("button",{onClick:d,disabled:s,style:{padding:"4px 10px",background:"var(--af-accent)",color:"white",border:"none",borderRadius:5,cursor:(p=s)?"default":"pointer",fontSize:11,fontWeight:600,opacity:p?.6:1},children:s?"Generating...":i?"Generate":"Generate digest"}):l&&(y=(0,t.jsxs)("span",{style:{fontSize:10,color:"var(--af-text-tertiary)",display:"inline-flex",gap:6,alignItems:"center"},children:["✓ Up to date",(0,t.jsx)("button",{onClick:c,disabled:s,title:f??h,style:{padding:"2px 7px",background:"transparent",border:"1px solid var(--af-border-subtle)",borderRadius:4,fontSize:10,color:"var(--af-text-secondary)",cursor:(g=s)?"default":"pointer",opacity:g?.6:1},children:s?"...":"Re-roll"})]})),o&&(y=(0,t.jsxs)(t.Fragment,{children:[y,(0,t.jsx)("span",{style:{fontSize:10,color:"var(--af-text-tertiary)"},children:o})]})),x&&(y=(0,t.jsxs)(t.Fragment,{children:[y,x]})),y}],21886)},1033,e=>{"use strict";var t=e.i(18050),r=e.i(71645),i=e.i(95419),a=e.i(21886);function n({monday:e,isStreaming:r,aiEnabled:i,progress:a,onGenerate:s}){let l=new Date(`${e}T12:00:00`),o=new Date(l);o.setDate(l.getDate()+6);let d=e=>e.toLocaleDateString("en-US",{month:"short",day:"numeric"}),c=`${d(l)} — ${d(o)}`;return(0,t.jsx)("div",{style:{maxWidth:980,margin:"0 auto",padding:"60px 40px"},children:(0,t.jsxs)("div",{style:{margin:"0 auto",maxWidth:480,padding:"32px 28px",borderRadius:14,background:"var(--af-surface)",border:"1px dashed var(--af-border-subtle)",textAlign:"center"},children:[(0,t.jsx)("div",{style:{width:44,height:44,borderRadius:12,margin:"0 auto 16px",background:"var(--af-accent-subtle)",display:"flex",alignItems:"center",justifyContent:"center",color:"var(--af-accent)",fontSize:20},children:"✦"}),(0,t.jsx)("h2",{style:{fontSize:16,fontWeight:600,margin:"0 0 6px",color:"var(--af-text)",letterSpacing:"-0.01em"},children:r?"Generating digest…":"No digest yet for this week"}),(0,t.jsx)("p",{style:{fontSize:12.5,lineHeight:1.55,margin:"0 0 18px",color:"var(--af-text-secondary)"},children:r?`Synthesizing ${c} from this week's day digests. This usually takes 5–10 minutes.`:i?`Once generated, this view shows top sessions, trajectory, findings, and project areas for ${c}.`:`Enable AI features in Settings to synthesize a weekly narrative for ${c}. Deterministic stats are still available below in the live digest as soon as data lands.`}),i&&(0,t.jsx)("button",{onClick:s,disabled:r,style:{padding:"9px 18px",borderRadius:8,background:r?"var(--af-border-subtle)":"var(--af-accent)",color:r?"var(--af-text-tertiary)":"white",border:"none",cursor:r?"default":"pointer",fontSize:13,fontWeight:600,letterSpacing:"-0.005em"},children:r?"Generating…":"Generate digest"}),a&&(0,t.jsx)("div",{style:{marginTop:12,fontSize:10.5,color:"var(--af-text-tertiary)",fontFamily:"var(--font-mono)"},children:a})]})})}e.s(["WeekDigestView",0,function({initial:e,monday:s,aiEnabled:l,autoFire:o=!1,prior:d}){let[c,f]=(0,r.useState)(e),[p,g]=(0,r.useState)("idle"),[h,x]=(0,r.useState)(""),y=(0,r.useRef)(!1),u=(0,r.useCallback)(async(e=!1)=>{g("streaming"),x("Starting...");let t=`/api/digest/week/${s}${e?"?force=1":""}`,r=await fetch(t,{method:"POST"});if(!r.ok||!r.body){g("error"),x(`Error ${r.status}`);return}let i=r.body.getReader(),a=new TextDecoder,n="";for(;;){let{done:e,value:t}=await i.read();if(e)break;let r=(n+=a.decode(t,{stream:!0})).split("\n\n");for(let e of(n=r.pop()??"",r)){let t=e.split("\n").find(e=>e.startsWith("data: "));if(t)try{let e=JSON.parse(t.slice(6));if("status"===e.type)x(e.text);else if("dependency"===e.type)x(`${"day"===e.kind?"Day":"Week"} ${e.key} ${e.status}`);else if("entry"===e.type)x(`Enriching ${e.index}/${e.total}...`);else if("progress"===e.type){let t=Math.round(e.elapsed_ms/1e3);x(`Claude composing… ${e.bytes.toLocaleString()} chars (${t}s)`)}else if("digest"===e.type)e.digest&&"week"===e.digest.scope&&f(e.digest),x("Rendering...");else if("saved"===e.type)x("Saved.");else if("error"===e.type){g("error"),x(e.message);return}}catch{}}}g("done"),x("")},[s]);(0,r.useEffect)(()=>{o&&!y.current&&"idle"===p&&(y.current=!0,u(!1))},[o,p,u]);let m="streaming"===p,v=!!c?.headline,b=(0,t.jsx)(a.DigestActions,{digestKey:s,period:"week",hasDigest:!!c,narrativeFresh:v,isStreaming:m,aiEnabled:l,progress:h,onGenerate:()=>u(!1),onReroll:()=>u(!0),rerollTitle:"Re-roll the narrative for this week"});return c?(0,t.jsx)(i.WeekDigest,{digest:c,aiEnabled:l,actions:b,priorDigest:d??null}):(0,t.jsx)(n,{monday:s,isStreaming:m,aiEnabled:l,progress:h,onGenerate:()=>u(!1)})}])},57143,e=>{"use strict";var t=e.i(18050),r=e.i(22016),i=e.i(71645),a=e.i(73375),n=e.i(63059);let s=(0,e.i(75254).default)("History",[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M12 7v5l4 2",key:"1fdv2h"}]]);var l=e.i(37727);function o({inDrawer:e=!1}={}){let[r,a]=(0,i.useState)("weeks"),[n,s]=(0,i.useState)(null),[l,x]=(0,i.useState)(null);return(0,i.useEffect)(()=>{fetch("/api/digest/week-index?count=12").then(e=>e.json()).then(e=>s(e.weeks)).catch(()=>s([])),fetch("/api/digest/month-index?count=6").then(e=>e.json()).then(e=>x(e.months)).catch(()=>x([]))},[]),(0,t.jsxs)("div",{style:e?{padding:"0 18px"}:{maxWidth:980,margin:"0 auto",padding:"28px 40px 0"},children:[(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:10,marginBottom:e?14:18},children:[!e&&(0,t.jsx)("h2",{style:{fontSize:11,fontWeight:700,letterSpacing:"0.08em",textTransform:"uppercase",color:"var(--af-text-tertiary)",margin:0,marginRight:4},children:"History"}),(0,t.jsx)("div",{style:p,children:["weeks","months"].map(e=>(0,t.jsx)("button",{type:"button",onClick:()=>a(e),style:{...g,background:r===e?"var(--af-accent)":"transparent",color:r===e?"white":"var(--af-text-secondary)"},children:"weeks"===e?"Weeks":"Months"},e))})]}),"weeks"===r?null===n?(0,t.jsx)(f,{children:"Loading weeks…"}):0===n.length?(0,t.jsx)(f,{children:"No history yet."}):(0,t.jsx)("ul",{style:h,children:n.map(e=>(0,t.jsx)(d,{w:e},e.start))}):null===l?(0,t.jsx)(f,{children:"Loading months…"}):0===l.length?(0,t.jsx)(f,{children:"No history yet."}):(0,t.jsx)("ul",{style:h,children:l.map(e=>(0,t.jsx)(c,{m:e},e.start))})]})}function d({w:e}){let i=0===e.active_days&&!e.in_progress&&!e.saved_key,a=e.saved_key?`/insights/${e.saved_key}`:`/insights/week-${e.start}`,n=e.saved_key&&e.headline?e.headline:i?"no data":e.in_progress?"in progress · click to view":`${e.active_days} active day${1===e.active_days?"":"s"} \xb7 click to generate`;return(0,t.jsx)("li",{style:x(!!e.saved_key),children:(0,t.jsxs)(r.default,{href:a,style:{display:"flex",flexDirection:"column",gap:4,textDecoration:"none",flex:1,minWidth:0},children:[(0,t.jsxs)("div",{style:y,children:[(0,t.jsxs)("span",{style:{fontSize:13,fontWeight:600,color:"var(--af-text)",letterSpacing:"-0.01em"},children:["W",String(e.iso_week).padStart(2,"0")," · ",e.label]}),e.in_progress&&(0,t.jsx)("span",{style:m,children:"in progress"}),e.saved_key&&(0,t.jsxs)("span",{style:{fontSize:10,fontWeight:600,color:"var(--af-accent)",marginLeft:"auto"},children:[e.shipped_count," PR · ",e.agent_min,"m"]})]}),(0,t.jsx)("span",{style:u,children:n})]})})}function c({m:e}){let i=0===e.active_days&&!e.in_progress&&!e.saved_key,a=e.saved_key?`/insights/${e.saved_key}`:`/insights/month-${e.start.slice(0,7)}`,n=e.saved_key&&e.headline?e.headline:i?"no data":e.in_progress?"in progress · click to view":`${e.active_days} active day${1===e.active_days?"":"s"} \xb7 click to generate`;return(0,t.jsx)("li",{style:x(!!e.saved_key),children:(0,t.jsxs)(r.default,{href:a,style:{display:"flex",flexDirection:"column",gap:4,textDecoration:"none",flex:1,minWidth:0},children:[(0,t.jsxs)("div",{style:y,children:[(0,t.jsx)("span",{style:{fontSize:13,fontWeight:600,color:"var(--af-text)",letterSpacing:"-0.01em"},children:e.label}),e.in_progress&&(0,t.jsx)("span",{style:m,children:"in progress"}),e.saved_key&&(0,t.jsxs)("span",{style:{fontSize:10,fontWeight:600,color:"var(--af-accent)",marginLeft:"auto"},children:[e.shipped_count," PR · ",e.agent_min,"m"]})]}),(0,t.jsx)("span",{style:u,children:n})]})})}function f({children:e}){return(0,t.jsx)("div",{style:{padding:"20px 18px",borderRadius:10,border:"1px dashed var(--af-border)",background:"var(--af-surface)",fontSize:13,color:"var(--af-text-tertiary)",lineHeight:1.55},children:e})}let p={display:"inline-flex",gap:3,border:"1px solid var(--af-border)",borderRadius:8,padding:2},g={padding:"5px 14px",fontSize:12,fontWeight:600,border:"none",borderRadius:6,cursor:"pointer"},h={listStyle:"none",padding:0,margin:0,display:"flex",flexDirection:"column",gap:4};function x(e){return{display:"flex",alignItems:"stretch",gap:14,padding:"10px 14px",borderRadius:10,border:`1px solid ${e?"color-mix(in srgb, var(--af-accent) 24%, var(--af-border))":"var(--af-border-subtle)"}`,background:e?"color-mix(in srgb, var(--af-accent) 6%, var(--af-surface))":"var(--af-surface)",transition:"border-color 0.15s"}}let y={display:"flex",alignItems:"center",gap:8,minWidth:0},u={fontSize:11,color:"var(--af-text-tertiary)",lineHeight:1.5,fontFamily:"var(--font-mono)"},m={fontSize:10,fontWeight:500,padding:"2px 6px",borderRadius:4,background:"color-mix(in srgb, #f5b445 18%, transparent)",color:"#c08a1f",letterSpacing:"0.02em"};function v({target:e,dir:i}){var s;let l="prev"===i?a.ChevronLeft:n.ChevronRight;return e?(0,t.jsxs)(r.default,{href:`/insights/${e.key}`,style:(s=e.cached,{display:"inline-flex",alignItems:"center",gap:4,padding:"5px 9px",borderRadius:6,border:`1px solid ${s?"color-mix(in srgb, var(--af-accent) 28%, var(--af-border))":"var(--af-border-subtle)"}`,background:s?"color-mix(in srgb, var(--af-accent) 6%, var(--af-surface))":"var(--af-surface)",color:s?"var(--af-accent)":"var(--af-text-secondary)",fontSize:11,fontWeight:500,fontFamily:"var(--font-mono)",textDecoration:"none"}),title:e.cached?`Saved digest \xb7 ${e.label}`:`${e.label} (no saved digest yet — will prompt to Generate)`,children:[(0,t.jsx)(l,{size:14}),(0,t.jsx)("span",{children:e.label})]}):(0,t.jsx)("span",{style:k,title:`No ${"prev"===i?"earlier":"later"} period`,children:(0,t.jsx)(l,{size:14})})}function b({onClose:e}){return(0,t.jsxs)("div",{role:"dialog","aria-modal":"true","aria-label":"Insights history",style:{position:"fixed",inset:0,zIndex:200,display:"flex",justifyContent:"flex-end"},children:[(0,t.jsx)("div",{onClick:e,style:{position:"absolute",inset:0,background:"rgba(0,0,0,0.32)",animation:"fade-in 120ms ease-out"}}),(0,t.jsxs)("aside",{style:{position:"relative",width:"min(440px, 92vw)",height:"100vh",background:"var(--background)",borderLeft:"1px solid var(--af-border-subtle)",boxShadow:"-12px 0 40px rgba(0,0,0,0.32)",display:"flex",flexDirection:"column",animation:"slide-in 160ms cubic-bezier(0.2, 0.9, 0.3, 1)"},children:[(0,t.jsxs)("header",{style:{display:"flex",alignItems:"center",gap:10,padding:"14px 18px",borderBottom:"1px solid var(--af-border-subtle)"},children:[(0,t.jsx)("h2",{style:{fontSize:13,fontWeight:600,margin:0,color:"var(--af-text)"},children:"Browse insights history"}),(0,t.jsx)("button",{type:"button",onClick:e,"aria-label":"Close history",style:{marginLeft:"auto",width:26,height:26,display:"inline-flex",alignItems:"center",justifyContent:"center",border:"1px solid var(--af-border-subtle)",borderRadius:6,background:"transparent",color:"var(--af-text-secondary)",cursor:"pointer"},children:(0,t.jsx)(l.X,{size:14})})]}),(0,t.jsx)("div",{style:{flex:1,overflowY:"auto",padding:"18px 0"},children:(0,t.jsx)(o,{inDrawer:!0})})]}),(0,t.jsx)("style",{children:`
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,40484,e=>{"use strict";var t=e.i(18050);let r={build:"var(--af-accent)",plan:"#9f7aea",debug:"#ed8936",review:"#4299e1",refactor:"#38b2ac",test:"#48bb78",release:"#ed64a6",research:"#a0aec0",steer:"#f6ad55",meta:"#718096",warmup_minimal:"#cbd5e0"};e.s(["GoalBar",0,function({goals:e,total:i,height:a=12}){return 0===i||0===e.length?(0,t.jsx)("p",{style:{fontSize:12,color:"var(--af-text-tertiary)",margin:0},children:"No goal data."}):(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{style:{display:"flex",gap:2,height:a,borderRadius:3,overflow:"hidden"},children:e.map(e=>{let a=e.minutes/i*100;return(0,t.jsx)("div",{style:{width:`${a}%`,background:r[e.category]??"#888"},title:`${e.category}: ${Math.round(e.minutes)}m (${a.toFixed(0)}%)`},e.category)})}),(0,t.jsx)("div",{style:{display:"flex",gap:14,marginTop:8,flexWrap:"wrap",fontSize:11,color:"var(--af-text-tertiary)"},children:e.map(e=>(0,t.jsxs)("span",{style:{display:"inline-flex",alignItems:"center",gap:5},children:[(0,t.jsx)("span",{style:{width:8,height:8,borderRadius:2,background:r[e.category]??"#888"}}),e.category," ",Math.round(e.minutes),"m"]},e.category))})]})}])},84500,e=>{"use strict";var t=e.i(18050),r=e.i(22016);let i={essential:"#48bb78",helpful:"#4299e1",neutral:"#a0aec0",unhelpful:"#f56565"};function a({helpfulness_by_week:e}){return e.some(e=>null!==e.helpfulness)?(0,t.jsx)("div",{style:{display:"flex",gap:6,alignItems:"stretch",padding:"12px 0",marginBottom:24},children:e.map((e,r)=>(0,t.jsxs)("div",{style:{flex:1,padding:"10px 4px",borderRadius:6,textAlign:"center",background:e.helpfulness?`color-mix(in srgb, ${i[e.helpfulness]} 14%, transparent)`:"var(--af-surface)",border:`1px solid ${e.helpfulness?`color-mix(in srgb, ${i[e.helpfulness]} 28%, transparent)`:"var(--af-border-subtle)"}`},children:[(0,t.jsx)("div",{style:{fontSize:9,fontWeight:700,letterSpacing:"0.04em",color:"var(--af-text-tertiary)",marginBottom:4,fontFamily:"var(--font-mono)"},children:e.week_start.slice(5)}),(0,t.jsx)("div",{style:{fontSize:10,fontWeight:600,color:e.helpfulness?i[e.helpfulness]:"var(--af-text-tertiary)"},children:e.helpfulness??"—"})]},r))}):null}function n({title:e,children:r}){return(0,t.jsxs)("section",{style:{marginBottom:28},children:[(0,t.jsx)("h2",{style:{fontSize:11,fontWeight:700,letterSpacing:"0.08em",textTransform:"uppercase",color:"var(--af-text-tertiary)",margin:"0 0 12px"},children:e}),r]})}e.s(["MonthDigest",0,function({digest:e,aiEnabled:i,actions:s}){let l=Object.values(e.outcome_mix).reduce((e,t)=>e+(t??0),0),o=e.shipped.length,d=e.agent_min_total/60,c=d>=1?`${d.toFixed(1)}h`:`${Math.round(e.agent_min_total)}m`,f=function(e){let[t,r]=e.split("-");return new Date(Number(t),Number(r)-1,1).toLocaleDateString("en-US",{month:"long",year:"numeric"})}(e.key);return(0,t.jsxs)("div",{style:{maxWidth:980,margin:"0 auto",padding:"24px 40px"},children:[(0,t.jsxs)("header",{style:{marginBottom:28},children:[(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:10,marginBottom:8,fontSize:12,color:"var(--af-text-tertiary)",fontWeight:500,flexWrap:"wrap"},children:[(0,t.jsx)("span",{style:{textTransform:"uppercase",letterSpacing:"0.06em"},children:f}),(0,t.jsx)("span",{style:{color:"var(--af-text-tertiary)"},children:"·"}),(0,t.jsxs)("span",{style:{fontFamily:"var(--font-mono)",color:"var(--af-text-secondary)"},children:[c," agent time · ",l," active day",1===l?"":"s"," · ",o," PR",1===o?"":"s"]}),s&&(0,t.jsx)("div",{style:{marginLeft:"auto",display:"inline-flex",alignItems:"center",gap:8},children:s})]}),e.headline?(0,t.jsx)("h1",{style:{fontSize:26,fontWeight:700,lineHeight:1.3,letterSpacing:"-0.02em",margin:"0 0 14px",maxWidth:820,color:"var(--af-text)"},children:e.headline}):(0,t.jsx)("h1",{style:{fontSize:20,color:"var(--af-text-secondary)",margin:"0 0 14px"},children:i?"No narrative yet.":`Worked ${c} across ${e.projects.length} project${1===e.projects.length?"":"s"}.`})]}),!i&&(0,t.jsxs)("div",{style:{padding:14,marginBottom:24,background:"var(--af-accent-subtle)",borderRadius:8,fontSize:13,color:"var(--af-text)"},children:["Enable AI features in ",(0,t.jsx)(r.default,{href:"/settings",style:{color:"var(--af-accent)"},children:"Settings"})," to see monthly narratives."]}),(0,t.jsx)(a,{helpfulness_by_week:e.helpfulness_by_week}),e.standout_weeks&&e.standout_weeks.length>0&&(0,t.jsx)(n,{title:"Standout weeks",children:(0,t.jsx)("ul",{style:{listStyle:"none",padding:0,margin:0,display:"flex",flexDirection:"column",gap:10},children:e.standout_weeks.map(e=>(0,t.jsxs)("li",{style:{padding:"12px 14px",borderRadius:8,background:"var(--af-surface)",border:"1px solid var(--af-border-subtle)",display:"flex",gap:12,alignItems:"flex-start"},children:[(0,t.jsxs)(r.default,{href:`/insights/week-${e.week_start}`,style:{fontSize:11,fontWeight:600,color:"var(--af-accent)",textDecoration:"none",flexShrink:0,paddingTop:2,fontFamily:"var(--font-mono)"},children:["Week ",e.week_start.slice(5)]}),(0,t.jsx)("span",{style:{fontSize:13,lineHeight:1.55,color:"var(--af-text)"},children:e.why})]},e.week_start))})}),e.trajectory&&e.trajectory.length>0&&(0,t.jsx)(n,{title:"Trajectory",children:(0,t.jsx)("ol",{style:{listStyle:"none",padding:0,margin:0,display:"flex",flexDirection:"column",gap:8},children:e.trajectory.map(e=>(0,t.jsxs)("li",{style:{display:"flex",gap:12,alignItems:"flex-start"},children:[(0,t.jsxs)(r.default,{href:`/insights/week-${e.week_start}`,style:{fontSize:10,fontWeight:600,color:"var(--af-text-tertiary)",fontFamily:"var(--font-mono)",flexShrink:0,width:92,paddingTop:3,textDecoration:"none"},children:["Week ",e.week_start.slice(5)]}),(0,t.jsx)("span",{style:{fontSize:13,lineHeight:1.55,color:"var(--af-text-secondary)"},children:e.line})]},e.week_start))})}),e.friction_themes&&e.friction_themes.trim().length>0&&(0,t.jsx)(n,{title:"Friction patterns",children:(0,t.jsx)("p",{style:{fontSize:13,lineHeight:1.6,margin:0,color:"var(--af-text)"},children:e.friction_themes})}),e.suggestion&&(0,t.jsx)(n,{title:"Suggestion",children:(0,t.jsxs)("div",{style:{padding:"14px 16px",borderRadius:8,background:"var(--af-accent-subtle)",border:"1px solid color-mix(in srgb, var(--af-accent) 18%, var(--af-border))"},children:[(0,t.jsx)("div",{style:{fontSize:14,fontWeight:600,color:"var(--af-text)",marginBottom:6},children:e.suggestion.headline}),(0,t.jsx)("div",{style:{fontSize:13,lineHeight:1.55,color:"var(--af-text-secondary)"},children:e.suggestion.body})]})}),e.projects.length>0&&(0,t.jsx)(n,{title:"Projects",children:(0,t.jsx)("ul",{style:{listStyle:"none",padding:0,margin:0,display:"flex",flexDirection:"column",gap:4},children:e.projects.map(e=>(0,t.jsxs)("li",{style:{display:"flex",gap:10,alignItems:"baseline",padding:"6px 10px",borderRadius:6,fontSize:12,color:"var(--af-text)"},children:[(0,t.jsx)("span",{style:{flex:1,minWidth:0,fontWeight:500},children:e.display_name}),(0,t.jsxs)("span",{style:{fontFamily:"var(--font-mono)",fontSize:10,color:"var(--af-text-tertiary)"},children:[Math.round(e.agent_min),"m · ",e.share_pct.toFixed(0),"% · ",e.shipped_count," PR"]})]},e.name))})})]})}])},37727,e=>{"use strict";let t=(0,e.i(75254).default)("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);e.s(["X",0,t],37727)},63059,e=>{"use strict";let t=(0,e.i(75254).default)("ChevronRight",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);e.s(["ChevronRight",0,t],63059)},74886,e=>{"use strict";let t=(0,e.i(75254).default)("Copy",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]);e.s(["Copy",0,t],74886)},73375,e=>{"use strict";let t=(0,e.i(75254).default)("ChevronLeft",[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]);e.s(["ChevronLeft",0,t],73375)},21886,e=>{"use strict";var t=e.i(18050),r=e.i(71645);let i=(0,e.i(75254).default)("Download",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"7 10 12 15 17 10",key:"2ggqvy"}],["line",{x1:"12",x2:"12",y1:"15",y2:"3",key:"1vk2je"}]]);function a({digestKey:e}){let[n,s]=(0,r.useState)("idle"),[l,o]=(0,r.useState)(null);async function d(){s("loading"),o(null);try{var t,r;let i,a,n=await fetch(`/api/pdf/${e}`,{method:"POST"});if(!n.ok){let e=await n.json().catch(()=>({error:`HTTP ${n.status}`}));throw Error(e.error??`HTTP ${n.status}`)}let l=await n.blob(),o=function(e){if(!e)return null;let t=/filename="([^"]+)"/.exec(e)??/filename=([^;]+)/.exec(e);return t?t[1].trim():null}(n.headers.get("content-disposition"))??`fleetlens-${e}.pdf`;t=l,r=o,i=URL.createObjectURL(t),(a=document.createElement("a")).href=i,a.download=r,document.body.appendChild(a),a.click(),a.remove(),setTimeout(()=>URL.revokeObjectURL(i),1e3),s("idle")}catch(e){o(e instanceof Error?e.message:String(e)),s("error")}}let c="loading"===n;return(0,t.jsx)("span",{style:{display:"inline-flex",alignItems:"center",gap:6},children:(0,t.jsxs)("button",{onClick:d,disabled:c,title:l??"Download as PDF",style:{padding:"2px 8px",background:"transparent",border:"1px solid var(--af-border-subtle)",borderRadius:4,fontSize:10,color:"error"===n?"#f56565":"var(--af-text-secondary)",cursor:c?"default":"pointer",opacity:c?.6:1,display:"inline-flex",alignItems:"center",gap:4},children:[(0,t.jsx)(i,{size:11}),"loading"===n?"Exporting…":"error"===n?"Retry PDF":"PDF"]})})}e.s(["DigestActions",0,function({digestKey:e,period:r,hasDigest:i,narrativeFresh:n,isStreaming:s,aiEnabled:l,progress:o,onGenerate:d,onReroll:c,rerollTitle:f}){var p,g;let h=`Re-roll the narrative for this ${r}`,x=i?(0,t.jsx)(a,{digestKey:`${r}-${e}`}):null,y=null;return!n&&l?y=(0,t.jsx)("button",{onClick:d,disabled:s,style:{padding:"4px 10px",background:"var(--af-accent)",color:"white",border:"none",borderRadius:5,cursor:(p=s)?"default":"pointer",fontSize:11,fontWeight:600,opacity:p?.6:1},children:s?"Generating...":i?"Generate":"Generate digest"}):l&&(y=(0,t.jsxs)("span",{style:{fontSize:10,color:"var(--af-text-tertiary)",display:"inline-flex",gap:6,alignItems:"center"},children:["✓ Up to date",(0,t.jsx)("button",{onClick:c,disabled:s,title:f??h,style:{padding:"2px 7px",background:"transparent",border:"1px solid var(--af-border-subtle)",borderRadius:4,fontSize:10,color:"var(--af-text-secondary)",cursor:(g=s)?"default":"pointer",opacity:g?.6:1},children:s?"...":"Re-roll"})]})),o&&(y=(0,t.jsxs)(t.Fragment,{children:[y,(0,t.jsx)("span",{style:{fontSize:10,color:"var(--af-text-tertiary)"},children:o})]})),x&&(y=(0,t.jsxs)(t.Fragment,{children:[y,x]})),y}],21886)},1033,e=>{"use strict";var t=e.i(18050),r=e.i(71645),i=e.i(95419),a=e.i(21886);function n({monday:e,isStreaming:r,aiEnabled:i,progress:a,onGenerate:s}){let l=new Date(`${e}T12:00:00`),o=new Date(l);o.setDate(l.getDate()+6);let d=e=>e.toLocaleDateString("en-US",{month:"short",day:"numeric"}),c=`${d(l)} — ${d(o)}`;return(0,t.jsx)("div",{style:{maxWidth:980,margin:"0 auto",padding:"60px 40px"},children:(0,t.jsxs)("div",{style:{margin:"0 auto",maxWidth:480,padding:"32px 28px",borderRadius:14,background:"var(--af-surface)",border:"1px dashed var(--af-border-subtle)",textAlign:"center"},children:[(0,t.jsx)("div",{style:{width:44,height:44,borderRadius:12,margin:"0 auto 16px",background:"var(--af-accent-subtle)",display:"flex",alignItems:"center",justifyContent:"center",color:"var(--af-accent)",fontSize:20},children:"✦"}),(0,t.jsx)("h2",{style:{fontSize:16,fontWeight:600,margin:"0 0 6px",color:"var(--af-text)",letterSpacing:"-0.01em"},children:r?"Generating digest…":"No digest yet for this week"}),(0,t.jsx)("p",{style:{fontSize:12.5,lineHeight:1.55,margin:"0 0 18px",color:"var(--af-text-secondary)"},children:r?`Synthesizing ${c} from this week's day digests. This usually takes 5–10 minutes.`:i?`Once generated, this view shows top sessions, trajectory, findings, and project areas for ${c}.`:`Enable AI features in Settings to synthesize a weekly narrative for ${c}. Deterministic stats are still available below in the live digest as soon as data lands.`}),i&&(0,t.jsx)("button",{onClick:s,disabled:r,style:{padding:"9px 18px",borderRadius:8,background:r?"var(--af-border-subtle)":"var(--af-accent)",color:r?"var(--af-text-tertiary)":"white",border:"none",cursor:r?"default":"pointer",fontSize:13,fontWeight:600,letterSpacing:"-0.005em"},children:r?"Generating…":"Generate digest"}),a&&(0,t.jsx)("div",{style:{marginTop:12,fontSize:10.5,color:"var(--af-text-tertiary)",fontFamily:"var(--font-mono)"},children:a})]})})}e.s(["WeekDigestView",0,function({initial:e,monday:s,aiEnabled:l,autoFire:o=!1,prior:d}){let[c,f]=(0,r.useState)(e),[p,g]=(0,r.useState)("idle"),[h,x]=(0,r.useState)(""),y=(0,r.useRef)(!1),u=(0,r.useCallback)(async(e=!1)=>{g("streaming"),x("Starting...");let t=`/api/digest/week/${s}${e?"?force=1":""}`,r=await fetch(t,{method:"POST"});if(!r.ok||!r.body){g("error"),x(`Error ${r.status}`);return}let i=r.body.getReader(),a=new TextDecoder,n="";for(;;){let{done:e,value:t}=await i.read();if(e)break;let r=(n+=a.decode(t,{stream:!0})).split("\n\n");for(let e of(n=r.pop()??"",r)){let t=e.split("\n").find(e=>e.startsWith("data: "));if(t)try{let e=JSON.parse(t.slice(6));if("status"===e.type)x(e.text);else if("dependency"===e.type)x(`${"day"===e.kind?"Day":"Week"} ${e.key} ${e.status}`);else if("entry"===e.type)x(`Enriching ${e.index}/${e.total}...`);else if("progress"===e.type){let t=Math.round(e.elapsed_ms/1e3);x(`Claude composing… ${e.bytes.toLocaleString()} chars (${t}s)`)}else if("digest"===e.type)e.digest&&"week"===e.digest.scope&&f(e.digest),x("Rendering...");else if("saved"===e.type)x("Saved.");else if("error"===e.type){g("error"),x(e.message);return}}catch{}}}g("done"),x("")},[s]);(0,r.useEffect)(()=>{o&&!y.current&&"idle"===p&&(y.current=!0,u(!1))},[o,p,u]);let m="streaming"===p,v=!!c?.headline,b=(0,t.jsx)(a.DigestActions,{digestKey:s,period:"week",hasDigest:!!c,narrativeFresh:v,isStreaming:m,aiEnabled:l,progress:h,onGenerate:()=>u(!1),onReroll:()=>u(!0),rerollTitle:"Re-roll the narrative for this week"});return c?(0,t.jsx)(i.WeekDigest,{digest:c,aiEnabled:l,actions:b,priorDigest:d??null}):(0,t.jsx)(n,{monday:s,isStreaming:m,aiEnabled:l,progress:h,onGenerate:()=>u(!1)})}])},57143,e=>{"use strict";var t=e.i(18050),r=e.i(22016),i=e.i(71645),a=e.i(73375),n=e.i(63059);let s=(0,e.i(75254).default)("History",[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M12 7v5l4 2",key:"1fdv2h"}]]);var l=e.i(37727);function o({inDrawer:e=!1}={}){let[r,a]=(0,i.useState)("weeks"),[n,s]=(0,i.useState)(null),[l,x]=(0,i.useState)(null);return(0,i.useEffect)(()=>{fetch("/api/digest/week-index?count=12").then(e=>e.json()).then(e=>s(e.weeks)).catch(()=>s([])),fetch("/api/digest/month-index?count=6").then(e=>e.json()).then(e=>x(e.months)).catch(()=>x([]))},[]),(0,t.jsxs)("div",{style:e?{padding:"0 18px"}:{maxWidth:980,margin:"0 auto",padding:"28px 40px 0"},children:[(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:10,marginBottom:e?14:18},children:[!e&&(0,t.jsx)("h2",{style:{fontSize:11,fontWeight:700,letterSpacing:"0.08em",textTransform:"uppercase",color:"var(--af-text-tertiary)",margin:0,marginRight:4},children:"History"}),(0,t.jsx)("div",{style:p,children:["weeks","months"].map(e=>(0,t.jsx)("button",{type:"button",onClick:()=>a(e),style:{...g,background:r===e?"var(--af-accent)":"transparent",color:r===e?"white":"var(--af-text-secondary)"},children:"weeks"===e?"Weeks":"Months"},e))})]}),"weeks"===r?null===n?(0,t.jsx)(f,{children:"Loading weeks…"}):0===n.length?(0,t.jsx)(f,{children:"No history yet."}):(0,t.jsx)("ul",{style:h,children:n.map(e=>(0,t.jsx)(d,{w:e},e.start))}):null===l?(0,t.jsx)(f,{children:"Loading months…"}):0===l.length?(0,t.jsx)(f,{children:"No history yet."}):(0,t.jsx)("ul",{style:h,children:l.map(e=>(0,t.jsx)(c,{m:e},e.start))})]})}function d({w:e}){let i=0===e.active_days&&!e.in_progress&&!e.saved_key,a=e.saved_key?`/insights/${e.saved_key}`:`/insights/week-${e.start}`,n=e.saved_key&&e.headline?e.headline:i?"no data":e.in_progress?"in progress · click to view":`${e.active_days} active day${1===e.active_days?"":"s"} \xb7 click to generate`;return(0,t.jsx)("li",{style:x(!!e.saved_key),children:(0,t.jsxs)(r.default,{href:a,style:{display:"flex",flexDirection:"column",gap:4,textDecoration:"none",flex:1,minWidth:0},children:[(0,t.jsxs)("div",{style:y,children:[(0,t.jsxs)("span",{style:{fontSize:13,fontWeight:600,color:"var(--af-text)",letterSpacing:"-0.01em"},children:["W",String(e.iso_week).padStart(2,"0")," · ",e.label]}),e.in_progress&&(0,t.jsx)("span",{style:m,children:"in progress"}),e.saved_key&&(0,t.jsxs)("span",{style:{fontSize:10,fontWeight:600,color:"var(--af-accent)",marginLeft:"auto"},children:[e.shipped_count," PR · ",e.agent_min,"m"]})]}),(0,t.jsx)("span",{style:u,children:n})]})})}function c({m:e}){let i=0===e.active_days&&!e.in_progress&&!e.saved_key,a=e.saved_key?`/insights/${e.saved_key}`:`/insights/month-${e.start.slice(0,7)}`,n=e.saved_key&&e.headline?e.headline:i?"no data":e.in_progress?"in progress · click to view":`${e.active_days} active day${1===e.active_days?"":"s"} \xb7 click to generate`;return(0,t.jsx)("li",{style:x(!!e.saved_key),children:(0,t.jsxs)(r.default,{href:a,style:{display:"flex",flexDirection:"column",gap:4,textDecoration:"none",flex:1,minWidth:0},children:[(0,t.jsxs)("div",{style:y,children:[(0,t.jsx)("span",{style:{fontSize:13,fontWeight:600,color:"var(--af-text)",letterSpacing:"-0.01em"},children:e.label}),e.in_progress&&(0,t.jsx)("span",{style:m,children:"in progress"}),e.saved_key&&(0,t.jsxs)("span",{style:{fontSize:10,fontWeight:600,color:"var(--af-accent)",marginLeft:"auto"},children:[e.shipped_count," PR · ",e.agent_min,"m"]})]}),(0,t.jsx)("span",{style:u,children:n})]})})}function f({children:e}){return(0,t.jsx)("div",{style:{padding:"20px 18px",borderRadius:10,border:"1px dashed var(--af-border)",background:"var(--af-surface)",fontSize:13,color:"var(--af-text-tertiary)",lineHeight:1.55},children:e})}let p={display:"inline-flex",gap:3,border:"1px solid var(--af-border)",borderRadius:8,padding:2},g={padding:"5px 14px",fontSize:12,fontWeight:600,border:"none",borderRadius:6,cursor:"pointer"},h={listStyle:"none",padding:0,margin:0,display:"flex",flexDirection:"column",gap:4};function x(e){return{display:"flex",alignItems:"stretch",gap:14,padding:"10px 14px",borderRadius:10,border:`1px solid ${e?"color-mix(in srgb, var(--af-accent) 24%, var(--af-border))":"var(--af-border-subtle)"}`,background:e?"color-mix(in srgb, var(--af-accent) 6%, var(--af-surface))":"var(--af-surface)",transition:"border-color 0.15s"}}let y={display:"flex",alignItems:"center",gap:8,minWidth:0},u={fontSize:11,color:"var(--af-text-tertiary)",lineHeight:1.5,fontFamily:"var(--font-mono)"},m={fontSize:10,fontWeight:500,padding:"2px 6px",borderRadius:4,background:"color-mix(in srgb, #f5b445 18%, transparent)",color:"#c08a1f",letterSpacing:"0.02em"};function v({target:e,dir:i}){var s;let l="prev"===i?a.ChevronLeft:n.ChevronRight;return e?(0,t.jsxs)(r.default,{href:`/insights/${e.key}`,style:(s=e.cached,{display:"inline-flex",alignItems:"center",gap:4,padding:"5px 9px",borderRadius:6,border:`1px solid ${s?"color-mix(in srgb, var(--af-accent) 28%, var(--af-border))":"var(--af-border-subtle)"}`,background:s?"color-mix(in srgb, var(--af-accent) 6%, var(--af-surface))":"var(--af-surface)",color:s?"var(--af-accent)":"var(--af-text-secondary)",fontSize:11,fontWeight:500,fontFamily:"var(--font-mono)",textDecoration:"none"}),title:e.cached?`Saved digest \xb7 ${e.label}`:`${e.label} (no saved digest yet — will prompt to Generate)`,children:[(0,t.jsx)(l,{size:14}),(0,t.jsx)("span",{children:e.label})]}):(0,t.jsx)("span",{style:k,title:`No ${"prev"===i?"earlier":"later"} period`,children:(0,t.jsx)(l,{size:14})})}function b({onClose:e}){return(0,t.jsxs)("div",{role:"dialog","aria-modal":"true","aria-label":"Insights history",style:{position:"fixed",inset:0,zIndex:200,display:"flex",justifyContent:"flex-end"},children:[(0,t.jsx)("div",{onClick:e,style:{position:"absolute",inset:0,background:"rgba(0,0,0,0.32)",animation:"fade-in 120ms ease-out"}}),(0,t.jsxs)("aside",{style:{position:"relative",width:"min(440px, 92vw)",height:"100vh",background:"var(--background)",borderLeft:"1px solid var(--af-border-subtle)",boxShadow:"-12px 0 40px rgba(0,0,0,0.32)",display:"flex",flexDirection:"column",animation:"slide-in 160ms cubic-bezier(0.2, 0.9, 0.3, 1)"},children:[(0,t.jsxs)("header",{style:{display:"flex",alignItems:"center",gap:10,padding:"14px 18px",borderBottom:"1px solid var(--af-border-subtle)"},children:[(0,t.jsx)("h2",{style:{fontSize:13,fontWeight:600,margin:0,color:"var(--af-text)"},children:"Browse insights history"}),(0,t.jsx)("button",{type:"button",onClick:e,"aria-label":"Close history",style:{marginLeft:"auto",width:26,height:26,display:"inline-flex",alignItems:"center",justifyContent:"center",border:"1px solid var(--af-border-subtle)",borderRadius:6,background:"transparent",color:"var(--af-text-secondary)",cursor:"pointer"},children:(0,t.jsx)(l.X,{size:14})})]}),(0,t.jsx)("div",{style:{flex:1,overflowY:"auto",padding:"18px 0"},children:(0,t.jsx)(o,{inDrawer:!0})})]}),(0,t.jsx)("style",{children:`
2
2
  @keyframes slide-in { from { transform: translateX(20px); opacity: 0 } to { transform: translateX(0); opacity: 1 } }
3
3
  @keyframes fade-in { from { opacity: 0 } to { opacity: 1 } }
4
4
  `})]})}let j={display:"inline-flex",alignItems:"center",gap:6,padding:"5px 11px",borderRadius:6,border:"1px solid var(--af-border-subtle)",background:"var(--af-surface)",color:"var(--af-text)",fontSize:11,fontWeight:500,cursor:"pointer",fontFamily:"inherit"},k={display:"inline-flex",alignItems:"center",gap:4,padding:"5px 9px",borderRadius:6,border:"1px solid var(--af-border-subtle)",background:"var(--af-surface)",color:"var(--af-text-tertiary)",fontSize:11,fontWeight:500,fontFamily:"var(--font-mono)",opacity:.45,cursor:"default"};e.s(["InsightsTopBar",0,function({scope:e,currentLabel:a,rangeLabel:n,prev:l,next:o}){let[d,c]=(0,i.useState)(!1);return(0,i.useEffect)(()=>{if(!d)return;let e=e=>{"Escape"===e.key&&c(!1)};return window.addEventListener("keydown",e),document.body.style.overflow="hidden",()=>{window.removeEventListener("keydown",e),document.body.style.overflow=""}},[d]),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("header",{style:{position:"sticky",top:0,zIndex:50,background:"color-mix(in srgb, var(--background) 90%, transparent)",backdropFilter:"blur(10px)",WebkitBackdropFilter:"blur(10px)",borderBottom:"1px solid var(--af-border-subtle)"},className:"no-print",children:(0,t.jsxs)("div",{style:{maxWidth:980,margin:"0 auto",padding:"12px 40px",display:"flex",alignItems:"center",gap:14,minHeight:44},children:[(0,t.jsxs)("div",{style:{display:"flex",alignItems:"baseline",gap:10,minWidth:0},children:[(0,t.jsx)(r.default,{href:"/insights",style:{fontSize:10,fontWeight:700,color:"var(--af-text-tertiary)",textDecoration:"none",textTransform:"uppercase",letterSpacing:"0.08em",flexShrink:0},title:"Latest week digest",children:"Insights"}),(0,t.jsx)("span",{style:{color:"var(--af-text-tertiary)",fontSize:11,flexShrink:0},children:"›"}),(0,t.jsx)("span",{style:{fontSize:14,fontWeight:600,color:"var(--af-text)",letterSpacing:"-0.01em",minWidth:0,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:a}),n&&(0,t.jsx)("span",{style:{fontSize:11,fontFamily:"var(--font-mono)",color:"var(--af-text-tertiary)",flexShrink:0},children:n})]}),(0,t.jsxs)("div",{style:{marginLeft:"auto",display:"inline-flex",alignItems:"center",gap:6},children:[(0,t.jsx)(v,{target:l,dir:"prev"}),(0,t.jsx)(v,{target:o,dir:"next"}),(0,t.jsxs)("button",{type:"button",onClick:()=>c(!0),style:j,title:`Browse ${"week"===e?"weekly":"monthly"} history`,children:[(0,t.jsx)(s,{size:13}),(0,t.jsx)("span",{children:"Browse"})]})]})]})}),d&&(0,t.jsx)(b,{onClose:()=>c(!1)})]})}],57143)},2143,e=>{"use strict";var t=e.i(18050),r=e.i(71645),i=e.i(84500),a=e.i(21886);e.s(["MonthDigestView",0,function({initial:e,yearMonth:n,aiEnabled:s}){let[l,o]=(0,r.useState)(e),[d,c]=(0,r.useState)("idle"),[f,p]=(0,r.useState)(""),g=(0,r.useCallback)(async(e=!1)=>{c("streaming"),p("Starting...");let t=`/api/digest/month/${n}${e?"?force=1":""}`,r=await fetch(t,{method:"POST"});if(!r.ok||!r.body){c("error"),p(`Error ${r.status}`);return}let i=r.body.getReader(),a=new TextDecoder,s="";for(;;){let{done:e,value:t}=await i.read();if(e)break;let r=(s+=a.decode(t,{stream:!0})).split("\n\n");for(let e of(s=r.pop()??"",r)){let t=e.split("\n").find(e=>e.startsWith("data: "));if(t)try{let e=JSON.parse(t.slice(6));if("status"===e.type)p(e.text);else if("dependency"===e.type)p(`${"day"===e.kind?"Day":"Week"} ${e.key} ${e.status}`);else if("entry"===e.type)p(`Enriching ${e.index}/${e.total}...`);else if("progress"===e.type){let t=Math.round(e.elapsed_ms/1e3);p(`Claude composing… ${e.bytes.toLocaleString()} chars (${t}s)`)}else if("digest"===e.type)e.digest&&"month"===e.digest.scope&&o(e.digest),p("Rendering...");else if("saved"===e.type)p("Saved.");else if("error"===e.type){c("error"),p(e.message);return}}catch{}}}c("done"),p("")},[n]),h="streaming"===d,x=!!l?.headline,y=(0,t.jsx)(a.DigestActions,{digestKey:n,period:"month",hasDigest:!!l,narrativeFresh:x,isStreaming:h,aiEnabled:s,progress:f,onGenerate:()=>g(!1),onReroll:()=>g(!0)});if(l)return(0,t.jsx)(i.MonthDigest,{digest:l,aiEnabled:s,actions:y});let u=s||!!f;return(0,t.jsxs)(t.Fragment,{children:[u&&(0,t.jsx)("div",{style:{display:"flex",gap:10,padding:"14px 40px 0",alignItems:"center",flexWrap:"wrap"},children:y}),(0,t.jsx)("div",{style:{padding:28,textAlign:"center",color:"var(--af-text-secondary)",fontSize:13},children:h?"Loading month digest…":"No digest yet — click Generate above."})]})}])}]);
@@ -0,0 +1 @@
1
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", sans-serif;--font-mono:"SF Mono", "Fira Code", "JetBrains Mono", "Cascadia Code", monospace;--color-red-50:#fef2f2;--color-red-300:#ffa3a3;--color-red-400:#ff6568;--color-red-600:#e40014;--color-red-700:#bf000f;--color-red-800:#9f0712;--color-red-950:#460809;--color-amber-400:#fcbb00;--color-amber-600:#dd7400;--color-green-50:#f0fdf4;--color-green-300:#7bf1a8;--color-green-400:#05df72;--color-green-600:#00a544;--color-green-700:#008138;--color-green-800:#016630;--color-green-950:#032e15;--color-gray-100:#f3f4f6;--color-gray-200:#e5e7eb;--color-gray-300:#d1d5dc;--color-gray-400:#99a1af;--color-gray-500:#6a7282;--color-gray-600:#4a5565;--color-gray-700:#364153;--color-gray-900:#101828;--color-gray-950:#030712;--spacing:.25rem;--container-2xl:42rem;--container-3xl:48rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-medium:500;--font-weight-semibold:600;--tracking-wide:.025em;--radius-lg:.5rem;--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", sans-serif;--default-mono-font-family:"SF Mono", "Fira Code", "JetBrains Mono", "Cascadia Code", monospace}@supports (color:lab(0% 0 0)){:root,:host{--color-red-50:lab(96.5005% 4.18508 1.52328);--color-red-300:lab(76.5514% 36.422 15.5335);--color-red-400:lab(63.7053% 60.745 31.3109);--color-red-600:lab(48.4493% 77.4328 61.5452);--color-red-700:lab(40.4273% 67.2623 53.7441);--color-red-800:lab(33.7174% 55.8993 41.0293);--color-red-950:lab(13.003% 29.04 16.7519);--color-amber-400:lab(80.1641% 16.6016 99.2089);--color-amber-600:lab(60.3514% 40.5624 87.1228);--color-green-50:lab(98.1563% -5.60117 2.75915);--color-green-300:lab(86.9953% -47.2691 25.0054);--color-green-400:lab(78.503% -64.9265 39.7492);--color-green-600:lab(59.0978% -58.6621 41.2579);--color-green-700:lab(47.0329% -47.0239 31.4788);--color-green-800:lab(37.4616% -36.7971 22.9692);--color-green-950:lab(15.6845% -20.4225 11.7249);--color-gray-100:lab(96.1596% -.0823438 -1.13575);--color-gray-200:lab(91.6229% -.159115 -2.26791);--color-gray-300:lab(85.1236% -.612259 -3.7138);--color-gray-400:lab(65.9269% -.832707 -8.17473);--color-gray-500:lab(47.7841% -.393182 -10.0268);--color-gray-600:lab(35.6337% -1.58697 -10.8425);--color-gray-700:lab(27.1134% -.956401 -12.3224);--color-gray-900:lab(8.11897% .811279 -12.254);--color-gray-950:lab(1.90334% .278696 -5.48866)}}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*,:after,:before{border-color:var(--af-border-subtle)}}@layer components;@layer utilities{.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-5{height:calc(var(--spacing) * 5)}.max-h-60{max-height:calc(var(--spacing) * 60)}.max-h-80{max-height:calc(var(--spacing) * 80)}.max-h-96{max-height:calc(var(--spacing) * 96)}.w-5{width:calc(var(--spacing) * 5)}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.shrink{flex-shrink:1}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-pointer{cursor:pointer}.resize{resize:both}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.grid-cols-\[8rem_1fr\]{grid-template-columns:8rem 1fr}.grid-cols-\[10rem_1fr\]{grid-template-columns:10rem 1fr}.grid-cols-\[max-content_1fr\]{grid-template-columns:max-content 1fr}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-6{column-gap:calc(var(--spacing) * 6)}.gap-y-1{row-gap:calc(var(--spacing) * 1)}.gap-y-1\.5{row-gap:calc(var(--spacing) * 1.5)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}.self-center{align-self:center}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-400\/40{border-color:#fcbb0066}@supports (color:color-mix(in lab, red, red)){.border-amber-400\/40{border-color:color-mix(in oklab, var(--color-amber-400) 40%, transparent)}}.border-gray-300{border-color:var(--color-gray-300)}.border-green-300{border-color:var(--color-green-300)}.border-red-300{border-color:var(--color-red-300)}.border-red-400{border-color:var(--color-red-400)}.bg-amber-400\/10{background-color:#fcbb001a}@supports (color:color-mix(in lab, red, red)){.bg-amber-400\/10{background-color:color-mix(in oklab, var(--color-amber-400) 10%, transparent)}}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-950{background-color:var(--color-gray-950)}.bg-green-50{background-color:var(--color-green-50)}.bg-red-50{background-color:var(--color-red-50)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-2{padding-block:calc(var(--spacing) * 2)}.font-mono{font-family:SF Mono,Fira Code,JetBrains Mono,Cascadia Code,monospace}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[11px\]{font-size:11px}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.break-all{word-break:break-all}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-400{color:var(--color-amber-400)}.text-amber-600{color:var(--color-amber-600)}.text-gray-200{color:var(--color-gray-200)}.text-gray-300{color:var(--color-gray-300)}.text-gray-500{color:var(--color-gray-500)}.text-gray-500\!{color:var(--color-gray-500)!important}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-900{color:var(--color-gray-900)}.text-green-600{color:var(--color-green-600)}.text-green-700{color:var(--color-green-700)}.text-green-800{color:var(--color-green-800)}.text-red-400{color:var(--color-red-400)}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-700)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.opacity-50{opacity:.5}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}@media (hover:hover){.hover\:text-gray-700:hover{color:var(--color-gray-700)}.hover\:underline:hover{text-decoration-line:underline}}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}@media (prefers-color-scheme:dark){.dark\:border-gray-700{border-color:var(--color-gray-700)}.dark\:border-green-800{border-color:var(--color-green-800)}.dark\:border-red-800{border-color:var(--color-red-800)}.dark\:bg-gray-900{background-color:var(--color-gray-900)}.dark\:bg-green-950{background-color:var(--color-green-950)}.dark\:bg-red-950{background-color:var(--color-red-950)}.dark\:text-gray-100{color:var(--color-gray-100)}.dark\:text-gray-400{color:var(--color-gray-400)}.dark\:text-gray-700{color:var(--color-gray-700)}.dark\:text-green-300{color:var(--color-green-300)}.dark\:text-green-400{color:var(--color-green-400)}.dark\:text-red-300{color:var(--color-red-300)}}}:root,[data-theme=dark]{--background:#1a1a1f;--foreground:#e8e8f0;--af-accent:#2dd4bf;--af-accent-hover:#5eead4;--af-accent-subtle:#2dd4bf1f;--af-success:#34d399;--af-success-subtle:#34d3991f;--af-warning:#fbbf24;--af-warning-subtle:#fbbf241a;--af-danger:#f87171;--af-danger-subtle:#f871711f;--af-info:#a78bfa;--af-info-subtle:#a78bfa1f;--af-surface:#2c2c33;--af-surface-hover:#333340;--af-surface-elevated:#38384a;--af-border-subtle:#2f2f38;--af-text:#e8e8f0;--af-text-secondary:#9090a0;--af-text-tertiary:#707078;--af-heatmap-0:#2f2f38;--af-heatmap-1:#2dd4bf2e;--af-heatmap-2:#2dd4bf59;--af-heatmap-3:#2dd4bf99;--af-heatmap-4:#2dd4bfe6}[data-theme=light]{--background:#fdfbf9;--foreground:#1a1a1a;--af-accent:#14b8a6;--af-accent-hover:#0d9488;--af-accent-subtle:#14b8a61f;--af-success:#059669;--af-success-subtle:#0596691f;--af-warning:#d97706;--af-warning-subtle:#d977061f;--af-danger:#c53030;--af-danger-subtle:#c530301f;--af-info:#8168e0;--af-info-subtle:#8168e01f;--af-surface:#f5f1ec;--af-surface-hover:#ede8e0;--af-surface-elevated:#e8e2da;--af-border-subtle:#e8e2da;--af-text:#1a1a1a;--af-text-secondary:#5a544e;--af-text-tertiary:#8a8580;--af-heatmap-0:#ede8e0;--af-heatmap-1:#14b8a638;--af-heatmap-2:#14b8a666;--af-heatmap-3:#14b8a6a6;--af-heatmap-4:#14b8a6f2}html,body{background:var(--background);color:var(--foreground);font-family:var(--font-sans);-webkit-font-smoothing:antialiased;margin:0;padding:0;font-size:14px;line-height:1.6}body{min-height:100vh}a{color:inherit;text-decoration:none}button{cursor:pointer;font-family:inherit}input,select,textarea{font-family:inherit}input:not([type=checkbox]):not([type=radio]),select,textarea{background:var(--background);border:1px solid var(--af-border-subtle);color:var(--af-text);border-radius:8px;outline:none;padding:9px 12px;font-size:13px;transition:border-color .15s}input:not([type=checkbox]):not([type=radio]):focus,select:focus,textarea:focus{border-color:var(--af-accent);box-shadow:0 0 0 3px var(--af-accent-subtle)}input::placeholder{color:var(--af-text-tertiary)}.sl-compact-select{border-radius:6px!important;height:32px!important;padding:4px 28px 4px 10px!important;font-size:12px!important}.sl-day-nav-btn{border:1px solid var(--af-border-subtle);background:var(--af-surface-hover);width:26px;height:26px;color:var(--af-text-secondary);cursor:pointer;border-radius:6px;justify-content:center;align-items:center;transition:background .15s,opacity .15s;display:inline-flex}.sl-day-nav-btn:hover:not(:disabled){background:var(--af-surface-elevated);color:var(--af-text-primary)}.sl-day-nav-btn:disabled{opacity:.35;cursor:default}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:var(--af-border-subtle);border-radius:4px}::-webkit-scrollbar-thumb:hover{background:var(--af-surface-elevated)}.af-panel{background:var(--af-surface);border:1px solid var(--af-border-subtle);border-radius:12px;overflow:hidden}.af-panel-header{border-bottom:1px solid var(--af-border-subtle);align-items:center;gap:6px;padding:14px 18px;font-size:13px;font-weight:600;display:flex}.af-tag{border:none;border-radius:100px;padding:3px 10px;font-size:11px;font-weight:500;display:inline-block}.af-tag-default{background:var(--af-border-subtle);color:var(--af-text-secondary)}.af-tag-accent{background:var(--af-accent-subtle);color:var(--af-accent)}.af-tag-success{background:var(--af-success-subtle);color:var(--af-success)}.af-tag-warning{background:var(--af-warning-subtle);color:var(--af-warning)}.af-tag-danger{background:var(--af-danger-subtle);color:var(--af-danger)}.af-empty{text-align:center;color:var(--af-text-tertiary);padding:48px 32px;font-size:13px}.af-tabs{background:var(--background);border-radius:8px;gap:2px;padding:3px;display:inline-flex}.af-tab-btn{color:var(--af-text-secondary);cursor:pointer;background:0 0;border:none;border-radius:6px;padding:7px 18px;font-family:inherit;font-size:13px;font-weight:500;transition:all .15s}.af-tab-btn:hover{color:var(--af-text)}.af-tab-btn.active{background:var(--af-surface-elevated);color:var(--af-text);box-shadow:0 1px 3px #0003}.flex{display:flex}.items-center{align-items:center}.items-baseline{align-items:baseline}.af-card{background:var(--af-surface);border:1px solid var(--af-border-subtle);border-radius:12px;padding:18px 20px;transition:border-color .12s}.af-card:hover{border-color:var(--af-surface-elevated)}.af-btn,.af-btn-primary,.af-btn-danger{border-radius:8px;padding:6px 14px;font-size:13px;transition:background .12s,border-color .12s;display:inline-block}.af-btn{border:1px solid var(--af-border-subtle);background:var(--af-surface);color:var(--af-text)}.af-btn:hover:not(:disabled){border-color:var(--af-accent)}.af-btn-primary{background:var(--af-accent);color:var(--background);border:1px solid #0000;font-weight:500}.af-btn-primary:hover:not(:disabled){background:var(--af-accent-hover)}.af-btn-danger{border:1px solid var(--af-danger);color:var(--af-danger);background:0 0}.af-btn-danger:hover:not(:disabled){background:var(--af-danger-subtle)}.af-btn:disabled,.af-btn-primary:disabled,.af-btn-danger:disabled{opacity:.55;cursor:default}.af-panel{background:var(--af-surface-elevated);border:1px solid var(--af-border-subtle);border-radius:8px}.af-panel-danger{background:var(--af-danger-subtle);border:1px solid var(--af-danger);color:var(--af-danger);border-radius:8px}.af-step-active{background:var(--af-accent);color:var(--background)}.af-chip{border:1px solid var(--af-border-subtle);font-family:var(--font-mono);border-radius:9999px;padding:2px 10px;font-size:12px;display:inline-block}a.af-chip:hover{border-color:var(--af-accent);text-decoration:underline}.af-row:hover{background:var(--af-surface-hover)}.sl-prose{color:var(--af-text);word-break:break-word;font-size:13.5px;line-height:1.65}.sl-prose>:first-child{margin-top:0}.sl-prose>:last-child{margin-bottom:0}.sl-prose h1,.sl-prose h2,.sl-prose h3,.sl-prose h4{letter-spacing:-.01em;color:var(--af-text);margin:18px 0 8px;font-weight:700;line-height:1.25}.sl-prose h1{border-bottom:1px solid var(--af-border-subtle);padding-bottom:6px;font-size:20px}.sl-prose h2{font-size:16px}.sl-prose h3{font-size:14px}.sl-prose h4{color:var(--af-text-secondary);font-size:13px}.sl-prose p{margin:10px 0}.sl-prose strong{color:var(--af-text);font-weight:600}.sl-prose em{color:var(--af-text);font-style:italic}.sl-prose ul,.sl-prose ol{margin:10px 0;padding-left:22px}.sl-prose ul{list-style-type:disc}.sl-prose ol{list-style-type:decimal}.sl-prose li,.sl-prose li>p{margin:4px 0}.sl-prose blockquote{border-left:3px solid var(--af-accent);color:var(--af-text-secondary);background:var(--af-accent-subtle);border-radius:0 6px 6px 0;margin:12px 0;padding:4px 14px}.sl-prose code{font-family:var(--font-mono);background:var(--af-border-subtle);color:var(--af-text);border-radius:4px;padding:1px 5px;font-size:12px}.sl-prose pre{background:var(--background);border:1px solid var(--af-border-subtle);border-radius:8px;margin:12px 0;padding:12px 14px;font-size:12px;line-height:1.55;overflow-x:auto}.sl-prose pre code{font-size:inherit;background:0 0;border-radius:0;padding:0}.sl-prose table{border-collapse:collapse;width:100%;margin:12px 0;font-size:12px}.sl-prose th,.sl-prose td{border:1px solid var(--af-border-subtle);text-align:left;padding:6px 10px}.sl-prose th{background:var(--af-surface-hover);font-weight:600}.sl-prose hr{border:none;border-top:1px solid var(--af-border-subtle);margin:16px 0}.sl-prose a{color:var(--af-accent);text-underline-offset:2px;text-decoration:underline}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}
@@ -0,0 +1,6 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,52535,e=>{"use strict";var t=e.i(18050),r=e.i(71645);e.s(["LiveBadge",0,function({mtimeIso:e,activityMs:i,size:n="sm"}){let[l,s]=(0,r.useState)(()=>Date.now());(0,r.useEffect)(()=>{let e=setInterval(()=>s(Date.now()),1e4);return()=>clearInterval(e)},[]);let a=e?Date.parse(e):NaN,o=Math.max(Number.isNaN(a)?0:a,i&&Number.isFinite(i)?i:0);if(o<=0||l-o>45e3)return null;let c="md"===n?8:6;return(0,t.jsxs)("span",{style:{display:"inline-flex",alignItems:"center",gap:5,fontSize:"md"===n?10:9,fontWeight:700,letterSpacing:"0.04em",padding:"md"===n?"3px 9px":"2px 7px",borderRadius:100,background:"rgba(239, 68, 68, 0.12)",color:"#ef4444",textTransform:"uppercase"},title:`Last updated ${new Date(o).toLocaleTimeString()}`,children:[(0,t.jsx)("span",{style:{display:"inline-block",width:c,height:c,borderRadius:"50%",background:"#ef4444",animation:"cs-live-pulse 1.6s ease-in-out infinite"}}),"LIVE",(0,t.jsx)("style",{children:`
2
+ @keyframes cs-live-pulse {
3
+ 0%, 100% { opacity: 1; transform: scale(1); }
4
+ 50% { opacity: 0.4; transform: scale(0.85); }
5
+ }
6
+ `})]})}])},63059,e=>{"use strict";let t=(0,e.i(75254).default)("ChevronRight",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);e.s(["ChevronRight",0,t],63059)},37727,e=>{"use strict";let t=(0,e.i(75254).default)("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);e.s(["X",0,t],37727)},74886,e=>{"use strict";let t=(0,e.i(75254).default)("Copy",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]);e.s(["Copy",0,t],74886)},73375,e=>{"use strict";let t=(0,e.i(75254).default)("ChevronLeft",[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]);e.s(["ChevronLeft",0,t],73375)},50682,e=>{"use strict";let t=(0,e.i(75254).default)("Github",[["path",{d:"M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4",key:"tonef"}],["path",{d:"M9 18c-4.51 2-5-2-7-2",key:"9comsn"}]]);e.s(["Github",0,t],50682)},64659,e=>{"use strict";let t=(0,e.i(75254).default)("ChevronDown",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]);e.s(["ChevronDown",0,t],64659)},98572,e=>{"use strict";let t=["/.claude/worktrees/","/.worktrees/","/claude/worktrees/"],r=/\/conductor\/workspaces\/[^/]+\/([^/]+)(?:\/|$)/,i="/.superset/worktrees/",n=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;function l(e){let l=e.replace(/\/{2,}/g,"/"),s=function(e){for(let r of t){let t=e.lastIndexOf(r);if(t>=0)return{idx:t,marker:r}}return null}(l);if(s)return l.slice(0,s.idx);let a=function(e){let t=r.exec(e);if(!t)return null;let i=t[1],n=+!!t[0].endsWith("/");return{canonicalEndIdx:t.index+t[0].length-i.length-1-n,workspaceName:i}}(l);if(a)return l.slice(0,a.canonicalEndIdx);let o=function(e){let t=e.indexOf(i);if(t<0)return null;let r=e.slice(t+i.length).split("/").filter(Boolean);if(0===r.length)return null;let l=n.test(r[0])?r[1]??r[0]:r[0];return{canonical:e.slice(0,t)+i+l,workspaceName:l}}(l);return o?o.canonical:l}function s(e){let t=l(e),r=t.replace(/\/+$/,"").split("/").filter(Boolean);return r[r.length-1]||t}let a=/gh\s+pr\s+create\b/i,o=/#(\d+)/,c=/--title\s+["']([^"']+)["']/;e.s(["buildProjectKeyResolver",0,function(e){let t=new Map;for(let r of e)r.repoName&&t.set(s(r.projectName),r.repoName);return e=>e.repoName??t.get(s(e.projectName))??s(e.projectName)},"canonicalProjectName",0,l,"detectPrMarkers",0,function(e){let t=[],r=e.durationMs??0;for(let i of e.events){if("tool-call"!==i.role||"Bash"!==i.toolName)continue;let n=i.blocks.find(e=>e&&"type"in e&&"tool_use"===e.type);if(!n||"tool_use"!==n.type)continue;let l=n.input,s="string"==typeof l?.command?l.command:"";if(!a.test(s))continue;let u=s.match(c),f=s.match(o);t.push({sessionId:e.id,timestamp:i.timestamp??e.firstTimestamp??"",tOffsetMs:i.tOffsetMs,positionInSession:r>0&&void 0!==i.tOffsetMs?Math.min(1,Math.max(0,i.tOffsetMs/r)):void 0,command:s.slice(0,300),prNumber:f?Number(f[1]):void 0,title:u?.[1]})}return t},"projectKey",0,s])},25063,e=>{"use strict";let t=(0,e.i(75254).default)("ArrowDown",[["path",{d:"M12 5v14",key:"s699le"}],["path",{d:"m19 12-7 7-7-7",key:"1idqje"}]]);e.s(["ArrowDown",0,t],25063)},40524,e=>{"use strict";let t=(0,e.i(75254).default)("Workflow",[["rect",{width:"8",height:"8",x:"3",y:"3",rx:"2",key:"by2w9f"}],["path",{d:"M7 11v4a2 2 0 0 0 2 2h4",key:"xkn7yn"}],["rect",{width:"8",height:"8",x:"13",y:"13",rx:"2",key:"1cgmvn"}]]);e.s(["Workflow",0,t],40524)},95116,e=>{"use strict";let t=(0,e.i(75254).default)("Wrench",[["path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z",key:"cbrjhi"}]]);e.s(["Wrench",0,t],95116)}]);
@@ -0,0 +1,66 @@
1
+ import { execFile } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ import { readMenubarState } from "@/lib/menubar-data";
4
+
5
+ export const runtime = "nodejs";
6
+ export const dynamic = "force-dynamic";
7
+
8
+ const execFileAsync = promisify(execFile);
9
+
10
+ type Action = "install" | "open" | "uninstall";
11
+
12
+ function isValidAction(v: unknown): v is Action {
13
+ return v === "install" || v === "open" || v === "uninstall";
14
+ }
15
+
16
+ export async function GET(): Promise<Response> {
17
+ return Response.json(readMenubarState());
18
+ }
19
+
20
+ export async function POST(req: Request): Promise<Response> {
21
+ const bin = process.env.FLEETLENS_CLI_BIN;
22
+ if (!bin) {
23
+ return Response.json(
24
+ {
25
+ error:
26
+ "The menu bar widget needs the dashboard to run via the fleetlens CLI. Run `fleetlens menubar install` in your terminal instead.",
27
+ },
28
+ { status: 503 },
29
+ );
30
+ }
31
+ const state = readMenubarState();
32
+ if (!state.supported) {
33
+ return Response.json(
34
+ { error: "The menu bar widget is a native macOS app and is macOS-only." },
35
+ { status: 400 },
36
+ );
37
+ }
38
+
39
+ const body = (await req.json().catch(() => null)) as { action?: string } | null;
40
+ const action = body?.action;
41
+ if (!isValidAction(action)) {
42
+ return Response.json({ error: "Expected { action: \"install\" | \"open\" | \"uninstall\" }." }, { status: 400 });
43
+ }
44
+
45
+ // Spawn the CLI rather than duplicating install logic — the CLI owns path
46
+ // resolution, the ~/Applications copy, login-item registration, and clean
47
+ // teardown. Mirrors /api/team/autostart exactly.
48
+ //
49
+ // install uses --no-login so a web-triggered install doesn't surprise the
50
+ // user with a System Events Automation prompt; login-at-boot stays available
51
+ // via the terminal command.
52
+ const args =
53
+ action === "install"
54
+ ? ["menubar", "install", "--no-login"]
55
+ : ["menubar", action];
56
+
57
+ try {
58
+ await execFileAsync(process.execPath, [bin, ...args], { timeout: 20_000 });
59
+ } catch (err) {
60
+ return Response.json(
61
+ { error: `menubar ${action} failed: ${(err as Error).message}` },
62
+ { status: 500 },
63
+ );
64
+ }
65
+ return Response.json({ ok: true, action, ...readMenubarState() });
66
+ }
@@ -0,0 +1,60 @@
1
+ import { spawn } from "node:child_process";
2
+ import { statSync } from "node:fs";
3
+ import { isAbsolute } from "node:path";
4
+ import { projectKey } from "@claude-lens/parser";
5
+ import { listAllSessions } from "@claude-lens/parser/fs";
6
+
7
+ export const runtime = "nodejs";
8
+ export const dynamic = "force-dynamic";
9
+
10
+ type Body = {
11
+ projectKey?: unknown;
12
+ path?: unknown;
13
+ };
14
+
15
+ function openerFor(path: string): { cmd: string; args: string[] } {
16
+ if (process.platform === "darwin") return { cmd: "open", args: [path] };
17
+ if (process.platform === "win32") return { cmd: "cmd", args: ["/c", "start", "", path] };
18
+ return { cmd: "xdg-open", args: [path] };
19
+ }
20
+
21
+ function isDirectory(path: string): boolean {
22
+ return statSync(path, { throwIfNoEntry: false })?.isDirectory() ?? false;
23
+ }
24
+
25
+ function sessionFoldersForProject(key: string): Promise<Set<string>> {
26
+ return listAllSessions({ limit: 1000 }).then((sessions) => {
27
+ const allowed = new Set<string>();
28
+ for (const s of sessions) {
29
+ if (projectKey(s.projectName) !== key) continue;
30
+ if (s.cwd && isAbsolute(s.cwd)) allowed.add(s.cwd);
31
+ if (isAbsolute(s.projectName)) allowed.add(s.projectName);
32
+ }
33
+ return allowed;
34
+ });
35
+ }
36
+
37
+ export async function POST(req: Request): Promise<Response> {
38
+ const body = (await req.json().catch(() => null)) as Body | null;
39
+ const key = typeof body?.projectKey === "string" ? body.projectKey : "";
40
+ const path = typeof body?.path === "string" ? body.path : "";
41
+
42
+ if (!key || !path) {
43
+ return Response.json({ error: "Missing project or folder path." }, { status: 400 });
44
+ }
45
+ if (!isAbsolute(path)) {
46
+ return Response.json({ error: "Only absolute local folder paths can be opened." }, { status: 400 });
47
+ }
48
+
49
+ const allowed = await sessionFoldersForProject(key);
50
+ if (!allowed.has(path)) {
51
+ return Response.json({ error: "That folder is not part of this project." }, { status: 403 });
52
+ }
53
+ if (!isDirectory(path)) {
54
+ return Response.json({ error: "That folder no longer exists locally." }, { status: 404 });
55
+ }
56
+
57
+ const { cmd, args } = openerFor(path);
58
+ spawn(cmd, args, { detached: true, stdio: "ignore" }).unref();
59
+ return Response.json({ ok: true });
60
+ }
@@ -0,0 +1,45 @@
1
+ import { NextResponse } from "next/server";
2
+ import {
3
+ readCredentialsMasked,
4
+ writeZaiKey,
5
+ deleteZaiKeyAndPrune,
6
+ validateAndSnapshotZaiKey,
7
+ } from "@claude-lens/entries/node";
8
+
9
+ export const runtime = "nodejs";
10
+
11
+ export async function GET() {
12
+ return NextResponse.json(readCredentialsMasked());
13
+ }
14
+
15
+ export async function PUT(req: Request) {
16
+ const body = await req.json().catch(() => ({ api_key: undefined })) as {
17
+ api_key?: string;
18
+ };
19
+ if (typeof body.api_key !== "string") {
20
+ return NextResponse.json({ error: '"api_key" (string) is required' }, { status: 400 });
21
+ }
22
+ const key = body.api_key.trim();
23
+ if (key) {
24
+ // Validate against the live Z.ai API BEFORE persisting. A bad/expired/
25
+ // malformed key must not be saved as "configured" — and on success we
26
+ // immediately snapshot the real usage so the /usage tab + menu-bar
27
+ // widget are populated the instant the user saves, without waiting for
28
+ // the daemon's next 5-min tick.
29
+ try {
30
+ await validateAndSnapshotZaiKey(key);
31
+ } catch (err) {
32
+ return NextResponse.json(
33
+ { error: `Invalid Z.ai API key: ${(err as Error).message}` },
34
+ { status: 400 },
35
+ );
36
+ }
37
+ writeZaiKey(key);
38
+ } else {
39
+ // Removal is always allowed — drop the key AND immediately prune
40
+ // the zai line so the tab/widget disappear the instant the user
41
+ // removes it, without waiting for the daemon's next 5-min tick.
42
+ deleteZaiKeyAndPrune();
43
+ }
44
+ return NextResponse.json({ ok: true, ...readCredentialsMasked() });
45
+ }
@@ -8,6 +8,7 @@ import {
8
8
  type LiveEntrySummary,
9
9
  } from "@/components/live-sessions-widget";
10
10
  import { JobQueueWidget } from "@/components/job-queue-widget";
11
+ import { MenubarInstallBanner } from "@/components/menubar-install-banner";
11
12
  import { groupByProject } from "@claude-lens/parser";
12
13
  import { listSessions } from "@/lib/data";
13
14
  import { latestUsageSnapshot } from "@/lib/usage-data";
@@ -131,6 +132,7 @@ export default async function RootLayout({ children }: { children: React.ReactNo
131
132
  overflow: "auto",
132
133
  }}
133
134
  >
135
+ <MenubarInstallBanner />
134
136
  {children}
135
137
  </main>
136
138
  </div>