@hirra/vibemeter 0.1.2 → 0.1.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 (262) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +7 -1
  3. package/.next/build-manifest.json +7 -8
  4. package/.next/fallback-build-manifest.json +3 -3
  5. package/.next/prerender-manifest.json +16 -12
  6. package/.next/required-server-files.js +5 -4
  7. package/.next/required-server-files.json +5 -4
  8. package/.next/routes-manifest.json +36 -0
  9. package/.next/server/app/_global-error/page/build-manifest.json +4 -5
  10. package/.next/server/app/_global-error/page.js +4 -4
  11. package/.next/server/app/_global-error/page.js.nft.json +1 -1
  12. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  13. package/.next/server/app/_global-error.html +1 -1
  14. package/.next/server/app/_global-error.rsc +1 -1
  15. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  16. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  17. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  18. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  19. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  20. package/.next/server/app/_not-found/page/build-manifest.json +4 -5
  21. package/.next/server/app/_not-found/page.js +5 -4
  22. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  23. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  24. package/.next/server/app/admin/page/build-manifest.json +4 -5
  25. package/.next/server/app/admin/page.js +7 -5
  26. package/.next/server/app/admin/page.js.nft.json +1 -1
  27. package/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  28. package/.next/server/app/api/codex-accounts/route.js +1 -1
  29. package/.next/server/app/api/codex-accounts/route.js.nft.json +1 -1
  30. package/.next/server/app/api/float/route/app-paths-manifest.json +3 -0
  31. package/.next/server/app/api/float/route/build-manifest.json +9 -0
  32. package/.next/server/app/api/float/route/server-reference-manifest.json +4 -0
  33. package/.next/server/app/api/float/route.js +8 -0
  34. package/.next/server/app/api/float/route.js.map +5 -0
  35. package/.next/server/app/api/float/route.js.nft.json +1 -0
  36. package/.next/server/app/api/float/route_client-reference-manifest.js +3 -0
  37. package/.next/server/app/api/import-sessions/route.js.nft.json +1 -1
  38. package/.next/server/app/api/sessions/[id]/tags/route.js +1 -1
  39. package/.next/server/app/api/sessions/[id]/tags/route.js.nft.json +1 -1
  40. package/.next/server/app/api/sessions/route.js +1 -1
  41. package/.next/server/app/api/sessions/route.js.nft.json +1 -1
  42. package/.next/server/app/api/settings/alerts/route/app-paths-manifest.json +3 -0
  43. package/.next/server/app/api/settings/alerts/route/build-manifest.json +9 -0
  44. package/.next/server/app/api/settings/alerts/route/server-reference-manifest.json +4 -0
  45. package/.next/server/app/api/settings/alerts/route.js +9 -0
  46. package/.next/server/app/api/settings/alerts/route.js.map +5 -0
  47. package/.next/server/app/api/settings/alerts/route.js.nft.json +1 -0
  48. package/.next/server/app/api/settings/alerts/route_client-reference-manifest.js +3 -0
  49. package/.next/server/app/api/settings/notify/route/app-paths-manifest.json +3 -0
  50. package/.next/server/app/api/settings/notify/route/build-manifest.json +9 -0
  51. package/.next/server/app/api/settings/notify/route/server-reference-manifest.json +4 -0
  52. package/.next/server/app/api/settings/notify/route.js +7 -0
  53. package/.next/server/app/api/settings/notify/route.js.map +5 -0
  54. package/.next/server/app/api/settings/notify/route.js.nft.json +1 -0
  55. package/.next/server/app/api/settings/notify/route_client-reference-manifest.js +3 -0
  56. package/.next/server/app/api/usage/route.js +1 -1
  57. package/.next/server/app/api/usage/route.js.nft.json +1 -1
  58. package/.next/server/app/float/page/app-paths-manifest.json +3 -0
  59. package/.next/server/app/float/page/build-manifest.json +16 -0
  60. package/.next/server/app/float/page/next-font-manifest.json +11 -0
  61. package/.next/server/app/float/page/react-loadable-manifest.json +1 -0
  62. package/.next/server/app/float/page/server-reference-manifest.json +4 -0
  63. package/.next/server/app/float/page.js +15 -0
  64. package/.next/server/app/float/page.js.map +5 -0
  65. package/.next/server/app/float/page.js.nft.json +1 -0
  66. package/.next/server/app/float/page_client-reference-manifest.js +3 -0
  67. package/.next/server/app/install.sh/route/app-paths-manifest.json +3 -0
  68. package/.next/server/app/install.sh/route/build-manifest.json +9 -0
  69. package/.next/server/app/install.sh/route/server-reference-manifest.json +4 -0
  70. package/.next/server/app/install.sh/route.js +6 -0
  71. package/.next/server/app/install.sh/route.js.map +5 -0
  72. package/.next/server/app/install.sh/route.js.nft.json +1 -0
  73. package/.next/server/app/install.sh/route_client-reference-manifest.js +3 -0
  74. package/.next/server/app/install.sh.body +108 -0
  75. package/.next/server/app/install.sh.meta +1 -0
  76. package/.next/server/app/page/build-manifest.json +4 -5
  77. package/.next/server/app/page.js +8 -5
  78. package/.next/server/app/page.js.nft.json +1 -1
  79. package/.next/server/app/page_client-reference-manifest.js +1 -1
  80. package/.next/server/app/settings/page/app-paths-manifest.json +3 -0
  81. package/.next/server/app/settings/page/build-manifest.json +16 -0
  82. package/.next/server/app/settings/page/next-font-manifest.json +11 -0
  83. package/.next/server/app/settings/page/react-loadable-manifest.json +1 -0
  84. package/.next/server/app/settings/page/server-reference-manifest.json +4 -0
  85. package/.next/server/app/settings/page.js +17 -0
  86. package/.next/server/app/settings/page.js.map +5 -0
  87. package/.next/server/app/settings/page.js.nft.json +1 -0
  88. package/.next/server/app/settings/page_client-reference-manifest.js +3 -0
  89. package/.next/server/app-paths-manifest.json +7 -1
  90. package/.next/server/chunks/[externals]__0_i~3ox._.js +3 -0
  91. package/.next/server/chunks/[externals]__0_i~3ox._.js.map +1 -0
  92. package/.next/server/chunks/[externals]__13p_1zh._.js +3 -0
  93. package/.next/server/chunks/[externals]__13p_1zh._.js.map +1 -0
  94. package/.next/server/chunks/[root-of-the-server]__01t2c3w._.js +38 -0
  95. package/.next/server/chunks/[root-of-the-server]__01t2c3w._.js.map +1 -0
  96. package/.next/server/chunks/{[root-of-the-server]__0g0u0lm._.js → [root-of-the-server]__024yzee._.js} +2 -2
  97. package/.next/server/chunks/{[root-of-the-server]__00q0o~z._.js → [root-of-the-server]__082iwfa._.js} +2 -2
  98. package/.next/server/chunks/[root-of-the-server]__0chedn~._.js +1 -1
  99. package/.next/server/chunks/[root-of-the-server]__0mwf0bn._.js +38 -0
  100. package/.next/server/chunks/[root-of-the-server]__0mwf0bn._.js.map +1 -0
  101. package/.next/server/chunks/{[root-of-the-server]__0-74syk._.js → [root-of-the-server]__0ru3_it._.js} +2 -2
  102. package/.next/server/chunks/[root-of-the-server]__0u6y_k1._.js +111 -0
  103. package/.next/server/chunks/[root-of-the-server]__0u6y_k1._.js.map +1 -0
  104. package/.next/server/chunks/{[root-of-the-server]__0866q87._.js → [root-of-the-server]__0xa4dzi._.js} +2 -2
  105. package/.next/server/chunks/[root-of-the-server]__13415c6._.js +96 -0
  106. package/.next/server/chunks/[root-of-the-server]__13415c6._.js.map +1 -0
  107. package/.next/server/chunks/[root-of-the-server]__13j_28o._.js +96 -0
  108. package/.next/server/chunks/[root-of-the-server]__13j_28o._.js.map +1 -0
  109. package/.next/server/chunks/_next-internal_server_app_api_float_route_actions_012j~jr.js +3 -0
  110. package/.next/server/chunks/_next-internal_server_app_api_float_route_actions_012j~jr.js.map +1 -0
  111. package/.next/server/chunks/_next-internal_server_app_api_settings_alerts_route_actions_0ydcyko.js +3 -0
  112. package/.next/server/chunks/_next-internal_server_app_api_settings_alerts_route_actions_0ydcyko.js.map +1 -0
  113. package/.next/server/chunks/_next-internal_server_app_api_settings_notify_route_actions_0-j35mb.js +3 -0
  114. package/.next/server/chunks/_next-internal_server_app_api_settings_notify_route_actions_0-j35mb.js.map +1 -0
  115. package/.next/server/chunks/_next-internal_server_app_install_sh_route_actions_0cj-6me.js +3 -0
  116. package/.next/server/chunks/_next-internal_server_app_install_sh_route_actions_0cj-6me.js.map +1 -0
  117. package/.next/server/chunks/node_modules_next_06f88ko._.js +19 -0
  118. package/.next/server/chunks/node_modules_next_06f88ko._.js.map +1 -0
  119. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_03jj5jj.js +18 -0
  120. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_03jj5jj.js.map +1 -0
  121. package/.next/server/chunks/src_12i1qk5._.js +3 -0
  122. package/.next/server/chunks/src_12i1qk5._.js.map +1 -0
  123. package/.next/server/chunks/src_lib_alerts_ticker_ts_0n6oy1d._.js +169 -0
  124. package/.next/server/chunks/src_lib_alerts_ticker_ts_0n6oy1d._.js.map +1 -0
  125. package/.next/server/chunks/ssr/[root-of-the-server]__03mt8o0._.js +3 -0
  126. package/.next/server/chunks/ssr/[root-of-the-server]__03mt8o0._.js.map +1 -0
  127. package/.next/server/chunks/ssr/{[root-of-the-server]__098zro9._.js → [root-of-the-server]__090jxzh._.js} +2 -2
  128. package/.next/server/chunks/ssr/[root-of-the-server]__090jxzh._.js.map +1 -0
  129. package/.next/server/chunks/ssr/{[root-of-the-server]__09hgk-7._.js → [root-of-the-server]__0c3j40u._.js} +2 -2
  130. package/.next/server/chunks/ssr/[root-of-the-server]__0c3j40u._.js.map +1 -0
  131. package/.next/server/chunks/ssr/[root-of-the-server]__0ot4nev._.js +3 -0
  132. package/.next/server/chunks/ssr/[root-of-the-server]__0ot4nev._.js.map +1 -0
  133. package/.next/server/chunks/ssr/[root-of-the-server]__0q_~l2m._.js +90 -0
  134. package/.next/server/chunks/ssr/[root-of-the-server]__0q_~l2m._.js.map +1 -0
  135. package/.next/server/chunks/ssr/{[root-of-the-server]__0cqes87._.js → [root-of-the-server]__0qt26ty._.js} +2 -2
  136. package/.next/server/chunks/ssr/[root-of-the-server]__0qt26ty._.js.map +1 -0
  137. package/.next/server/chunks/ssr/[root-of-the-server]__0s5.uhg._.js +55 -0
  138. package/.next/server/chunks/ssr/[root-of-the-server]__0s5.uhg._.js.map +1 -0
  139. package/.next/server/chunks/ssr/[root-of-the-server]__0x~-phx._.js +3 -0
  140. package/.next/server/chunks/ssr/[root-of-the-server]__0x~-phx._.js.map +1 -0
  141. package/.next/server/chunks/ssr/[root-of-the-server]__0y_zq8k._.js +3 -0
  142. package/.next/server/chunks/ssr/[root-of-the-server]__0y_zq8k._.js.map +1 -0
  143. package/.next/server/chunks/ssr/{[root-of-the-server]__08qr2ji._.js → [root-of-the-server]__0~953ob._.js} +2 -2
  144. package/.next/server/chunks/ssr/[root-of-the-server]__0~953ob._.js.map +1 -0
  145. package/.next/server/chunks/ssr/_0-9j34y._.js +70 -0
  146. package/.next/server/chunks/ssr/_0-9j34y._.js.map +1 -0
  147. package/.next/server/chunks/ssr/_0jxmm9h._.js +6 -0
  148. package/.next/server/chunks/ssr/_0jxmm9h._.js.map +1 -0
  149. package/.next/server/chunks/ssr/_0lfe3wr._.js +3 -0
  150. package/.next/server/chunks/ssr/_0lfe3wr._.js.map +1 -0
  151. package/.next/server/chunks/ssr/{node_modules_0i2xw~e._.js → _0nvprxh._.js} +5 -2
  152. package/.next/server/chunks/ssr/_0nvprxh._.js.map +1 -0
  153. package/.next/server/chunks/ssr/_0pugb10._.js +6 -0
  154. package/.next/server/chunks/ssr/_0pugb10._.js.map +1 -0
  155. package/.next/server/chunks/ssr/_next-internal_server_app_float_page_actions_0x6hm4p.js +3 -0
  156. package/.next/server/chunks/ssr/_next-internal_server_app_float_page_actions_0x6hm4p.js.map +1 -0
  157. package/.next/server/chunks/ssr/_next-internal_server_app_settings_page_actions_0mr68ai.js +3 -0
  158. package/.next/server/chunks/ssr/_next-internal_server_app_settings_page_actions_0mr68ai.js.map +1 -0
  159. package/.next/server/chunks/ssr/node_modules_@swc_helpers_cjs__interop_require_default_cjs_11~q6fv._.js +3 -0
  160. package/.next/server/chunks/ssr/node_modules_@swc_helpers_cjs__interop_require_default_cjs_11~q6fv._.js.map +1 -0
  161. package/.next/server/chunks/ssr/node_modules_next_dist_09jzzl8._.js +3 -0
  162. package/.next/server/chunks/ssr/node_modules_next_dist_09jzzl8._.js.map +1 -0
  163. package/.next/server/chunks/ssr/{node_modules_next_dist_0e1izl_._.js → node_modules_next_dist_0h9llsw._.js} +2 -2
  164. package/.next/server/chunks/ssr/node_modules_next_dist_0h9llsw._.js.map +1 -0
  165. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_06b_a87.js +4 -0
  166. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_06b_a87.js.map +1 -0
  167. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0p_u4px.js +4 -0
  168. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0p_u4px.js.map +1 -0
  169. package/.next/server/chunks/ssr/src_0urkups._.js +3 -0
  170. package/.next/server/chunks/ssr/src_0urkups._.js.map +1 -0
  171. package/.next/server/chunks/ssr/src_components_0ox9d~w._.js +3 -0
  172. package/.next/server/chunks/ssr/src_components_0ox9d~w._.js.map +1 -0
  173. package/.next/server/chunks/ssr/src_components_CodexAccountsPanel_tsx_0n9xjzi._.js +1 -1
  174. package/.next/server/chunks/ssr/src_components_CodexAccountsPanel_tsx_0n9xjzi._.js.map +1 -1
  175. package/.next/server/chunks/ssr/src_components_FloatingWidget_tsx_089.6oo._.js +3 -0
  176. package/.next/server/chunks/ssr/src_components_FloatingWidget_tsx_089.6oo._.js.map +1 -0
  177. package/.next/server/chunks/ssr/src_lib_i18n_client_tsx_07pysgz._.js +3 -0
  178. package/.next/server/chunks/ssr/src_lib_i18n_client_tsx_07pysgz._.js.map +1 -0
  179. package/.next/server/edge/chunks/_0-m5tdn._.js +3 -0
  180. package/.next/server/edge/chunks/_0-m5tdn._.js.map +1 -0
  181. package/.next/server/edge/chunks/node_modules_next_dist_esm_build_templates_edge-wrapper_0mz-5sp.js.map +1 -0
  182. package/.next/server/edge/chunks/turbopack-node_modules_next_dist_esm_build_templates_edge-wrapper_0mz-5sp.js +3 -0
  183. package/.next/server/functions-config-manifest.json +4 -1
  184. package/.next/server/instrumentation/middleware-manifest.json +12 -0
  185. package/.next/server/instrumentation.js +4 -0
  186. package/.next/server/instrumentation.js.map +5 -0
  187. package/.next/server/instrumentation.js.nft.json +1 -0
  188. package/.next/server/middleware-build-manifest.js +7 -8
  189. package/.next/server/next-font-manifest.js +1 -1
  190. package/.next/server/next-font-manifest.json +8 -0
  191. package/.next/server/pages/500.html +1 -1
  192. package/.next/server/pages-manifest.json +0 -1
  193. package/.next/server/server-reference-manifest.js +1 -1
  194. package/.next/server/server-reference-manifest.json +1 -1
  195. package/.next/static/chunks/0bymg5d-lqs0o.js +5 -0
  196. package/.next/static/chunks/0ebdqsutnp8y4.js +1 -0
  197. package/.next/static/chunks/0i3~mnai-l497.js +1 -0
  198. package/.next/static/chunks/0idj4tdmyr934.js +1 -0
  199. package/.next/static/chunks/10eoi4q2wk80z.js +1 -0
  200. package/.next/static/chunks/10refkmyp9rbl.css +3 -0
  201. package/.next/static/chunks/{07lhk_q6pmm3r.js → 10u3y4bw1ayzs.js} +1 -1
  202. package/.next/static/chunks/{00gq-v0e07i1q.js → 115dplafwys-z.js} +1 -1
  203. package/.next/static/chunks/12-9memveha-v.js +1 -0
  204. package/.next/static/chunks/163s8y.j70104.js +4 -0
  205. package/.next/static/chunks/turbopack-0k9twle9a8sh6.js +1 -0
  206. package/.next/types/routes.d.ts +8 -2
  207. package/.next/types/validator.ts +54 -0
  208. package/README.md +57 -17
  209. package/bin/vibemeter-float.swift +970 -0
  210. package/bin/vibemeter-notify.sh +172 -0
  211. package/bin/vibemeter.mjs +385 -7
  212. package/package.json +2 -1
  213. package/public/demo1.png +0 -0
  214. package/public/float-ball.png +0 -0
  215. package/public/float-collapsed.png +0 -0
  216. package/public/float-expanded.png +0 -0
  217. package/public/pay-alipay.jpg +0 -0
  218. package/.next/server/app/_not-found.html +0 -1
  219. package/.next/server/app/_not-found.meta +0 -16
  220. package/.next/server/app/_not-found.rsc +0 -16
  221. package/.next/server/app/_not-found.segments/_full.segment.rsc +0 -16
  222. package/.next/server/app/_not-found.segments/_head.segment.rsc +0 -6
  223. package/.next/server/app/_not-found.segments/_index.segment.rsc +0 -5
  224. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +0 -5
  225. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +0 -5
  226. package/.next/server/app/_not-found.segments/_tree.segment.rsc +0 -2
  227. package/.next/server/chunks/[root-of-the-server]__0y68a5d._.js +0 -96
  228. package/.next/server/chunks/[root-of-the-server]__0y68a5d._.js.map +0 -1
  229. package/.next/server/chunks/ssr/[root-of-the-server]__054lv8d._.js +0 -3
  230. package/.next/server/chunks/ssr/[root-of-the-server]__054lv8d._.js.map +0 -1
  231. package/.next/server/chunks/ssr/[root-of-the-server]__08qr2ji._.js.map +0 -1
  232. package/.next/server/chunks/ssr/[root-of-the-server]__098zro9._.js.map +0 -1
  233. package/.next/server/chunks/ssr/[root-of-the-server]__09hgk-7._.js.map +0 -1
  234. package/.next/server/chunks/ssr/[root-of-the-server]__0cqes87._.js.map +0 -1
  235. package/.next/server/chunks/ssr/[root-of-the-server]__0l.drdn._.js +0 -3
  236. package/.next/server/chunks/ssr/[root-of-the-server]__0l.drdn._.js.map +0 -1
  237. package/.next/server/chunks/ssr/[root-of-the-server]__0v1zqf~._.js +0 -120
  238. package/.next/server/chunks/ssr/[root-of-the-server]__0v1zqf~._.js.map +0 -1
  239. package/.next/server/chunks/ssr/[root-of-the-server]__0v73tbn._.js +0 -3
  240. package/.next/server/chunks/ssr/[root-of-the-server]__0v73tbn._.js.map +0 -1
  241. package/.next/server/chunks/ssr/_0ye~8el._.js +0 -7
  242. package/.next/server/chunks/ssr/_0ye~8el._.js.map +0 -1
  243. package/.next/server/chunks/ssr/node_modules_0ck2~9g._.js +0 -3
  244. package/.next/server/chunks/ssr/node_modules_0ck2~9g._.js.map +0 -1
  245. package/.next/server/chunks/ssr/node_modules_0i2xw~e._.js.map +0 -1
  246. package/.next/server/chunks/ssr/node_modules_next_dist_0e1izl_._.js.map +0 -1
  247. package/.next/server/chunks/ssr/node_modules_next_dist_0gsjr7_._.js +0 -3
  248. package/.next/server/chunks/ssr/node_modules_next_dist_0gsjr7_._.js.map +0 -1
  249. package/.next/server/pages/404.html +0 -1
  250. package/.next/static/chunks/002~6040mndie.css +0 -3
  251. package/.next/static/chunks/02g3221oh~3le.js +0 -2
  252. package/.next/static/chunks/0erq0bmub6w_z.js +0 -2
  253. package/.next/static/chunks/0ljfidstam_7k.js +0 -1
  254. package/.next/static/chunks/0pqt~8bl3ukh4.js +0 -4
  255. package/.next/static/chunks/turbopack-14vio.b1b9i4l.js +0 -1
  256. /package/.next/server/chunks/{[root-of-the-server]__0g0u0lm._.js.map → [root-of-the-server]__024yzee._.js.map} +0 -0
  257. /package/.next/server/chunks/{[root-of-the-server]__00q0o~z._.js.map → [root-of-the-server]__082iwfa._.js.map} +0 -0
  258. /package/.next/server/chunks/{[root-of-the-server]__0-74syk._.js.map → [root-of-the-server]__0ru3_it._.js.map} +0 -0
  259. /package/.next/server/chunks/{[root-of-the-server]__0866q87._.js.map → [root-of-the-server]__0xa4dzi._.js.map} +0 -0
  260. /package/.next/static/{Ong62ufsHaRU36s0QK5ZZ → _Y03MiN6NI16Ms86q6vCJ}/_buildManifest.js +0 -0
  261. /package/.next/static/{Ong62ufsHaRU36s0QK5ZZ → _Y03MiN6NI16Ms86q6vCJ}/_clientMiddlewareManifest.js +0 -0
  262. /package/.next/static/{Ong62ufsHaRU36s0QK5ZZ → _Y03MiN6NI16Ms86q6vCJ}/_ssgManifest.js +0 -0
@@ -0,0 +1,3 @@
1
+ module.exports=[93695,(a,b,c)=>{b.exports=a.x("next/dist/shared/lib/no-fallback-error.external.js",()=>require("next/dist/shared/lib/no-fallback-error.external.js"))},64240,(a,b,c)=>{"use strict";function d(a){if("function"!=typeof WeakMap)return null;var b=new WeakMap,c=new WeakMap;return(d=function(a){return a?c:b})(a)}c._=function(a,b){if(!b&&a&&a.__esModule)return a;if(null===a||"object"!=typeof a&&"function"!=typeof a)return{default:a};var c=d(b);if(c&&c.has(a))return c.get(a);var e={__proto__:null},f=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var g in a)if("default"!==g&&Object.prototype.hasOwnProperty.call(a,g)){var h=f?Object.getOwnPropertyDescriptor(a,g):null;h&&(h.get||h.set)?Object.defineProperty(e,g,h):e[g]=a[g]}return e.default=a,c&&c.set(a,e),e}},2157,(a,b,c)=>{b.exports=a.x("node:fs",()=>require("node:fs"))},60526,(a,b,c)=>{b.exports=a.x("node:os",()=>require("node:os"))},50227,(a,b,c)=>{b.exports=a.x("node:path",()=>require("node:path"))},12714,(a,b,c)=>{b.exports=a.x("node:fs/promises",()=>require("node:fs/promises"))},1737,a=>{"use strict";var b=a.i(12714);a.i(2157);var c=a.i(60526),d=a.i(50227);let e="https://api.openai.com/auth";async function f(a){let c=JSON.parse(await (0,b.readFile)(a,"utf8"));if(!c.tokens||"string"!=typeof c.tokens.account_id)throw Error("Codex auth file is missing tokens.account_id");return c}function g(a){if("string"!=typeof a)return null;let[,b]=a.split(".");if(!b)return null;try{return JSON.parse(Buffer.from(b,"base64url").toString("utf8"))}catch{return null}}function h(a){return"string"==typeof a&&a.length>0?a:null}function i(a){return"number"==typeof a?new Date(1e3*a).toISOString():null}function j(a,b,c){let d=h(a.tokens?.account_id);if(!d)throw Error("Codex auth file is missing tokens.account_id");let f=g(a.tokens?.id_token),j=g(a.tokens?.access_token),k=f?.[e],l=j?.[e],m=h(f?.email),n=h(f?.name),o=h(k?.chatgpt_plan_type)??h(l?.chatgpt_plan_type),p=h(k?.user_id)??h(l?.user_id),q=m??n??`${d.slice(0,8)}...${d.slice(-4)}`;return{accountId:d,label:q,email:m,name:n,planType:o,userId:p,lastRefresh:h(a.last_refresh),idTokenExpiresAt:i(f?.exp),accessTokenExpiresAt:i(j?.exp),storedAt:b,isCurrent:d===c}}async function k(a={}){let{authPath:e,storeDir:g}=function(a={}){return{authPath:a.authPath??d.default.join((0,c.homedir)(),".codex","auth.json"),storeDir:a.storeDir??d.default.join((0,c.homedir)(),".codex","auth-accounts")}}(a),i=null,l=null;try{l=await f(e),i=h(l.tokens?.account_id)}catch{l=null}let m=new Map;try{for(let a of(await (0,b.readdir)(g))){if(!a.endsWith(".json"))continue;let c=d.default.join(g,a);try{let a=await f(c),d=await (0,b.stat)(c),e=j(a,d.mtime.toISOString(),i);m.set(e.accountId,e)}catch{}}}catch{}return l&&i&&!m.has(i)&&m.set(i,j(l,null,i)),[...m.values()].sort((a,b)=>a.isCurrent!==b.isCurrent?a.isCurrent?-1:1:a.label.localeCompare(b.label))}a.s(["getCodexAccounts",0,k])},10585,a=>{a.v("/_next/static/media/favicon.0x3dzn~oxb6tn.ico"+(globalThis.NEXT_CLIENT_ASSET_SUFFIX||""))},68611,a=>{"use strict";let b={src:a.i(10585).default,width:256,height:256};a.s(["default",0,b])},79887,a=>{"use strict";a.s(["CodexAccountsPanel",()=>b]);let b=(0,a.i(11857).registerClientReference)(function(){throw Error("Attempted to call CodexAccountsPanel() from the server but CodexAccountsPanel is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/src/components/CodexAccountsPanel.tsx <module evaluation>","CodexAccountsPanel")},14929,a=>{"use strict";a.s(["CodexAccountsPanel",()=>b]);let b=(0,a.i(11857).registerClientReference)(function(){throw Error("Attempted to call CodexAccountsPanel() from the server but CodexAccountsPanel is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/src/components/CodexAccountsPanel.tsx","CodexAccountsPanel")},32787,a=>{"use strict";a.i(79887);var b=a.i(14929);a.n(b)},25657,a=>{"use strict";var b=a.i(7997),c=a.i(95936),d=a.i(32787),e=a.i(60447),f=a.i(1737),g=a.i(66469),h=a.i(18391);async function i(){let a=await (0,f.getCodexAccounts)(),i=await (0,g.getServerLocale)();return(0,b.jsx)("div",{className:"min-h-screen bg-zinc-950 text-zinc-100 font-mono",children:(0,b.jsxs)("div",{className:"max-w-6xl mx-auto px-6 py-8",children:[(0,b.jsxs)("div",{className:"mb-6 flex items-start justify-between gap-4",children:[(0,b.jsxs)("div",{children:[(0,b.jsxs)("h1",{className:"text-xl font-semibold tracking-tight text-zinc-100",children:[(0,b.jsx)("span",{className:"text-violet-400",children:"Vibe"}),"meter ","zh"===i?"· 管理":"Admin"]}),(0,b.jsx)("p",{className:"text-zinc-600 text-xs mt-1",children:(0,h.t)(i,"admin.subtitle")})]}),(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)(e.LocaleSwitcher,{}),(0,b.jsx)(c.default,{href:"/",className:"rounded-md border border-zinc-800 px-3 py-2 text-xs text-zinc-400 transition-colors hover:border-zinc-600 hover:text-zinc-100",children:(0,h.t)(i,"common.dashboard")})]})]}),(0,b.jsx)(d.CodexAccountsPanel,{initialAccounts:a})]})})}a.s(["default",0,i,"dynamic",0,"force-dynamic"])},50427,a=>{a.n(a.i(25657))}];
2
+
3
+ //# sourceMappingURL=%5Broot-of-the-server%5D__0y_zq8k._.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../node_modules/%40swc/helpers/cjs/_interop_require_wildcard.cjs","../../../../src/lib/codex-auth.ts","../../../../src/app/favicon.ico.mjs%20%28structured%20image%20object%29","../../../../src/components/CodexAccountsPanel.tsx/__nextjs-internal-proxy.mjs","../../../../src/app/admin/page.tsx"],"sourcesContent":["\"use strict\";\n\nfunction _getRequireWildcardCache(nodeInterop) {\n if (typeof WeakMap !== \"function\") return null;\n\n var cacheBabelInterop = new WeakMap();\n var cacheNodeInterop = new WeakMap();\n\n return (_getRequireWildcardCache = function(nodeInterop) {\n return nodeInterop ? cacheNodeInterop : cacheBabelInterop;\n })(nodeInterop);\n}\nfunction _interop_require_wildcard(obj, nodeInterop) {\n if (!nodeInterop && obj && obj.__esModule) return obj;\n if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") return { default: obj };\n\n var cache = _getRequireWildcardCache(nodeInterop);\n\n if (cache && cache.has(obj)) return cache.get(obj);\n\n var newObj = { __proto__: null };\n var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var key in obj) {\n if (key !== \"default\" && Object.prototype.hasOwnProperty.call(obj, key)) {\n var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;\n if (desc && (desc.get || desc.set)) Object.defineProperty(newObj, key, desc);\n else newObj[key] = obj[key];\n }\n }\n\n newObj.default = obj;\n\n if (cache) cache.set(obj, newObj);\n\n return newObj;\n}\nexports._ = _interop_require_wildcard;\n","import { mkdir, readFile, rename, readdir, stat, unlink, writeFile } from 'node:fs/promises';\nimport { readFileSync, statSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport path from 'node:path';\n\ninterface CodexAuthFile {\n auth_mode?: unknown;\n OPENAI_API_KEY?: unknown;\n tokens?: {\n id_token?: unknown;\n access_token?: unknown;\n refresh_token?: unknown;\n account_id?: unknown;\n };\n last_refresh?: unknown;\n}\n\nexport interface CodexAccountSummary {\n accountId: string;\n label: string;\n email: string | null;\n name: string | null;\n planType: string | null;\n userId: string | null;\n lastRefresh: string | null;\n idTokenExpiresAt: string | null;\n accessTokenExpiresAt: string | null;\n storedAt: string | null;\n isCurrent: boolean;\n}\n\nexport interface CodexAuthPaths {\n authPath?: string;\n storeDir?: string;\n}\n\nexport interface CurrentCodexAccount {\n accountId: string;\n authMtimeMs: number;\n}\n\nconst AUTH_CLAIMS_KEY = 'https://api.openai.com/auth';\n\nfunction defaultAuthPath() {\n return path.join(/* turbopackIgnore: true */ homedir(), '.codex', 'auth.json');\n}\n\nfunction defaultStoreDir() {\n return path.join(/* turbopackIgnore: true */ homedir(), '.codex', 'auth-accounts');\n}\n\nfunction resolvePaths(paths: CodexAuthPaths = {}) {\n return {\n authPath: paths.authPath ?? defaultAuthPath(),\n storeDir: paths.storeDir ?? defaultStoreDir(),\n };\n}\n\nfunction accountPath(accountId: string, storeDir: string) {\n return path.join(/* turbopackIgnore: true */ storeDir, `${accountId.replace(/[^a-zA-Z0-9_-]/g, '_')}.json`);\n}\n\nasync function readAuthFile(filePath: string): Promise<CodexAuthFile> {\n const raw = await readFile(filePath, 'utf8');\n const parsed = JSON.parse(raw) as CodexAuthFile;\n if (!parsed.tokens || typeof parsed.tokens.account_id !== 'string') {\n throw new Error('Codex auth file is missing tokens.account_id');\n }\n return parsed;\n}\n\nasync function writeJsonAtomic(filePath: string, data: unknown) {\n await mkdir(path.dirname(filePath), { recursive: true });\n const tmp = `${filePath}.${process.pid}.${Date.now()}.tmp`;\n await writeFile(tmp, `${JSON.stringify(data, null, 2)}\\n`, { encoding: 'utf8', mode: 0o600 });\n await rename(tmp, filePath);\n}\n\nfunction decodeJwtPayload(token: unknown): Record<string, unknown> | null {\n if (typeof token !== 'string') return null;\n const [, payload] = token.split('.');\n if (!payload) return null;\n\n try {\n return JSON.parse(Buffer.from(payload, 'base64url').toString('utf8')) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nfunction stringClaim(value: unknown): string | null {\n return typeof value === 'string' && value.length > 0 ? value : null;\n}\n\nfunction expiryClaim(value: unknown): string | null {\n return typeof value === 'number' ? new Date(value * 1000).toISOString() : null;\n}\n\nfunction summarizeAuth(auth: CodexAuthFile, storedAt: string | null, currentAccountId: string | null): CodexAccountSummary {\n const accountId = stringClaim(auth.tokens?.account_id);\n if (!accountId) throw new Error('Codex auth file is missing tokens.account_id');\n\n const idPayload = decodeJwtPayload(auth.tokens?.id_token);\n const accessPayload = decodeJwtPayload(auth.tokens?.access_token);\n const idAuthClaims = idPayload?.[AUTH_CLAIMS_KEY] as Record<string, unknown> | undefined;\n const accessAuthClaims = accessPayload?.[AUTH_CLAIMS_KEY] as Record<string, unknown> | undefined;\n\n const email = stringClaim(idPayload?.email);\n const name = stringClaim(idPayload?.name);\n const planType = stringClaim(idAuthClaims?.chatgpt_plan_type) ?? stringClaim(accessAuthClaims?.chatgpt_plan_type);\n const userId = stringClaim(idAuthClaims?.user_id) ?? stringClaim(accessAuthClaims?.user_id);\n const label = email ?? name ?? `${accountId.slice(0, 8)}...${accountId.slice(-4)}`;\n\n return {\n accountId,\n label,\n email,\n name,\n planType,\n userId,\n lastRefresh: stringClaim(auth.last_refresh),\n idTokenExpiresAt: expiryClaim(idPayload?.exp),\n accessTokenExpiresAt: expiryClaim(accessPayload?.exp),\n storedAt,\n isCurrent: accountId === currentAccountId,\n };\n}\n\nexport async function getCodexAccounts(paths: CodexAuthPaths = {}): Promise<CodexAccountSummary[]> {\n const { authPath, storeDir } = resolvePaths(paths);\n let currentAccountId: string | null = null;\n let currentAuth: CodexAuthFile | null = null;\n\n try {\n currentAuth = await readAuthFile(authPath);\n currentAccountId = stringClaim(currentAuth.tokens?.account_id);\n } catch {\n currentAuth = null;\n }\n\n const accounts = new Map<string, CodexAccountSummary>();\n\n try {\n const entries = await readdir(storeDir);\n for (const entry of entries) {\n if (!entry.endsWith('.json')) continue;\n const filePath = path.join(storeDir, entry);\n try {\n const storedAuth = await readAuthFile(filePath);\n const storedStat = await stat(filePath);\n const summary = summarizeAuth(storedAuth, storedStat.mtime.toISOString(), currentAccountId);\n accounts.set(summary.accountId, summary);\n } catch {\n // Ignore malformed account snapshots so one bad file does not break the admin page.\n }\n }\n } catch {\n // Missing store just means no saved accounts yet.\n }\n\n if (currentAuth && currentAccountId && !accounts.has(currentAccountId)) {\n accounts.set(currentAccountId, summarizeAuth(currentAuth, null, currentAccountId));\n }\n\n return [...accounts.values()].sort((a, b) => {\n if (a.isCurrent !== b.isCurrent) return a.isCurrent ? -1 : 1;\n return a.label.localeCompare(b.label);\n });\n}\n\nexport function getCurrentCodexAccount(paths: CodexAuthPaths = {}): CurrentCodexAccount | null {\n const { authPath } = resolvePaths(paths);\n try {\n const auth = JSON.parse(readFileSync(authPath, 'utf8')) as CodexAuthFile;\n const accountId = stringClaim(auth.tokens?.account_id);\n if (!accountId) return null;\n return {\n accountId,\n authMtimeMs: statSync(authPath).mtimeMs,\n };\n } catch {\n return null;\n }\n}\n\nexport async function importCurrentCodexAuth(paths: CodexAuthPaths = {}): Promise<CodexAccountSummary> {\n const { authPath, storeDir } = resolvePaths(paths);\n const auth = await readAuthFile(authPath);\n const accountId = auth.tokens?.account_id as string;\n const destination = accountPath(accountId, storeDir);\n await writeJsonAtomic(destination, auth);\n const storedStat = await stat(destination);\n return summarizeAuth(auth, storedStat.mtime.toISOString(), accountId);\n}\n\nexport async function switchCodexAccount(accountId: string, paths: CodexAuthPaths = {}) {\n const { authPath, storeDir } = resolvePaths(paths);\n const source = accountPath(accountId, storeDir);\n const auth = await readAuthFile(source);\n const sourceAccountId = auth.tokens?.account_id;\n if (sourceAccountId !== accountId) {\n throw new Error('Stored account id does not match requested account');\n }\n\n let backupPath: string | null = null;\n try {\n const current = await readFile(authPath, 'utf8');\n backupPath = `${authPath}.${new Date().toISOString().replace(/[:.]/g, '-')}.bak`;\n await writeFile(backupPath, current, { encoding: 'utf8', mode: 0o600 });\n } catch {\n backupPath = null;\n }\n\n await writeJsonAtomic(authPath, auth);\n return {\n ...summarizeAuth(auth, null, accountId),\n backupPath,\n };\n}\n\nexport async function deleteCodexAccount(accountId: string, paths: CodexAuthPaths = {}) {\n const { authPath, storeDir } = resolvePaths(paths);\n const auth = await readAuthFile(authPath).catch(() => null);\n if (auth?.tokens?.account_id === accountId) {\n throw new Error('Cannot delete the currently active Codex account');\n }\n await unlink(accountPath(accountId, storeDir));\n}\n","import src from \"IMAGE\";\nexport default { src, width: 256, height: 256 }\n","// This file is generated by next-core EcmascriptClientReferenceModule.\nimport { registerClientReference } from \"react-server-dom-turbopack/server\";\nexport const CodexAccountsPanel = registerClientReference(\n function() { throw new Error(\"Attempted to call CodexAccountsPanel() from the server but CodexAccountsPanel is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.\"); },\n \"[project]/src/components/CodexAccountsPanel.tsx\",\n \"CodexAccountsPanel\",\n);\n","export const dynamic = 'force-dynamic';\n\nimport Link from 'next/link';\nimport { CodexAccountsPanel } from '@/components/CodexAccountsPanel';\nimport { LocaleSwitcher } from '@/components/LocaleSwitcher';\nimport { getCodexAccounts } from '@/lib/codex-auth';\nimport { getServerLocale } from '@/lib/i18n/server';\nimport { t } from '@/lib/i18n';\n\nexport default async function AdminPage() {\n const accounts = await getCodexAccounts();\n const locale = await getServerLocale();\n\n return (\n <div className=\"min-h-screen bg-zinc-950 text-zinc-100 font-mono\">\n <div className=\"max-w-6xl mx-auto px-6 py-8\">\n <div className=\"mb-6 flex items-start justify-between gap-4\">\n <div>\n <h1 className=\"text-xl font-semibold tracking-tight text-zinc-100\">\n <span className=\"text-violet-400\">Vibe</span>meter {locale === 'zh' ? '· 管理' : 'Admin'}\n </h1>\n <p className=\"text-zinc-600 text-xs mt-1\">{t(locale, 'admin.subtitle')}</p>\n </div>\n <div className=\"flex items-center gap-2\">\n <LocaleSwitcher />\n <Link\n href=\"/\"\n className=\"rounded-md border border-zinc-800 px-3 py-2 text-xs text-zinc-400 transition-colors hover:border-zinc-600 hover:text-zinc-100\"\n >\n {t(locale, 'common.dashboard')}\n </Link>\n </div>\n </div>\n\n <CodexAccountsPanel initialAccounts={accounts} />\n </div>\n </div>\n );\n}\n"],"names":["_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","_interop_require_wildcard","obj","__esModule","default","cache","has","get","newObj","__proto__","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","exports","_","AUTH_CLAIMS_KEY","defaultAuthPath","join","defaultStoreDir","resolvePaths","paths","authPath","storeDir","accountPath","accountId","replace","readAuthFile","filePath","raw","parsed","JSON","parse","tokens","account_id","Error","writeJsonAtomic","data","dirname","recursive","tmp","process","pid","Date","now","stringify","encoding","mode","decodeJwtPayload","token","payload","split","Buffer","from","toString","stringClaim","value","length","expiryClaim","toISOString","summarizeAuth","auth","storedAt","currentAccountId","idPayload","id_token","accessPayload","access_token","idAuthClaims","accessAuthClaims","email","name","planType","chatgpt_plan_type","userId","user_id","label","slice","lastRefresh","last_refresh","idTokenExpiresAt","exp","accessTokenExpiresAt","isCurrent","getCodexAccounts","currentAuth","accounts","Map","entries","entry","endsWith","storedAuth","storedStat","summary","mtime","values","sort","a","b","localeCompare","getCurrentCodexAccount","authMtimeMs","mtimeMs","importCurrentCodexAuth","destination","switchCodexAccount","source","sourceAccountId","backupPath","current","deleteCodexAccount","catch","src","width","height","CodexAccountsPanel","dynamic","AdminPage","locale","className","href","initialAccounts"],"mappings":"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","ignoreList":[0,3]}
@@ -1,4 +1,4 @@
1
- module.exports=[18622,(a,b,c)=>{b.exports=a.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},56704,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},32319,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},24725,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},20635,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/action-async-storage.external.js",()=>require("next/dist/server/app-render/action-async-storage.external.js"))},43285,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/dynamic-access-async-storage.external.js",()=>require("next/dist/server/app-render/dynamic-access-async-storage.external.js"))},42602,(a,b,c)=>{"use strict";b.exports=a.r(18622)},87924,(a,b,c)=>{"use strict";b.exports=a.r(42602).vendored["react-ssr"].ReactJsxRuntime},72131,(a,b,c)=>{"use strict";b.exports=a.r(42602).vendored["react-ssr"].React},9270,(a,b,c)=>{"use strict";b.exports=a.r(42602).vendored.contexts.AppRouterContext},38783,(a,b,c)=>{"use strict";b.exports=a.r(42602).vendored["react-ssr"].ReactServerDOMTurbopackClient},36313,(a,b,c)=>{"use strict";b.exports=a.r(42602).vendored.contexts.HooksClientContext},18341,(a,b,c)=>{"use strict";b.exports=a.r(42602).vendored.contexts.ServerInsertedHtml},33354,(a,b,c)=>{"use strict";c._=function(a){return a&&a.__esModule?a:{default:a}}},51234,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"handleISRError",{enumerable:!0,get:function(){return e}});let d=a.r(56704).workAsyncStorage;function e({error:a}){if(d){let b=d.getStore();if(b?.isStaticGeneration)throw a&&console.error(a),a}}("function"==typeof c.default||"object"==typeof c.default&&null!==c.default)&&void 0===c.default.__esModule&&(Object.defineProperty(c.default,"__esModule",{value:!0}),Object.assign(c.default,c),b.exports=c.default)},57068,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0});var d={WarningIcon:function(){return i},errorStyles:function(){return g},errorThemeCss:function(){return h}};for(var e in d)Object.defineProperty(c,e,{enumerable:!0,get:d[e]});a.r(33354);let f=a.r(87924);a.r(72131);let g={container:{fontFamily:'system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"',height:"100vh",display:"flex",alignItems:"center",justifyContent:"center"},card:{marginTop:"-32px",maxWidth:"325px",padding:"32px 28px",textAlign:"left"},icon:{marginBottom:"24px"},title:{fontSize:"24px",fontWeight:500,letterSpacing:"-0.02em",lineHeight:"32px",margin:"0 0 12px 0",color:"var(--next-error-title)"},message:{fontSize:"14px",fontWeight:400,lineHeight:"21px",margin:"0 0 20px 0",color:"var(--next-error-message)"},form:{margin:0},buttonGroup:{display:"flex",gap:"8px",alignItems:"center"},button:{display:"inline-flex",alignItems:"center",justifyContent:"center",height:"32px",padding:"0 12px",fontSize:"14px",fontWeight:500,lineHeight:"20px",borderRadius:"6px",cursor:"pointer",color:"var(--next-error-btn-text)",background:"var(--next-error-btn-bg)",border:"var(--next-error-btn-border)"},buttonSecondary:{display:"inline-flex",alignItems:"center",justifyContent:"center",height:"32px",padding:"0 12px",fontSize:"14px",fontWeight:500,lineHeight:"20px",borderRadius:"6px",cursor:"pointer",color:"var(--next-error-btn-secondary-text)",background:"var(--next-error-btn-secondary-bg)",border:"var(--next-error-btn-secondary-border)"},digestFooter:{position:"fixed",bottom:"32px",left:"0",right:"0",textAlign:"center",fontFamily:'ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace',fontSize:"12px",lineHeight:"18px",fontWeight:400,margin:"0",color:"var(--next-error-digest)"}},h=`
1
+ module.exports=[18622,(a,b,c)=>{b.exports=a.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},56704,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},32319,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},24725,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},20635,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/action-async-storage.external.js",()=>require("next/dist/server/app-render/action-async-storage.external.js"))},43285,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/dynamic-access-async-storage.external.js",()=>require("next/dist/server/app-render/dynamic-access-async-storage.external.js"))},42602,(a,b,c)=>{"use strict";b.exports=a.r(18622)},87924,(a,b,c)=>{"use strict";b.exports=a.r(42602).vendored["react-ssr"].ReactJsxRuntime},72131,(a,b,c)=>{"use strict";b.exports=a.r(42602).vendored["react-ssr"].React},9270,(a,b,c)=>{"use strict";b.exports=a.r(42602).vendored.contexts.AppRouterContext},36313,(a,b,c)=>{"use strict";b.exports=a.r(42602).vendored.contexts.HooksClientContext},18341,(a,b,c)=>{"use strict";b.exports=a.r(42602).vendored.contexts.ServerInsertedHtml},38783,(a,b,c)=>{"use strict";b.exports=a.r(42602).vendored["react-ssr"].ReactServerDOMTurbopackClient},35112,(a,b,c)=>{"use strict";b.exports=a.r(42602).vendored["react-ssr"].ReactDOM},33354,(a,b,c)=>{"use strict";c._=function(a){return a&&a.__esModule?a:{default:a}}},51234,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"handleISRError",{enumerable:!0,get:function(){return e}});let d=a.r(56704).workAsyncStorage;function e({error:a}){if(d){let b=d.getStore();if(b?.isStaticGeneration)throw a&&console.error(a),a}}("function"==typeof c.default||"object"==typeof c.default&&null!==c.default)&&void 0===c.default.__esModule&&(Object.defineProperty(c.default,"__esModule",{value:!0}),Object.assign(c.default,c),b.exports=c.default)},57068,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0});var d={WarningIcon:function(){return i},errorStyles:function(){return g},errorThemeCss:function(){return h}};for(var e in d)Object.defineProperty(c,e,{enumerable:!0,get:d[e]});a.r(33354);let f=a.r(87924);a.r(72131);let g={container:{fontFamily:'system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"',height:"100vh",display:"flex",alignItems:"center",justifyContent:"center"},card:{marginTop:"-32px",maxWidth:"325px",padding:"32px 28px",textAlign:"left"},icon:{marginBottom:"24px"},title:{fontSize:"24px",fontWeight:500,letterSpacing:"-0.02em",lineHeight:"32px",margin:"0 0 12px 0",color:"var(--next-error-title)"},message:{fontSize:"14px",fontWeight:400,lineHeight:"21px",margin:"0 0 20px 0",color:"var(--next-error-message)"},form:{margin:0},buttonGroup:{display:"flex",gap:"8px",alignItems:"center"},button:{display:"inline-flex",alignItems:"center",justifyContent:"center",height:"32px",padding:"0 12px",fontSize:"14px",fontWeight:500,lineHeight:"20px",borderRadius:"6px",cursor:"pointer",color:"var(--next-error-btn-text)",background:"var(--next-error-btn-bg)",border:"var(--next-error-btn-border)"},buttonSecondary:{display:"inline-flex",alignItems:"center",justifyContent:"center",height:"32px",padding:"0 12px",fontSize:"14px",fontWeight:500,lineHeight:"20px",borderRadius:"6px",cursor:"pointer",color:"var(--next-error-btn-secondary-text)",background:"var(--next-error-btn-secondary-bg)",border:"var(--next-error-btn-secondary-border)"},digestFooter:{position:"fixed",bottom:"32px",left:"0",right:"0",textAlign:"center",fontFamily:'ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace',fontSize:"12px",lineHeight:"18px",fontWeight:400,margin:"0",color:"var(--next-error-digest)"}},h=`
2
2
  :root {
3
3
  --next-error-bg: #fff;
4
4
  --next-error-text: #171717;
@@ -30,4 +30,4 @@ module.exports=[18622,(a,b,c)=>{b.exports=a.x("next/dist/compiled/next-server/ap
30
30
  body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }
31
31
  `.replace(/\n\s*/g,"");function i(){return(0,f.jsx)("svg",{width:"32",height:"32",viewBox:"-0.2 -1.5 32 32",fill:"none",style:g.icon,children:(0,f.jsx)("path",{d:"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z",fill:"var(--next-error-title)"})})}("function"==typeof c.default||"object"==typeof c.default&&null!==c.default)&&void 0===c.default.__esModule&&(Object.defineProperty(c.default,"__esModule",{value:!0}),Object.assign(c.default,c),b.exports=c.default)},40622,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"default",{enumerable:!0,get:function(){return g}}),a.r(33354);let d=a.r(87924);a.r(72131);let e=a.r(51234),f=a.r(57068),g=function({error:a}){let b=a?.digest,c=!!b;return(0,e.handleISRError)({error:a}),(0,d.jsxs)("html",{id:"__next_error__",children:[(0,d.jsx)("head",{children:(0,d.jsx)("style",{dangerouslySetInnerHTML:{__html:f.errorThemeCss}})}),(0,d.jsxs)("body",{children:[(0,d.jsx)("div",{style:f.errorStyles.container,children:(0,d.jsxs)("div",{style:f.errorStyles.card,children:[(0,d.jsx)(f.WarningIcon,{}),(0,d.jsx)("h1",{style:f.errorStyles.title,children:"This page couldn’t load"}),(0,d.jsx)("p",{style:f.errorStyles.message,children:c?"A server error occurred. Reload to try again.":"Reload to try again, or go back."}),(0,d.jsxs)("div",{style:f.errorStyles.buttonGroup,children:[(0,d.jsx)("form",{style:f.errorStyles.form,children:(0,d.jsx)("button",{type:"submit",style:f.errorStyles.button,children:"Reload"})}),!c&&(0,d.jsx)("button",{type:"button",style:f.errorStyles.buttonSecondary,onClick:()=>{window.history.length>1?window.history.back():window.location.href="/"},children:"Back"})]})]})}),b&&(0,d.jsxs)("p",{style:f.errorStyles.digestFooter,children:["ERROR ",b]})]})]})};("function"==typeof c.default||"object"==typeof c.default&&null!==c.default)&&void 0===c.default.__esModule&&(Object.defineProperty(c.default,"__esModule",{value:!0}),Object.assign(c.default,c),b.exports=c.default)}];
32
32
 
33
- //# sourceMappingURL=%5Broot-of-the-server%5D__08qr2ji._.js.map
33
+ //# sourceMappingURL=%5Broot-of-the-server%5D__0~953ob._.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../node_modules/next/src/server/route-modules/app-page/module.compiled.js","../../../../node_modules/next/src/server/route-modules/app-page/vendored/ssr/react-jsx-runtime.ts","../../../../node_modules/next/src/server/route-modules/app-page/vendored/ssr/react.ts","../../../../node_modules/next/src/server/route-modules/app-page/vendored/contexts/app-router-context.ts","../../../../node_modules/next/src/server/route-modules/app-page/vendored/contexts/hooks-client-context.ts","../../../../node_modules/next/src/server/route-modules/app-page/vendored/contexts/server-inserted-html.ts","../../../../node_modules/next/src/server/route-modules/app-page/vendored/ssr/react-server-dom-turbopack-client.ts","../../../../node_modules/next/src/server/route-modules/app-page/vendored/ssr/react-dom.ts","../../../../node_modules/%40swc/helpers/cjs/_interop_require_default.cjs","../../../../node_modules/next/src/client/components/handle-isr-error.tsx","../../../../node_modules/next/src/client/components/builtin/error-styles.tsx","../../../../node_modules/next/src/client/components/builtin/global-error.tsx"],"sourcesContent":["if (process.env.NEXT_RUNTIME === 'edge') {\n module.exports = require('next/dist/server/route-modules/app-page/module.js')\n} else {\n if (process.env.__NEXT_EXPERIMENTAL_REACT) {\n if (process.env.NODE_ENV === 'development') {\n if (process.env.TURBOPACK) {\n module.exports = require('next/dist/compiled/next-server/app-page-turbo-experimental.runtime.dev.js')\n } else {\n module.exports = require('next/dist/compiled/next-server/app-page-experimental.runtime.dev.js')\n }\n } else {\n if (process.env.TURBOPACK) {\n module.exports = require('next/dist/compiled/next-server/app-page-turbo-experimental.runtime.prod.js')\n } else {\n module.exports = require('next/dist/compiled/next-server/app-page-experimental.runtime.prod.js')\n }\n }\n } else {\n if (process.env.NODE_ENV === 'development') {\n if (process.env.TURBOPACK) {\n module.exports = require('next/dist/compiled/next-server/app-page-turbo.runtime.dev.js')\n } else {\n module.exports = require('next/dist/compiled/next-server/app-page.runtime.dev.js')\n }\n } else {\n if (process.env.TURBOPACK) {\n module.exports = require('next/dist/compiled/next-server/app-page-turbo.runtime.prod.js')\n } else {\n module.exports = require('next/dist/compiled/next-server/app-page.runtime.prod.js')\n }\n }\n }\n}\n","module.exports = (\n require('../../module.compiled') as typeof import('../../module.compiled')\n).vendored['react-ssr']!.ReactJsxRuntime\n","module.exports = (\n require('../../module.compiled') as typeof import('../../module.compiled')\n).vendored['react-ssr']!.React\n","module.exports = (\n require('../../module.compiled') as typeof import('../../module.compiled')\n).vendored['contexts'].AppRouterContext\n","module.exports = (\n require('../../module.compiled') as typeof import('../../module.compiled')\n).vendored['contexts'].HooksClientContext\n","module.exports = (\n require('../../module.compiled') as typeof import('../../module.compiled')\n).vendored['contexts'].ServerInsertedHtml\n","module.exports = (\n require('../../module.compiled') as typeof import('../../module.compiled')\n).vendored['react-ssr']!.ReactServerDOMTurbopackClient\n","module.exports = (\n require('../../module.compiled') as typeof import('../../module.compiled')\n).vendored['react-ssr']!.ReactDOM\n","\"use strict\";\n\nfunction _interop_require_default(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n}\nexports._ = _interop_require_default;\n","const workAsyncStorage =\n typeof window === 'undefined'\n ? (\n require('../../server/app-render/work-async-storage.external') as typeof import('../../server/app-render/work-async-storage.external')\n ).workAsyncStorage\n : undefined\n\n// if we are revalidating we want to re-throw the error so the\n// function crashes so we can maintain our previous cache\n// instead of caching the error page\nexport function handleISRError({ error }: { error: any }) {\n if (workAsyncStorage) {\n const store = workAsyncStorage.getStore()\n if (store?.isStaticGeneration) {\n if (error) {\n console.error(error)\n }\n throw error\n }\n }\n}\n","import React from 'react'\n\nexport const errorStyles = {\n container: {\n fontFamily:\n 'system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"',\n height: '100vh',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n card: {\n marginTop: '-32px',\n maxWidth: '325px',\n padding: '32px 28px',\n textAlign: 'left' as const,\n },\n icon: {\n marginBottom: '24px',\n },\n title: {\n fontSize: '24px',\n fontWeight: 500,\n letterSpacing: '-0.02em',\n lineHeight: '32px',\n margin: '0 0 12px 0',\n color: 'var(--next-error-title)',\n },\n message: {\n fontSize: '14px',\n fontWeight: 400,\n lineHeight: '21px',\n margin: '0 0 20px 0',\n color: 'var(--next-error-message)',\n },\n form: {\n margin: 0,\n },\n buttonGroup: {\n display: 'flex',\n gap: '8px',\n alignItems: 'center',\n },\n button: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '32px',\n padding: '0 12px',\n fontSize: '14px',\n fontWeight: 500,\n lineHeight: '20px',\n borderRadius: '6px',\n cursor: 'pointer',\n color: 'var(--next-error-btn-text)',\n background: 'var(--next-error-btn-bg)',\n border: 'var(--next-error-btn-border)',\n },\n buttonSecondary: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '32px',\n padding: '0 12px',\n fontSize: '14px',\n fontWeight: 500,\n lineHeight: '20px',\n borderRadius: '6px',\n cursor: 'pointer',\n color: 'var(--next-error-btn-secondary-text)',\n background: 'var(--next-error-btn-secondary-bg)',\n border: 'var(--next-error-btn-secondary-border)',\n },\n digestFooter: {\n position: 'fixed' as const,\n bottom: '32px',\n left: '0',\n right: '0',\n textAlign: 'center' as const,\n fontFamily:\n 'ui-monospace,SFMono-Regular,\"SF Mono\",Menlo,Consolas,monospace',\n fontSize: '12px',\n lineHeight: '18px',\n fontWeight: 400,\n margin: '0',\n color: 'var(--next-error-digest)',\n },\n} as const\n\nexport const errorThemeCss = `\n:root {\n --next-error-bg: #fff;\n --next-error-text: #171717;\n --next-error-title: #171717;\n --next-error-message: #171717;\n --next-error-digest: #666666;\n --next-error-btn-text: #fff;\n --next-error-btn-bg: #171717;\n --next-error-btn-border: none;\n --next-error-btn-secondary-text: #171717;\n --next-error-btn-secondary-bg: transparent;\n --next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);\n}\n@media (prefers-color-scheme: dark) {\n :root {\n --next-error-bg: #0a0a0a;\n --next-error-text: #ededed;\n --next-error-title: #ededed;\n --next-error-message: #ededed;\n --next-error-digest: #a0a0a0;\n --next-error-btn-text: #0a0a0a;\n --next-error-btn-bg: #ededed;\n --next-error-btn-border: none;\n --next-error-btn-secondary-text: #ededed;\n --next-error-btn-secondary-bg: transparent;\n --next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);\n }\n}\nbody { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\n`.replace(/\\n\\s*/g, '')\n\nexport function WarningIcon() {\n return (\n <svg\n width=\"32\"\n height=\"32\"\n viewBox=\"-0.2 -1.5 32 32\"\n fill=\"none\"\n style={errorStyles.icon}\n >\n <path\n d=\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\"\n fill=\"var(--next-error-title)\"\n />\n </svg>\n )\n}\n","'use client'\n\nimport React from 'react'\nimport { handleISRError } from '../handle-isr-error'\nimport { errorStyles, errorThemeCss, WarningIcon } from './error-styles'\n\nexport type GlobalErrorComponent = React.ComponentType<{\n error: any\n reset: () => void\n unstable_retry: () => void\n}>\n\nfunction DefaultGlobalError({ error }: { error: any }) {\n const digest: string | undefined = error?.digest\n const isServerError = !!digest\n\n const message = isServerError\n ? 'A server error occurred. Reload to try again.'\n : 'Reload to try again, or go back.'\n\n handleISRError({ error })\n\n return (\n <html id=\"__next_error__\">\n <head>\n <style dangerouslySetInnerHTML={{ __html: errorThemeCss }} />\n </head>\n <body>\n <div style={errorStyles.container}>\n <div style={errorStyles.card}>\n <WarningIcon />\n <h1 style={errorStyles.title}>This page couldn&#x2019;t load</h1>\n <p style={errorStyles.message}>{message}</p>\n <div style={errorStyles.buttonGroup}>\n <form style={errorStyles.form}>\n <button type=\"submit\" style={errorStyles.button}>\n Reload\n </button>\n </form>\n {!isServerError && (\n <button\n type=\"button\"\n style={errorStyles.buttonSecondary}\n onClick={() => {\n if (window.history.length > 1) {\n window.history.back()\n } else {\n window.location.href = '/'\n }\n }}\n >\n Back\n </button>\n )}\n </div>\n </div>\n </div>\n {digest && <p style={errorStyles.digestFooter}>ERROR {digest}</p>}\n </body>\n </html>\n )\n}\n\n// Exported so that the import signature in the loaders can be identical to user\n// supplied custom global error signatures.\nexport default DefaultGlobalError\n"],"names":["process","env","NEXT_RUNTIME","module","exports","require","__NEXT_EXPERIMENTAL_REACT","NODE_ENV","TURBOPACK","vendored","ReactJsxRuntime","React","AppRouterContext","HooksClientContext","ServerInsertedHtml","ReactServerDOMTurbopackClient","ReactDOM","_interop_require_default","obj","__esModule","default","_","handleISRError","workAsyncStorage","window","undefined","error","store","getStore","isStaticGeneration","console","WarningIcon","errorStyles","errorThemeCss","container","fontFamily","height","display","alignItems","justifyContent","card","marginTop","maxWidth","padding","textAlign","icon","marginBottom","title","fontSize","fontWeight","letterSpacing","lineHeight","margin","color","message","form","buttonGroup","gap","button","borderRadius","cursor","background","border","buttonSecondary","digestFooter","position","bottom","left","right","replace","svg","width","viewBox","fill","style","path","d","DefaultGlobalError","digest","isServerError","html","id","head","dangerouslySetInnerHTML","__html","body","div","h1","p","type","onClick","history","length","back","location","href"],"mappings":"2kCA0BQG,EAAOC,OAAO,CAAGC,EAAQ,CAAA,CAAA,IAAA,iCC1BjCF,EAAOC,OAAO,CACZC,EAAQ,CAAA,CAAA,IAAA,GACRI,QAAQ,CAAC,YAAY,CAAEC,eAAe,+BCFxCP,EAAOC,OAAO,CACZC,EAAQ,CAAA,CAAA,IAAA,GACRI,QAAQ,CAAC,YAAY,CAAEE,KAAK,8BCF9BR,EAAOC,OAAO,CACZC,EAAQ,CAAA,CAAA,IAAA,GACRI,QAAQ,CAAC,QAAW,CAACG,gBAAgB,+BCFvCT,EAAOC,OAAO,CACZC,EAAQ,CAAA,CAAA,IAAA,GACRI,QAAQ,CAAC,QAAW,CAACI,kBAAkB,8BCFzCV,GAAOC,OAAO,CACZC,EAAQ,CAAA,CAAA,IAAA,GACRI,QAAQ,CAAC,QAAW,CAACK,kBAAkB,+BCFzCX,EAAOC,OAAO,CACZC,EAAQ,CAAA,CAAA,IAAA,GACRI,QAAQ,CAAC,YAAY,CAAEM,6BAA6B,+BCFtDZ,EAAOC,OAAO,CACZC,EAAQ,CAAA,CAAA,IAAA,GACRI,QAAQ,CAAC,YAAY,CAAEO,QAAQ,8BCGjCZ,GAAQiB,CAAC,CAHT,EAGYJ,OAHHA,AAAyBC,CAAG,EACjC,OAAOA,GAAOA,EAAIC,UAAU,CAAGD,EAAM,CAAEE,QAASF,CAAI,CACxD,yGCMgBI,iBAAAA,qCAAAA,KAVhB,IAAMC,EAGElB,EAAQ,CAAA,CAAA,IAAA,GACRkB,MAHN,OAAOC,GAGe,CAMjB,EALDC,KAJc,EASJH,EAAe,OAAEI,CAAK,CAAkB,EACtD,GAAIH,EAAkB,CACpB,IAAMI,EAAQJ,EAAiBK,QAAQ,GACvC,GAAID,GAAOE,mBAIT,CAJ6B,KACzBH,GACFI,IADS,IACDJ,KAAK,CAACA,GAEVA,CAEV,CACF,8SCqGgBK,WAAW,CAAA,kBAAXA,GAvHHC,WAAW,CAAA,kBAAXA,GAuFAC,aAAa,CAAA,kBAAbA,qGAzFK,CAAA,CAAA,IAAA,GAEX,IAAMD,EAAc,CACzBE,UAAW,CACTC,WACE,8FACFC,OAAQ,QACRC,QAAS,OACTC,WAAY,SACZC,eAAgB,QAClB,EACAC,KAAM,CACJC,UAAW,QACXC,SAAU,QACVC,QAAS,YACTC,UAAW,MACb,EACAC,KAAM,CACJC,aAAc,MAChB,EACAC,MAAO,CACLC,SAAU,OACVC,WAAY,IACZC,cAAe,UACfC,WAAY,OACZC,OAAQ,aACRC,MAAO,yBACT,EACAC,QAAS,CACPN,SAAU,OACVC,WAAY,IACZE,WAAY,OACZC,OAAQ,aACRC,MAAO,2BACT,EACAE,KAAM,CACJH,OAAQ,CACV,EACAI,YAAa,CACXnB,QAAS,OACToB,IAAK,MACLnB,WAAY,QACd,EACAoB,OAAQ,CACNrB,QAAS,cACTC,WAAY,SACZC,eAAgB,SAChBH,OAAQ,OACRO,QAAS,SACTK,SAAU,OACVC,WAAY,IACZE,WAAY,OACZQ,aAAc,MACdC,OAAQ,UACRP,MAAO,6BACPQ,WAAY,2BACZC,OAAQ,8BACV,EACAC,gBAAiB,CACf1B,QAAS,cACTC,WAAY,SACZC,eAAgB,SAChBH,OAAQ,OACRO,QAAS,SACTK,SAAU,OACVC,WAAY,IACZE,WAAY,OACZQ,aAAc,MACdC,OAAQ,UACRP,MAAO,uCACPQ,WAAY,qCACZC,OAAQ,wCACV,EACAE,aAAc,CACZC,SAAU,QACVC,OAAQ,OACRC,KAAM,IACNC,MAAO,IACPxB,UAAW,SACXT,WACE,iEACFa,SAAU,OACVG,WAAY,OACZF,WAAY,IACZG,OAAQ,IACRC,MAAO,0BACT,CACF,EAEapB,EAAgB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8B9B,CAAC,CAACoC,OAAO,CAAC,SAAU,IAEb,SAAStC,IACd,MACE,CADF,AACE,EAAA,EAAA,GAAA,EAACuC,EADH,IACGA,CACCC,MAAM,KACNnC,OAAO,KACPoC,QAAQ,kBACRC,KAAK,OACLC,MAAO1C,EAAYa,IAAI,UAEvB,CAAA,EAAA,EAAA,GAAA,EAAC8B,EAAD,KAACA,CACCC,EAAE,igBACFH,KAAK,6BAIb,+TCvEA,OADA,AADA,GAEA,qCAAA,GAD2C,gCA9DzB,CAAA,CAAA,GA6D8D,CA7D9D,WACa,CAAA,CAAA,IAAA,OACyB,CAAA,CAAA,IAAA,GA6DxD,EArDA,SAASI,AAAmB,AAqDbA,CArDenD,OAAK,CAAkB,EACnD,IAAMoD,EAA6BpD,GAAOoD,OACpCC,EAAgB,CAAC,CAACD,EAQxB,MAFAxD,CAEA,AAFAA,EAAAA,EAAAA,OAEA,OAFAA,AAAc,EAAC,CAAEI,OAAM,GAGrB,CAAA,EAAA,EAAA,IAAA,EAACsD,OAAAA,CAAKC,GAAG,2BACP,CAAA,EAAA,EAAA,GAAA,EAACC,OAAAA,UACC,CAAA,EAAA,EAAA,GAAA,EAACR,EAAD,MAACA,CAAMS,wBAAyB,CAAEC,OAAQnD,EAAAA,aAAa,AAAC,MAE1D,CAAA,EAAA,EAAA,IAAA,EAACoD,OAAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAACC,MAAAA,CAAIZ,MAAO1C,EAAAA,WAAW,CAACE,SAAS,UAC/B,CAAA,EAAA,EAAA,IAAA,EAACoD,CAAD,KAACA,CAAIZ,MAAO1C,EAAAA,WAAW,CAACQ,IAAI,WAC1B,CAAA,EAAA,EAAA,GAAA,EAACT,EAAAA,WAAW,CAAA,CAAA,GACZ,CAAA,EAAA,EAAA,GAAA,EAACwD,KAAAA,CAAGb,MAAO1C,EAAAA,WAAW,CAACe,KAAK,UAAE,4BAC9B,CAAA,EAAA,EAAA,GAAA,EAACyC,IAAAA,CAAEd,MAAO1C,EAAAA,WAAW,CAACsB,OAAO,UAhBvByB,CAgB0BzB,CAftC,gDACA,qCAeM,CAAA,EAAA,EAAA,IAAA,EAACgC,MAAAA,CAAIZ,MAAO1C,EAAAA,WAAW,CAACwB,WAAW,WACjC,CAAA,EAAA,EAAA,GAAA,EAACD,OAAAA,CAAKmB,MAAO1C,EAAAA,WAAW,CAACuB,IAAI,UAC3B,CAAA,EAAA,EAAA,GAAA,EAACG,EAAD,OAACA,CAAO+B,KAAK,SAASf,MAAO1C,EAAAA,WAAW,CAAC0B,MAAM,UAAE,aAIlD,CAACqB,GACA,CAAA,EAAA,EAAA,GAAA,EAACrB,IADDqB,KACCrB,CACC+B,KAAK,AAFPV,SAGEL,MAAO1C,EAAAA,WAAW,CAAC+B,eAAe,CAClC2B,QAAS,KACHlE,OAAOmE,OAAO,CAACC,MAAM,CAAG,EAC1BpE,CAD6B,MACtBmE,OAAO,CAACE,IAAI,GAEnBrE,OAAOsE,QAAQ,CAACC,IAAI,CAAG,GAE3B,WACD,iBAORjB,GAAU,GAAA,EAAA,EAAVA,EAAU,EAACU,IAAAA,CAAEd,EAAbI,IAAoB9C,EAAAA,WAAW,CAACgC,YAAY,WAAE,SAAOc,UAI9D","ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11]}
@@ -0,0 +1,70 @@
1
+ module.exports=[72187,a=>{"use strict";a.s(["Dashboard",()=>b]);let b=(0,a.i(11857).registerClientReference)(function(){throw Error("Attempted to call Dashboard() from the server but Dashboard is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/src/components/Dashboard.tsx <module evaluation>","Dashboard")},92848,a=>{"use strict";a.s(["Dashboard",()=>b]);let b=(0,a.i(11857).registerClientReference)(function(){throw Error("Attempted to call Dashboard() from the server but Dashboard is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/src/components/Dashboard.tsx","Dashboard")},22671,a=>{"use strict";a.i(72187);var b=a.i(92848);a.n(b)},16426,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"warnOnce",{enumerable:!0,get:function(){return d}});let d=a=>{}},29945,(a,b,c)=>{"use strict";let d;Object.defineProperty(c,"__esModule",{value:!0});var e={getAssetToken:function(){return i},getAssetTokenQuery:function(){return j},getDeploymentId:function(){return g},getDeploymentIdQuery:function(){return h}};for(var f in e)Object.defineProperty(c,f,{enumerable:!0,get:e[f]});function g(){return d}function h(a=!1){return d?`${a?"&":"?"}dpl=${d}`:""}function i(){return!1}function j(a=!1){return""}d=void 0},1359,(a,b,c)=>{"use strict";function d({widthInt:a,heightInt:b,blurWidth:c,blurHeight:e,blurDataURL:f,objectFit:g}){let h=c?40*c:a,i=e?40*e:b,j=h&&i?`viewBox='0 0 ${h} ${i}'`:"";return`%3Csvg xmlns='http://www.w3.org/2000/svg' ${j}%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeColorMatrix values='1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 100 -1' result='s'/%3E%3CfeFlood x='0' y='0' width='100%25' height='100%25'/%3E%3CfeComposite operator='out' in='s'/%3E%3CfeComposite in2='SourceGraphic'/%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3C/filter%3E%3Cimage width='100%25' height='100%25' x='0' y='0' preserveAspectRatio='${j?"none":"contain"===g?"xMidYMid":"cover"===g?"xMidYMid slice":"none"}' style='filter: url(%23b);' href='${f}'/%3E%3C/svg%3E`}Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"getImageBlurSvg",{enumerable:!0,get:function(){return d}})},53549,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0});var d={VALID_LOADERS:function(){return f},imageConfigDefault:function(){return g}};for(var e in d)Object.defineProperty(c,e,{enumerable:!0,get:d[e]});let f=["default","imgix","cloudinary","akamai","custom"],g={deviceSizes:[640,750,828,1080,1200,1920,2048,3840],imageSizes:[32,48,64,96,128,256,384],path:"/_next/image",loader:"default",loaderFile:"",domains:[],disableStaticImages:!1,minimumCacheTTL:14400,formats:["image/webp"],maximumDiskCacheSize:void 0,maximumRedirects:3,maximumResponseBody:5e7,dangerouslyAllowLocalIP:!1,dangerouslyAllowSVG:!1,contentSecurityPolicy:"script-src 'none'; frame-src 'none'; sandbox;",contentDispositionType:"attachment",localPatterns:void 0,remotePatterns:[],qualities:[75],unoptimized:!1,customCacheHandler:!1}},87713,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"getImgProps",{enumerable:!0,get:function(){return j}}),a.r(16426);let d=a.r(29945),e=a.r(1359),f=a.r(53549),g=["-moz-initial","fill","none","scale-down",void 0];function h(a){return void 0!==a.default}function i(a){return void 0===a?a:"number"==typeof a?Number.isFinite(a)?a:NaN:"string"==typeof a&&/^[0-9]+$/.test(a)?parseInt(a,10):NaN}function j({src:a,sizes:b,unoptimized:c=!1,priority:k=!1,preload:l=!1,loading:m,className:n,quality:o,width:p,height:q,fill:r=!1,style:s,overrideSrc:t,onLoad:u,onLoadingComplete:v,placeholder:w="empty",blurDataURL:x,fetchPriority:y,decoding:z="async",layout:A,objectFit:B,objectPosition:C,lazyBoundary:D,lazyRoot:E,...F},G){var H;let I,J,K,{imgConf:L,showAltText:M,blurComplete:N,defaultLoader:O}=G,P=L||f.imageConfigDefault;if("allSizes"in P)I=P;else{let a=[...P.deviceSizes,...P.imageSizes].sort((a,b)=>a-b),b=P.deviceSizes.sort((a,b)=>a-b),c=P.qualities?.sort((a,b)=>a-b);I={...P,allSizes:a,deviceSizes:b,qualities:c}}if(void 0===O)throw Object.defineProperty(Error("images.loaderFile detected but the file is missing default export.\nRead more: https://nextjs.org/docs/messages/invalid-images-config"),"__NEXT_ERROR_CODE",{value:"E163",enumerable:!1,configurable:!0});let Q=F.loader||O;delete F.loader,delete F.srcSet;let R="__next_img_default"in Q;if(R){if("custom"===I.loader)throw Object.defineProperty(Error(`Image with src "${a}" is missing "loader" prop.
2
+ Read more: https://nextjs.org/docs/messages/next-image-missing-loader`),"__NEXT_ERROR_CODE",{value:"E252",enumerable:!1,configurable:!0})}else{let a=Q;Q=b=>{let{config:c,...d}=b;return a(d)}}if(A){"fill"===A&&(r=!0);let a={intrinsic:{maxWidth:"100%",height:"auto"},responsive:{width:"100%",height:"auto"}}[A];a&&(s={...s,...a});let c={responsive:"100vw",fill:"100vw"}[A];c&&!b&&(b=c)}let S="",T=i(p),U=i(q);if((H=a)&&"object"==typeof H&&(h(H)||void 0!==H.src)){let b=h(a)?a.default:a;if(!b.src)throw Object.defineProperty(Error(`An object should only be passed to the image component src parameter if it comes from a static image import. It must include src. Received ${JSON.stringify(b)}`),"__NEXT_ERROR_CODE",{value:"E460",enumerable:!1,configurable:!0});if(!b.height||!b.width)throw Object.defineProperty(Error(`An object should only be passed to the image component src parameter if it comes from a static image import. It must include height and width. Received ${JSON.stringify(b)}`),"__NEXT_ERROR_CODE",{value:"E48",enumerable:!1,configurable:!0});if(J=b.blurWidth,K=b.blurHeight,x=x||b.blurDataURL,S=b.src,!r)if(T||U){if(T&&!U){let a=T/b.width;U=Math.round(b.height*a)}else if(!T&&U){let a=U/b.height;T=Math.round(b.width*a)}}else T=b.width,U=b.height}let V=!k&&!l&&("lazy"===m||void 0===m);(!(a="string"==typeof a?a:S)||a.startsWith("data:")||a.startsWith("blob:"))&&(c=!0,V=!1),I.unoptimized&&(c=!0),R&&!I.dangerouslyAllowSVG&&a.split("?",1)[0].endsWith(".svg")&&(c=!0);let W=i(o),X=Object.assign(r?{position:"absolute",height:"100%",width:"100%",left:0,top:0,right:0,bottom:0,objectFit:B,objectPosition:C}:{},M?{}:{color:"transparent"},s),Y=N||"empty"===w?null:"blur"===w?`url("data:image/svg+xml;charset=utf-8,${(0,e.getImageBlurSvg)({widthInt:T,heightInt:U,blurWidth:J,blurHeight:K,blurDataURL:x||"",objectFit:X.objectFit})}")`:`url("${w}")`,Z=g.includes(X.objectFit)?"fill"===X.objectFit?"100% 100%":"cover":X.objectFit,$=Y?{backgroundSize:Z,backgroundPosition:X.objectPosition||"50% 50%",backgroundRepeat:"no-repeat",backgroundImage:Y}:{},_=function({config:a,src:b,unoptimized:c,width:e,quality:f,sizes:g,loader:h}){if(c){if(b.startsWith("/")&&!b.startsWith("//")){let a=(0,d.getDeploymentId)();if(a){let c=b.indexOf("?");if(-1!==c){let d=new URLSearchParams(b.slice(c+1));d.get("dpl")||(d.append("dpl",a),b=b.slice(0,c)+"?"+d.toString())}else b+=`?dpl=${a}`}}return{src:b,srcSet:void 0,sizes:void 0}}let{widths:i,kind:j}=function({deviceSizes:a,allSizes:b},c,d){if(d){let c=/(^|\s)(1?\d?\d)vw/g,e=[];for(let a;a=c.exec(d);)e.push(parseInt(a[2]));if(e.length){let c=.01*Math.min(...e);return{widths:b.filter(b=>b>=a[0]*c),kind:"w"}}return{widths:b,kind:"w"}}return"number"!=typeof c?{widths:a,kind:"w"}:{widths:[...new Set([c,2*c].map(a=>b.find(b=>b>=a)||b[b.length-1]))],kind:"x"}}(a,e,g),k=i.length-1;return{sizes:g||"w"!==j?g:"100vw",srcSet:i.map((c,d)=>`${h({config:a,src:b,quality:f,width:c})} ${"w"===j?c:d+1}${j}`).join(", "),src:h({config:a,src:b,quality:f,width:i[k]})}}({config:I,src:a,unoptimized:c,width:T,quality:W,sizes:b,loader:Q}),aa=V?"lazy":m;return{props:{...F,loading:aa,fetchPriority:y,width:T,height:U,decoding:z,className:n,style:{...X,...$},sizes:_.sizes,srcSet:_.srcSet,src:t||_.src},meta:{unoptimized:c,preload:l||k,placeholder:w,fill:r}}}},42377,(a,b,c)=>{let{createClientModuleProxy:d}=a.r(11857);a.n(d("[project]/node_modules/next/dist/client/image-component.js <module evaluation>"))},43489,(a,b,c)=>{let{createClientModuleProxy:d}=a.r(11857);a.n(d("[project]/node_modules/next/dist/client/image-component.js"))},18409,a=>{"use strict";a.i(42377);var b=a.i(43489);a.n(b)},53200,(a,b,c)=>{"use strict";function d(a,b){let c=a||75;return b?.qualities?.length?b.qualities.reduce((a,b)=>Math.abs(b-c)<Math.abs(a-c)?b:a,b.qualities[0]):c}Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"findClosestQuality",{enumerable:!0,get:function(){return d}})},37763,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"default",{enumerable:!0,get:function(){return g}});let d=a.r(53200),e=a.r(29945);function f({config:a,src:b,width:c,quality:g}){let h=(0,e.getDeploymentId)();if(b.startsWith("/")&&!b.startsWith("//")){let a=b.indexOf("?");if(-1!==a){let c=new URLSearchParams(b.slice(a+1)),d=c.get("dpl");if(d){h=d,c.delete("dpl");let e=c.toString();b=b.slice(0,a)+(e?"?"+e:"")}}}if(b.startsWith("/")&&b.includes("?")&&a.localPatterns?.length===1&&"**"===a.localPatterns[0].pathname&&""===a.localPatterns[0].search)throw Object.defineProperty(Error(`Image with src "${b}" is using a query string which is not configured in images.localPatterns.
3
+ Read more: https://nextjs.org/docs/messages/next-image-unconfigured-localpatterns`),"__NEXT_ERROR_CODE",{value:"E871",enumerable:!1,configurable:!0});let i=(0,d.findClosestQuality)(g,a);return`${a.path}?url=${encodeURIComponent(b)}&w=${c}&q=${i}${b.startsWith("/")&&h?`&dpl=${h}`:""}`}f.__next_img_default=!0;let g=f},50858,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0});var d={default:function(){return k},getImageProps:function(){return j}};for(var e in d)Object.defineProperty(c,e,{enumerable:!0,get:d[e]});let f=a.r(71029),g=a.r(87713),h=a.r(18409),i=f._(a.r(37763));function j(a){let{props:b}=(0,g.getImgProps)(a,{defaultLoader:i.default,imgConf:{deviceSizes:[640,750,828,1080,1200,1920,2048,3840],imageSizes:[32,48,64,96,128,256,384],qualities:[75],path:"/_next/image",loader:"default",dangerouslyAllowSVG:!1,unoptimized:!1}});for(let[a,c]of Object.entries(b))void 0===c&&delete b[a];return{props:b}}let k=h.Image},3236,(a,b,c)=>{b.exports=a.r(50858)},60168,a=>{"use strict";var b=a.i(7997),c=a.i(61469),d=a.i(22671),e=a.i(95936);function f(){let a=(0,c.getDb)().prepare(`
4
+ SELECT DATE(started_at / 1000, 'unixepoch', 'localtime') AS day,
5
+ COUNT(*) AS n
6
+ FROM sessions
7
+ GROUP BY day
8
+ ORDER BY day ASC
9
+ `).all(),b=new Map(a.map(a=>[a.day,a.n])),d=[],e=new Date;for(let a=83;a>=0;a--){let c=new Date(e);c.setDate(c.getDate()-a);let f=c.toISOString().slice(0,10);d.push({date:f,count:b.get(f)??0})}let f=0;for(let a=0;a<365;a++){let c=new Date(e);c.setDate(c.getDate()-a);let d=c.toISOString().slice(0,10);if(b.has(d))f++;else break}let g=0,h=0,i=a.map(a=>a.day).sort();for(let a=0;a<i.length;a++){if(0===a){h=1;continue}let b=new Date(i[a-1]);(h=1==(new Date(i[a]).getTime()-b.getTime())/864e5?h+1:1)>g&&(g=h)}return f>g&&(g=f),{current:f,longest:g,totalDays:b.size,heatmap:d}}function g(a=168,b,d){let e=Date.now()-36e5*a,f=b&&null!=d?`SELECT captured_at AS ts, window_5h_used_pct AS pct5h, window_weekly_used_pct AS pctWeekly
10
+ FROM usage_snapshots WHERE captured_at > ? AND source = ? AND account_id = ? ORDER BY captured_at ASC`:b?`SELECT captured_at AS ts, window_5h_used_pct AS pct5h, window_weekly_used_pct AS pctWeekly
11
+ FROM usage_snapshots WHERE captured_at > ? AND source = ? ORDER BY captured_at ASC`:`SELECT captured_at AS ts, window_5h_used_pct AS pct5h, window_weekly_used_pct AS pctWeekly
12
+ FROM usage_snapshots WHERE captured_at > ? ORDER BY captured_at ASC`,h=b&&null!=d?[e,b,d]:b?[e,b]:[e];return(0,c.getDb)().prepare(f).all(...h)}function h(){let a=(0,c.getDb)(),b=a.prepare(`
13
+ SELECT COALESCE(SUM(session_max), 0) AS total
14
+ FROM (
15
+ SELECT MAX(CAST(json_extract(raw_output, '$.cost.total_cost_usd') AS REAL)) AS session_max
16
+ FROM usage_snapshots
17
+ WHERE source = 'statusline'
18
+ AND json_extract(raw_output, '$.cost.total_cost_usd') IS NOT NULL
19
+ GROUP BY json_extract(raw_output, '$.session_id')
20
+ )
21
+ `).get().total,d=a.prepare(`
22
+ SELECT COALESCE(SUM(tokens_used), 0) AS total
23
+ FROM sessions WHERE tool = 'codex' AND tokens_used IS NOT NULL
24
+ `).get().total,e=Date.now()-12096e5,f=a.prepare(`
25
+ SELECT DATE(captured_at/1000, 'unixepoch', 'localtime') AS day,
26
+ json_extract(raw_output, '$.session_id') AS sid,
27
+ MAX(CAST(json_extract(raw_output, '$.cost.total_cost_usd') AS REAL)) AS cost
28
+ FROM usage_snapshots
29
+ WHERE source = 'statusline'
30
+ AND captured_at > ?
31
+ AND json_extract(raw_output, '$.cost.total_cost_usd') IS NOT NULL
32
+ GROUP BY day, sid
33
+ `).all(e),g=new Map;for(let a of f)g.set(a.day,(g.get(a.day)??0)+(a.cost??0));let h=new Map(a.prepare(`
34
+ SELECT DATE(started_at/1000, 'unixepoch', 'localtime') AS day,
35
+ SUM(tokens_used) AS tokens
36
+ FROM sessions
37
+ WHERE tool = 'codex' AND tokens_used IS NOT NULL AND started_at > ?
38
+ GROUP BY day
39
+ `).all(e).map(a=>[a.day,a.tokens])),i=[],j=new Date;for(let a=13;a>=0;a--){let b=new Date(j);b.setDate(b.getDate()-a);let c=b.toISOString().slice(0,10);i.push({date:c,claudeUsd:g.get(c)??0,codexTokens:h.get(c)??0})}return{claudeTotalUsd:b,codexTotalTokens:d,daily:i}}var i=a.i(1737),j=a.i(33829),k=a.i(3236);let l=[["Usage windows","Claude Code and Codex 5h / 7-day quota snapshots."],["Work history","Sessions, projects, activity heatmap, spend, and tokens."],["macOS helper","Floating meter and optional voice alerts when agents finish."]],m=["~/.claude/projects/**/*.jsonl","~/.codex/state_5.sqlite","Cursor workspaceStorage"];function n(){return(0,b.jsxs)("main",{className:"min-h-screen bg-zinc-950 text-zinc-100",children:[(0,b.jsxs)("section",{className:"mx-auto grid max-w-6xl items-center gap-10 px-6 pb-8 pt-10 lg:min-h-[78vh] lg:grid-cols-[0.86fr_1.14fr]",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("p",{className:"mb-3 text-xs font-medium uppercase tracking-[0.24em] text-violet-300",children:"local-first AI coding meter"}),(0,b.jsx)("h1",{className:"text-4xl font-semibold tracking-tight text-zinc-50 sm:text-5xl",children:"Vibemeter"}),(0,b.jsx)("p",{className:"mt-4 max-w-xl text-sm leading-7 text-zinc-400",children:"Track Claude Code, Codex, and Cursor usage from local files. Dashboard, macOS floating meter, and voice notifications when long-running agents finish."}),(0,b.jsxs)("ul",{className:"mt-5 space-y-2 text-sm text-zinc-400",children:[(0,b.jsxs)("li",{children:[(0,b.jsx)("span",{className:"text-zinc-200",children:"No cloud:"})," reads files already on your disk."]}),(0,b.jsxs)("li",{children:[(0,b.jsx)("span",{className:"text-zinc-200",children:"Quota view:"})," 5h / 7-day windows for Claude Code and Codex."]}),(0,b.jsxs)("li",{children:[(0,b.jsx)("span",{className:"text-zinc-200",children:"macOS helper:"})," floating meter plus optional spoken completion alerts."]})]}),(0,b.jsxs)("div",{className:"mt-7 rounded-lg border border-zinc-800 bg-zinc-900 p-4 font-mono",children:[(0,b.jsx)("p",{className:"mb-2 text-xs uppercase tracking-wider text-zinc-500",children:"one-command install"}),(0,b.jsx)("code",{className:"block overflow-x-auto whitespace-nowrap rounded-md bg-zinc-950 px-3 py-3 text-sm text-zinc-100",children:"curl -fsSL https://vibemeter.siney.top/install.sh | bash"})]}),(0,b.jsxs)("div",{className:"mt-5 flex flex-wrap gap-3 text-xs text-zinc-400",children:[(0,b.jsx)("a",{className:"rounded-full border border-violet-500/40 bg-violet-500/10 px-4 py-2 text-violet-100 transition-colors hover:bg-violet-500/20",href:"/install.sh",children:"install.sh"}),(0,b.jsx)("a",{className:"rounded-full border border-zinc-700 px-4 py-2 transition-colors hover:border-zinc-500 hover:text-zinc-100",href:"https://www.npmjs.com/package/@hirra/vibemeter",children:"npm"})]})]}),(0,b.jsxs)("div",{className:"space-y-4",children:[(0,b.jsx)(k.default,{src:"/float-expanded.png",alt:"Vibemeter expanded floating meter",width:520,height:360,className:"mx-auto block h-auto w-full max-w-[420px] rounded-lg border border-zinc-800 bg-zinc-900 shadow-2xl shadow-black/50",priority:!0}),(0,b.jsx)(k.default,{src:"/float-collapsed.png",alt:"Vibemeter collapsed progress bar",width:520,height:260,className:"mx-auto block h-auto w-full max-w-[420px] rounded-lg border border-zinc-800 bg-zinc-900"})]})]}),(0,b.jsxs)("section",{className:"mx-auto max-w-6xl px-6 pb-14",children:[(0,b.jsx)("div",{className:"grid gap-3 md:grid-cols-3",children:l.map(([a,c])=>(0,b.jsxs)("div",{className:"rounded-lg border border-zinc-800 bg-zinc-900 px-4 py-4",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-zinc-100",children:a}),(0,b.jsx)("p",{className:"mt-2 text-xs leading-6 text-zinc-500",children:c})]},a))}),(0,b.jsxs)("div",{className:"mt-4 grid gap-4 lg:grid-cols-[1fr_0.72fr]",children:[(0,b.jsxs)("div",{className:"rounded-lg border border-zinc-800 bg-zinc-900 p-5",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-zinc-100",children:"Data stays local"}),(0,b.jsx)("p",{className:"mt-2 text-xs leading-6 text-zinc-500",children:"Vibemeter reads the files your tools already write. No account, no telemetry, no cloud database."}),(0,b.jsx)("div",{className:"mt-4 flex flex-wrap gap-2",children:m.map(a=>(0,b.jsx)("code",{className:"rounded-md border border-zinc-800 bg-zinc-950 px-2.5 py-1.5 text-[11px] text-zinc-400",children:a},a))})]}),(0,b.jsxs)("div",{className:"rounded-lg border border-zinc-800 bg-zinc-900 p-5",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-zinc-100",children:"Voice notifications"}),(0,b.jsx)("p",{className:"mt-2 text-xs leading-6 text-zinc-500",children:"On macOS, Vibemeter can install Claude Code hooks and Codex notify config, then speak a short completion alert."}),(0,b.jsx)("a",{className:"mt-4 inline-block rounded-md border border-zinc-700 px-3 py-2 text-xs text-zinc-300 transition-colors hover:border-zinc-500 hover:text-zinc-100",href:"/settings",children:"Settings"})]})]})]})]})}var o=a.i(60447),p=a.i(66469),q=a.i(18391);let r=["kanban-board","pomodoro","weather-widget","recipe-box","mood-journal","habit-tracker","flashcards","spelling-bee","budget-app","markdown-blog","todo-cli","music-player","photo-gallery","note-vault","expense-split"],s=["add dark mode toggle","refactor router boundaries","fix mobile layout overflow","wire up websocket reconnect","optimize image lazy loading","migrate to server components","tighten type signatures","investigate flaky e2e tests","add keyboard shortcuts","improve empty states"],t=new Set(["all","claude-code","codex","cursor"]);async function u({searchParams:a}){let k,l,m,v,w,x,y,z,A,B;if("marketing"===process.env.VIBEMETER_SITE)return(0,b.jsx)(n,{});let C=await (0,p.getServerLocale)(),D=await a,E="1"===D.demo||"true"===D.demo,F=t.has(D.agent??"")?D.agent:"all",G=(0,c.getDb)(),H=await (0,i.getCodexAccounts)(),I=D.codexAccount??null,J=I&&H.some(a=>a.accountId===I)?I:null,K=G.prepare(`
40
+ SELECT id, tool, started_at, ended_at, cwd, confidence, summary, ai_title, tags
41
+ FROM sessions
42
+ ORDER BY started_at DESC
43
+ `).all();if(E){var L;let a;L=K,a=new Map,K=function(a){let b=Date.now(),c=[];for(let a=0;a<160;a++){let d=r[a%r.length],e=b-(2*a+1)*27e5-36e5*Math.random(),f=(15+80*Math.random())*6e4;c.push({id:`demo-cursor-${a}`,tool:"cursor",started_at:Math.round(e),ended_at:Math.round(e+f),cwd:`/Users/demo/code/${d}`,confidence:"high",summary:null,ai_title:s[a%s.length],tags:null})}return[...a,...c].sort((a,b)=>b.started_at-a.started_at)}(K=L.map((b,c)=>{if(!b.cwd)return b;let d=b.cwd.split("/").filter(Boolean).pop()??"";return a.has(d)||a.set(d,r[a.size%r.length]),{...b,cwd:`/Users/demo/code/${a.get(d)}`,ai_title:b.ai_title?s[c%s.length]:null}}))}let M=(0,j.getLatestUsageSnapshot)(G,"statusline"),N=J?(0,j.getLatestUsageSnapshot)(G,"codex",J):(0,j.getLatestUsageSnapshot)(G,"codex"),O=a=>a?{window_5h_used_pct:a.window_5h_used_pct,window_weekly_used_pct:a.window_weekly_used_pct,reset_at_5h:a.reset_at_5h,reset_at_weekly:a.reset_at_weekly}:null,P=function(a=0){let b=new Date;b.setDate(b.getDate()+a),b.setHours(0,0,0,0);let d=b.getTime(),e=d+864e5,f=(0,c.getDb)().prepare(`
44
+ SELECT id, tool, cwd, started_at, ended_at, ai_title
45
+ FROM sessions
46
+ WHERE started_at < ? AND COALESCE(ended_at, started_at + 60000) > ?
47
+ ORDER BY started_at ASC
48
+ `).all(e,d);return{dateLabel:b.toISOString().slice(0,10),sessions:f.map(a=>({id:a.id,tool:a.tool,project:a.cwd?.split("/").filter(Boolean).pop()??"—",startMs:a.started_at,endMs:a.ended_at??Math.min(Date.now(),e),aiTitle:a.ai_title}))}}(0);if(E){let a=new Date().setHours(0,0,0,0);P={dateLabel:new Date().toISOString().slice(0,10),sessions:[{id:"demo-t1",tool:"cursor",project:"kanban-board",startMs:a+324e5,endMs:a+36e6+18e5,aiTitle:"add drag-drop sorting"},{id:"demo-t2",tool:"claude-code",project:"note-vault",startMs:a+36e6+27e5,endMs:a+432e5+9e5,aiTitle:"wire markdown export"},{id:"demo-t3",tool:"cursor",project:"pomodoro",startMs:a+468e5,endMs:a+504e5+3e6,aiTitle:"fix timer drift"},{id:"demo-t4",tool:"codex",project:"recipe-box",startMs:a+54e6,endMs:a+612e5,aiTitle:"design ingredient parser"},{id:"demo-t5",tool:"cursor",project:"habit-tracker",startMs:a+612e5+6e5,endMs:a+684e5,aiTitle:"streak animation polish"},{id:"demo-t6",tool:"cursor",project:"budget-app",startMs:a+72e6,endMs:a+756e5+18e5,aiTitle:"csv import wizard"}]}}return(0,b.jsx)("div",{className:"min-h-screen bg-zinc-950 text-zinc-100 font-mono",children:(0,b.jsxs)("div",{className:"max-w-6xl mx-auto px-6 py-8",children:[(0,b.jsxs)("div",{className:"mb-6 flex items-start justify-between gap-4",children:[(0,b.jsxs)("div",{children:[(0,b.jsxs)("h1",{className:"text-xl font-semibold tracking-tight text-zinc-100",children:[(0,b.jsx)("span",{className:"text-violet-400",children:"Vibe"}),"meter"]}),(0,b.jsx)("p",{className:"text-zinc-600 text-xs mt-1",children:(0,q.t)(C,"header.tagline")})]}),(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)(o.LocaleSwitcher,{}),(0,b.jsx)(e.default,{href:"/settings",className:"rounded-md border border-zinc-800 px-3 py-2 text-xs text-zinc-400 transition-colors hover:border-zinc-600 hover:text-zinc-100",children:(0,q.t)(C,"common.settings")}),(0,b.jsx)(e.default,{href:"/admin",className:"rounded-md border border-zinc-800 px-3 py-2 text-xs text-zinc-400 transition-colors hover:border-zinc-600 hover:text-zinc-100",children:(0,q.t)(C,"common.admin")})]})]}),(0,b.jsx)(d.Dashboard,{sessions:K,streak:f(),allBurndown:g(168),claudeBurndown:g(168,"statusline"),codexBurndown:g(168,"codex",J),hotspots:function(a=10){return(0,c.getDb)().prepare(`
49
+ SELECT path,
50
+ COUNT(*) AS changes,
51
+ COUNT(DISTINCT session_id) AS sessions
52
+ FROM file_changes
53
+ GROUP BY path
54
+ ORDER BY changes DESC
55
+ LIMIT ?
56
+ `).all(a)}(8),spending:h(),timeline:P,achievements:(l=(k=(0,c.getDb)()).prepare("SELECT COUNT(*) AS n FROM sessions").get().n,m=f().longest,v=h(),w=k.prepare(`
57
+ SELECT COALESCE(MAX(COALESCE(ended_at, started_at) - started_at), 0) AS ms FROM sessions
58
+ `).get().ms,x=k.prepare(`
59
+ SELECT COUNT(DISTINCT cwd) AS n FROM sessions WHERE cwd IS NOT NULL
60
+ `).get().n,y=k.prepare(`
61
+ SELECT COUNT(*) AS n FROM sessions
62
+ WHERE CAST(strftime('%H', started_at/1000, 'unixepoch', 'localtime') AS INT) >= 23
63
+ OR CAST(strftime('%H', started_at/1000, 'unixepoch', 'localtime') AS INT) < 4
64
+ `).get().n,z=k.prepare(`
65
+ SELECT COUNT(*) AS n FROM sessions
66
+ WHERE CAST(strftime('%H', started_at/1000, 'unixepoch', 'localtime') AS INT) >= 4
67
+ AND CAST(strftime('%H', started_at/1000, 'unixepoch', 'localtime') AS INT) < 7
68
+ `).get().n,A=k.prepare("SELECT COUNT(DISTINCT tool) AS n FROM sessions").get().n,[{id:"sessions-100",title:"百战不殆",description:"100 sessions logged",unlocked:l>=100,progress:(B=(a,b)=>({current:Math.min(a,b),target:b}))(l,100)},{id:"sessions-500",title:"已成习惯",description:"500 sessions logged",unlocked:l>=500,progress:B(l,500)},{id:"sessions-1000",title:"千锤百炼",description:"1000 sessions logged",unlocked:l>=1e3,progress:B(l,1e3)},{id:"streak-7",title:"一周连击",description:"7-day coding streak",unlocked:m>=7,progress:B(m,7)},{id:"streak-30",title:"月度坚持",description:"30-day coding streak",unlocked:m>=30,progress:B(m,30)},{id:"spend-10",title:"小试牛刀",description:"Claude spend $10+",unlocked:v.claudeTotalUsd>=10,progress:B(v.claudeTotalUsd,10)},{id:"spend-100",title:"挥金如土",description:"Claude spend $100+",unlocked:v.claudeTotalUsd>=100,progress:B(v.claudeTotalUsd,100)},{id:"tokens-100m",title:"Token 富翁",description:"100M Codex tokens",unlocked:v.codexTotalTokens>=1e8,progress:B(v.codexTotalTokens,1e8)},{id:"tokens-1b",title:"Token 大户",description:"1B Codex tokens",unlocked:v.codexTotalTokens>=1e9,progress:B(v.codexTotalTokens,1e9)},{id:"marathon-4h",title:"马拉松选手",description:"Single session 4h+",unlocked:w>=144e5,progress:B(w,144e5)},{id:"marathon-8h",title:"通宵达旦",description:"Single session 8h+",unlocked:w>=288e5,progress:B(w,288e5)},{id:"projects-10",title:"博学多才",description:"Worked on 10+ projects",unlocked:x>=10,progress:B(x,10)},{id:"projects-30",title:"杂家",description:"Worked on 30+ projects",unlocked:x>=30,progress:B(x,30)},{id:"night-owl",title:"夜猫子",description:"Past-midnight sessions 10+",unlocked:y>=10,progress:B(y,10)},{id:"early-bird",title:"晨型人",description:"Pre-7am sessions 5+",unlocked:z>=5,progress:B(z,5)},{id:"multi-tool",title:"多面手",description:"Used 3 different tools",unlocked:A>=3,progress:B(A,3)}]),claudeUsage:O(M),codexUsage:O(N),codexAccounts:H,selectedCodexAccountId:J,initialToolFilter:F})]})})}a.s(["default",0,u,"dynamic",0,"force-dynamic"],60168)},28004,a=>{a.n(a.i(60168))}];
69
+
70
+ //# sourceMappingURL=_0-9j34y._.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/Dashboard.tsx/__nextjs-internal-proxy.mjs","../../../../node_modules/next/src/shared/lib/utils/warn-once.ts","../../../../node_modules/next/src/shared/lib/deployment-id.ts","../../../../node_modules/next/src/shared/lib/image-blur-svg.ts","../../../../node_modules/next/src/shared/lib/image-config.ts","../../../../node_modules/next/src/shared/lib/get-img-props.ts","../../../../node_modules/next/dist/client/image-component.js/__nextjs-internal-proxy.cjs","../../../../node_modules/next/src/client/image-component.tsx","../../../../node_modules/next/src/shared/lib/find-closest-quality.ts","../../../../node_modules/next/src/shared/lib/image-loader.ts","../../../../node_modules/next/src/shared/lib/image-external.tsx","../../../../node_modules/next/image.js","../../../../src/app/page.tsx","../../../../src/lib/stats.ts","../../../../src/components/MarketingPage.tsx"],"sourcesContent":["// This file is generated by next-core EcmascriptClientReferenceModule.\nimport { registerClientReference } from \"react-server-dom-turbopack/server\";\nexport const Dashboard = registerClientReference(\n function() { throw new Error(\"Attempted to call Dashboard() from the server but Dashboard is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.\"); },\n \"[project]/src/components/Dashboard.tsx\",\n \"Dashboard\",\n);\n","let warnOnce = (_: string) => {}\nif (process.env.NODE_ENV !== 'production') {\n const warnings = new Set<string>()\n warnOnce = (msg: string) => {\n if (!warnings.has(msg)) {\n console.warn(msg)\n }\n warnings.add(msg)\n }\n}\n\nexport { warnOnce }\n","let deploymentId: string | undefined\n\nif (typeof window !== 'undefined') {\n deploymentId = document.documentElement.dataset.dplId\n // Immediately remove the attribute to prevent hydration errors (the dplId was inserted into the\n // HTML only), React isn't aware of it at all.\n delete document.documentElement.dataset.dplId\n} else {\n // Client side: replaced with globalThis.NEXT_DEPLOYMENT_ID\n // Server side: left as is or replaced with a string or replaced with false\n deploymentId = process.env.NEXT_DEPLOYMENT_ID || undefined\n}\n\nexport function getDeploymentId(): string | undefined {\n return deploymentId\n}\n\nexport function getDeploymentIdQuery(ampersand = false): string {\n let id = getDeploymentId()\n if (id) {\n return `${ampersand ? '&' : '?'}dpl=${id}`\n }\n return ''\n}\n\nexport function getAssetToken(): string | undefined {\n return (\n process.env.NEXT_IMMUTABLE_ASSET_TOKEN || process.env.NEXT_DEPLOYMENT_ID\n )\n}\n\nexport function getAssetTokenQuery(ampersand = false): string {\n let id = getAssetToken()\n if (id) {\n return `${ampersand ? '&' : '?'}dpl=${id}`\n }\n return ''\n}\n","/**\n * A shared function, used on both client and server, to generate a SVG blur placeholder.\n */\nexport function getImageBlurSvg({\n widthInt,\n heightInt,\n blurWidth,\n blurHeight,\n blurDataURL,\n objectFit,\n}: {\n widthInt?: number\n heightInt?: number\n blurWidth?: number\n blurHeight?: number\n blurDataURL: string\n objectFit?: string\n}): string {\n const std = 20\n const svgWidth = blurWidth ? blurWidth * 40 : widthInt\n const svgHeight = blurHeight ? blurHeight * 40 : heightInt\n\n const viewBox =\n svgWidth && svgHeight ? `viewBox='0 0 ${svgWidth} ${svgHeight}'` : ''\n const preserveAspectRatio = viewBox\n ? 'none'\n : objectFit === 'contain'\n ? 'xMidYMid'\n : objectFit === 'cover'\n ? 'xMidYMid slice'\n : 'none'\n\n return `%3Csvg xmlns='http://www.w3.org/2000/svg' ${viewBox}%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='${std}'/%3E%3CfeColorMatrix values='1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 100 -1' result='s'/%3E%3CfeFlood x='0' y='0' width='100%25' height='100%25'/%3E%3CfeComposite operator='out' in='s'/%3E%3CfeComposite in2='SourceGraphic'/%3E%3CfeGaussianBlur stdDeviation='${std}'/%3E%3C/filter%3E%3Cimage width='100%25' height='100%25' x='0' y='0' preserveAspectRatio='${preserveAspectRatio}' style='filter: url(%23b);' href='${blurDataURL}'/%3E%3C/svg%3E`\n}\n","export const VALID_LOADERS = [\n 'default',\n 'imgix',\n 'cloudinary',\n 'akamai',\n 'custom',\n] as const\n\nexport type LoaderValue = (typeof VALID_LOADERS)[number]\n\nexport type ImageLoaderProps = {\n src: string\n width: number\n quality?: number\n}\n\nexport type ImageLoaderPropsWithConfig = ImageLoaderProps & {\n config: Readonly<ImageConfig>\n}\n\nexport type LocalPattern = {\n /**\n * Can be literal or wildcard.\n * Single `*` matches a single path segment.\n * Double `**` matches any number of path segments.\n */\n pathname?: string\n\n /**\n * Can be literal query string such as `?v=1` or\n * empty string meaning no query string.\n */\n search?: string\n}\n\nexport type RemotePattern = {\n /**\n * Must be `http` or `https`.\n */\n protocol?: 'http' | 'https'\n\n /**\n * Can be literal or wildcard.\n * Single `*` matches a single subdomain.\n * Double `**` matches any number of subdomains.\n */\n hostname: string\n\n /**\n * Can be literal port such as `8080` or empty string\n * meaning no port.\n */\n port?: string\n\n /**\n * Can be literal or wildcard.\n * Single `*` matches a single path segment.\n * Double `**` matches any number of path segments.\n */\n pathname?: string\n\n /**\n * Can be literal query string such as `?v=1` or\n * empty string meaning no query string.\n */\n search?: string\n}\n\ntype ImageFormat = 'image/avif' | 'image/webp'\n\n/**\n * Image configurations\n *\n * @see [Image configuration options](https://nextjs.org/docs/api-reference/next/image#configuration-options)\n */\nexport type ImageConfigComplete = {\n /** @see [Device sizes documentation](https://nextjs.org/docs/api-reference/next/image#device-sizes) */\n deviceSizes: number[]\n\n /** @see [Image sizing documentation](https://nextjs.org/docs/app/building-your-application/optimizing/images#image-sizing) */\n imageSizes: number[]\n\n /** @see [Image loaders configuration](https://nextjs.org/docs/api-reference/next/legacy/image#loader) */\n loader: LoaderValue\n\n /** @see [Image loader configuration](https://nextjs.org/docs/app/api-reference/components/image#path) */\n path: string\n\n /** @see [Image loader configuration](https://nextjs.org/docs/api-reference/next/image#loader-configuration) */\n loaderFile: string\n\n /**\n * @deprecated Use `remotePatterns` instead.\n */\n domains: string[]\n\n /** @see [Disable static image import configuration](https://nextjs.org/docs/api-reference/next/image#disable-static-imports) */\n disableStaticImages: boolean\n\n /** @see [Cache behavior](https://nextjs.org/docs/api-reference/next/image#caching-behavior) */\n minimumCacheTTL: number\n\n /** @see [Acceptable formats](https://nextjs.org/docs/api-reference/next/image#acceptable-formats) */\n formats: ImageFormat[]\n\n /** @see [Maximum Disk Cache Size (in bytes)](https://nextjs.org/docs/api-reference/next/image#maximumdiskcachesize) */\n maximumDiskCacheSize: number | undefined\n\n /** @see [Maximum Redirects](https://nextjs.org/docs/api-reference/next/image#maximumredirects) */\n maximumRedirects: number\n\n /** @see [Maximum Response Body](https://nextjs.org/docs/api-reference/next/image#maximumresponsebody) */\n maximumResponseBody: number\n\n /** @see [Dangerously Allow Local IP](https://nextjs.org/docs/api-reference/next/image#dangerously-allow-local-ip) */\n dangerouslyAllowLocalIP: boolean\n\n /** @see [Dangerously Allow SVG](https://nextjs.org/docs/api-reference/next/image#dangerously-allow-svg) */\n dangerouslyAllowSVG: boolean\n\n /** @see [Content Security Policy](https://nextjs.org/docs/api-reference/next/image#contentsecuritypolicy) */\n contentSecurityPolicy: string\n\n /** @see [Content Disposition Type](https://nextjs.org/docs/api-reference/next/image#contentdispositiontype) */\n contentDispositionType: 'inline' | 'attachment'\n\n /** @see [Remote Patterns](https://nextjs.org/docs/api-reference/next/image#remotepatterns) */\n remotePatterns: Array<URL | RemotePattern>\n\n /** @see [Local Patterns](https://nextjs.org/docs/api-reference/next/image#localPatterns) */\n localPatterns: LocalPattern[] | undefined\n\n /** @see [Qualities](https://nextjs.org/docs/api-reference/next/image#qualities) */\n qualities: number[] | undefined\n\n /** @see [Unoptimized](https://nextjs.org/docs/api-reference/next/image#unoptimized) */\n unoptimized: boolean\n\n /**\n * When true, the `cacheHandler` configured in next.config.js will also be used\n * for caching optimized images. When false, images use the default filesystem cache.\n * @see [Image Optimization Caching](https://nextjs.org/docs/app/api-reference/config/next-config-js/cacheHandler#image-optimization-caching)\n */\n customCacheHandler: boolean\n}\n\nexport type ImageConfig = Partial<ImageConfigComplete>\n\nexport const imageConfigDefault: ImageConfigComplete = {\n deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],\n imageSizes: [32, 48, 64, 96, 128, 256, 384],\n path: '/_next/image',\n loader: 'default',\n loaderFile: '',\n /**\n * @deprecated Use `remotePatterns` instead to protect your application from malicious users.\n */\n domains: [],\n disableStaticImages: false,\n minimumCacheTTL: 14400, // 4 hours\n formats: ['image/webp'],\n maximumDiskCacheSize: undefined, // auto-detect by default\n maximumRedirects: 3,\n maximumResponseBody: 50_000_000, // 50 MB\n dangerouslyAllowLocalIP: false,\n dangerouslyAllowSVG: false,\n contentSecurityPolicy: `script-src 'none'; frame-src 'none'; sandbox;`,\n contentDispositionType: 'attachment',\n localPatterns: undefined, // default: allow all local images\n remotePatterns: [], // default: allow no remote images\n qualities: [75],\n unoptimized: false,\n customCacheHandler: false,\n}\n","import { warnOnce } from './utils/warn-once'\nimport { getDeploymentId } from './deployment-id'\nimport { getImageBlurSvg } from './image-blur-svg'\nimport { imageConfigDefault } from './image-config'\nimport type {\n ImageConfigComplete,\n ImageLoaderProps,\n ImageLoaderPropsWithConfig,\n} from './image-config'\n\nimport type { CSSProperties, JSX } from 'react'\n\nexport interface StaticImageData {\n src: string\n height: number\n width: number\n blurDataURL?: string\n blurWidth?: number\n blurHeight?: number\n}\n\nexport interface StaticRequire {\n default: StaticImageData\n}\n\nexport type StaticImport = StaticRequire | StaticImageData\n\nexport type ImageProps = Omit<\n JSX.IntrinsicElements['img'],\n 'src' | 'srcSet' | 'ref' | 'alt' | 'width' | 'height' | 'loading'\n> & {\n src: string | StaticImport\n alt: string\n width?: number | `${number}`\n height?: number | `${number}`\n fill?: boolean\n loader?: ImageLoader\n quality?: number | `${number}`\n preload?: boolean\n /**\n * @deprecated Use `preload` prop instead.\n * See https://nextjs.org/docs/app/api-reference/components/image#preload\n */\n priority?: boolean\n loading?: LoadingValue\n placeholder?: PlaceholderValue\n blurDataURL?: string\n unoptimized?: boolean\n overrideSrc?: string\n /**\n * @deprecated Use `onLoad` instead.\n * @see https://nextjs.org/docs/app/api-reference/components/image#onload\n */\n onLoadingComplete?: OnLoadingComplete\n /**\n * @deprecated Use `fill` prop instead of `layout=\"fill\"` or change import to `next/legacy/image`.\n * @see https://nextjs.org/docs/api-reference/next/legacy/image\n */\n layout?: string\n /**\n * @deprecated Use `style` prop instead.\n */\n objectFit?: string\n /**\n * @deprecated Use `style` prop instead.\n */\n objectPosition?: string\n /**\n * @deprecated This prop does not do anything.\n */\n lazyBoundary?: string\n /**\n * @deprecated This prop does not do anything.\n */\n lazyRoot?: string\n}\n\nexport type ImgProps = Omit<ImageProps, 'src' | 'loader'> & {\n loading: LoadingValue\n width: number | undefined\n height: number | undefined\n style: NonNullable<JSX.IntrinsicElements['img']['style']>\n sizes: string | undefined\n srcSet: string | undefined\n src: string\n}\n\nconst VALID_LOADING_VALUES = ['lazy', 'eager', undefined] as const\n\n// Object-fit values that are not valid background-size values\nconst INVALID_BACKGROUND_SIZE_VALUES = [\n '-moz-initial',\n 'fill',\n 'none',\n 'scale-down',\n undefined,\n]\ntype LoadingValue = (typeof VALID_LOADING_VALUES)[number]\ntype ImageConfig = ImageConfigComplete & {\n allSizes: number[]\n output?: 'standalone' | 'export'\n}\n\nexport type ImageLoader = (p: ImageLoaderProps) => string\n\n// Do not export - this is an internal type only\n// because `next.config.js` is only meant for the\n// built-in loaders, not for a custom loader() prop.\ntype ImageLoaderWithConfig = (p: ImageLoaderPropsWithConfig) => string\n\nexport type PlaceholderValue = 'blur' | 'empty' | `data:image/${string}`\nexport type OnLoad = React.ReactEventHandler<HTMLImageElement> | undefined\nexport type OnLoadingComplete = (img: HTMLImageElement) => void\n\nexport type PlaceholderStyle = Partial<\n Pick<\n CSSProperties,\n | 'backgroundSize'\n | 'backgroundPosition'\n | 'backgroundRepeat'\n | 'backgroundImage'\n >\n>\n\nfunction isStaticRequire(\n src: StaticRequire | StaticImageData\n): src is StaticRequire {\n return (src as StaticRequire).default !== undefined\n}\n\nfunction isStaticImageData(\n src: StaticRequire | StaticImageData\n): src is StaticImageData {\n return (src as StaticImageData).src !== undefined\n}\n\nfunction isStaticImport(src: string | StaticImport): src is StaticImport {\n return (\n !!src &&\n typeof src === 'object' &&\n (isStaticRequire(src as StaticImport) ||\n isStaticImageData(src as StaticImport))\n )\n}\n\nconst allImgs = new Map<\n string,\n { src: string; loading: LoadingValue; placeholder: PlaceholderValue }\n>()\nlet perfObserver: PerformanceObserver | undefined\n\nfunction getInt(x: unknown): number | undefined {\n if (typeof x === 'undefined') {\n return x\n }\n if (typeof x === 'number') {\n return Number.isFinite(x) ? x : NaN\n }\n if (typeof x === 'string' && /^[0-9]+$/.test(x)) {\n return parseInt(x, 10)\n }\n return NaN\n}\n\nfunction getWidths(\n { deviceSizes, allSizes }: ImageConfig,\n width: number | undefined,\n sizes: string | undefined\n): { widths: number[]; kind: 'w' | 'x' } {\n if (sizes) {\n // Find all the \"vw\" percent sizes used in the sizes prop\n const viewportWidthRe = /(^|\\s)(1?\\d?\\d)vw/g\n const percentSizes = []\n for (let match; (match = viewportWidthRe.exec(sizes)); match) {\n percentSizes.push(parseInt(match[2]))\n }\n if (percentSizes.length) {\n const smallestRatio = Math.min(...percentSizes) * 0.01\n return {\n widths: allSizes.filter((s) => s >= deviceSizes[0] * smallestRatio),\n kind: 'w',\n }\n }\n return { widths: allSizes, kind: 'w' }\n }\n if (typeof width !== 'number') {\n return { widths: deviceSizes, kind: 'w' }\n }\n\n const widths = [\n ...new Set(\n // > This means that most OLED screens that say they are 3x resolution,\n // > are actually 3x in the green color, but only 1.5x in the red and\n // > blue colors. Showing a 3x resolution image in the app vs a 2x\n // > resolution image will be visually the same, though the 3x image\n // > takes significantly more data. Even true 3x resolution screens are\n // > wasteful as the human eye cannot see that level of detail without\n // > something like a magnifying glass.\n // https://blog.twitter.com/engineering/en_us/topics/infrastructure/2019/capping-image-fidelity-on-ultra-high-resolution-devices.html\n [width, width * 2 /*, width * 3*/].map(\n (w) => allSizes.find((p) => p >= w) || allSizes[allSizes.length - 1]\n )\n ),\n ]\n return { widths, kind: 'x' }\n}\n\ntype GenImgAttrsData = {\n config: ImageConfig\n src: string\n unoptimized: boolean\n loader: ImageLoaderWithConfig\n width?: number\n quality?: number\n sizes?: string\n}\n\ntype GenImgAttrsResult = {\n src: string\n srcSet: string | undefined\n sizes: string | undefined\n}\n\nfunction generateImgAttrs({\n config,\n src,\n unoptimized,\n width,\n quality,\n sizes,\n loader,\n}: GenImgAttrsData): GenImgAttrsResult {\n if (unoptimized) {\n if (src.startsWith('/') && !src.startsWith('//')) {\n let deploymentId = getDeploymentId()\n if (deploymentId) {\n // We unfortunately can't easily use `new URL()` here, because it normalizes the URL which causes\n // double-encoding with the `encodeURIComponent(src)` below\n const qIndex = src.indexOf('?')\n if (qIndex !== -1) {\n const params = new URLSearchParams(src.slice(qIndex + 1))\n const srcDpl = params.get('dpl')\n if (!srcDpl) {\n // src is missing the dpl parameter, but we have a deploymentId, so add it to the src URL\n params.append('dpl', deploymentId)\n src = src.slice(0, qIndex) + '?' + params.toString()\n }\n } else {\n // src is missing the dpl parameter, but we have a deploymentId, so add it to the src URL\n src = src + `?dpl=${deploymentId}`\n }\n }\n }\n return { src, srcSet: undefined, sizes: undefined }\n }\n\n const { widths, kind } = getWidths(config, width, sizes)\n const last = widths.length - 1\n\n return {\n sizes: !sizes && kind === 'w' ? '100vw' : sizes,\n srcSet: widths\n .map(\n (w, i) =>\n `${loader({ config, src, quality, width: w })} ${\n kind === 'w' ? w : i + 1\n }${kind}`\n )\n .join(', '),\n\n // It's intended to keep `src` the last attribute because React updates\n // attributes in order. If we keep `src` the first one, Safari will\n // immediately start to fetch `src`, before `sizes` and `srcSet` are even\n // updated by React. That causes multiple unnecessary requests if `srcSet`\n // and `sizes` are defined.\n // This bug cannot be reproduced in Chrome or Firefox.\n src: loader({ config, src, quality, width: widths[last] }),\n }\n}\n\n/**\n * A shared function, used on both client and server, to generate the props for <img>.\n */\nexport function getImgProps(\n {\n src,\n sizes,\n unoptimized = false,\n priority = false,\n preload = false,\n loading,\n className,\n quality,\n width,\n height,\n fill = false,\n style,\n overrideSrc,\n onLoad,\n onLoadingComplete,\n placeholder = 'empty',\n blurDataURL,\n fetchPriority,\n decoding = 'async',\n layout,\n objectFit,\n objectPosition,\n lazyBoundary,\n lazyRoot,\n ...rest\n }: ImageProps,\n _state: {\n defaultLoader: ImageLoaderWithConfig\n imgConf: ImageConfigComplete\n showAltText?: boolean\n blurComplete?: boolean\n }\n): {\n props: ImgProps\n meta: {\n unoptimized: boolean\n preload: boolean\n placeholder: NonNullable<ImageProps['placeholder']>\n fill: boolean\n }\n} {\n const { imgConf, showAltText, blurComplete, defaultLoader } = _state\n let config: ImageConfig\n let c = imgConf || imageConfigDefault\n if ('allSizes' in c) {\n config = c as ImageConfig\n } else {\n const allSizes = [...c.deviceSizes, ...c.imageSizes].sort((a, b) => a - b)\n const deviceSizes = c.deviceSizes.sort((a, b) => a - b)\n const qualities = c.qualities?.sort((a, b) => a - b)\n config = { ...c, allSizes, deviceSizes, qualities }\n }\n\n if (typeof defaultLoader === 'undefined') {\n throw new Error(\n 'images.loaderFile detected but the file is missing default export.\\nRead more: https://nextjs.org/docs/messages/invalid-images-config'\n )\n }\n let loader: ImageLoaderWithConfig = rest.loader || defaultLoader\n\n // Remove property so it's not spread on <img> element\n delete rest.loader\n delete (rest as any).srcSet\n\n // This special value indicates that the user\n // didn't define a \"loader\" prop or \"loader\" config.\n const isDefaultLoader = '__next_img_default' in loader\n\n if (isDefaultLoader) {\n if (config.loader === 'custom') {\n throw new Error(\n `Image with src \"${src}\" is missing \"loader\" prop.` +\n `\\nRead more: https://nextjs.org/docs/messages/next-image-missing-loader`\n )\n }\n } else {\n // The user defined a \"loader\" prop or config.\n // Since the config object is internal only, we\n // must not pass it to the user-defined \"loader\".\n const customImageLoader = loader as ImageLoader\n loader = (obj) => {\n const { config: _, ...opts } = obj\n return customImageLoader(opts)\n }\n }\n\n if (layout) {\n if (layout === 'fill') {\n fill = true\n }\n const layoutToStyle: Record<string, Record<string, string> | undefined> = {\n intrinsic: { maxWidth: '100%', height: 'auto' },\n responsive: { width: '100%', height: 'auto' },\n }\n const layoutToSizes: Record<string, string | undefined> = {\n responsive: '100vw',\n fill: '100vw',\n }\n const layoutStyle = layoutToStyle[layout]\n if (layoutStyle) {\n style = { ...style, ...layoutStyle }\n }\n const layoutSizes = layoutToSizes[layout]\n if (layoutSizes && !sizes) {\n sizes = layoutSizes\n }\n }\n\n let staticSrc = ''\n let widthInt = getInt(width)\n let heightInt = getInt(height)\n let blurWidth: number | undefined\n let blurHeight: number | undefined\n if (isStaticImport(src)) {\n const staticImageData = isStaticRequire(src) ? src.default : src\n\n if (!staticImageData.src) {\n throw new Error(\n `An object should only be passed to the image component src parameter if it comes from a static image import. It must include src. Received ${JSON.stringify(\n staticImageData\n )}`\n )\n }\n if (!staticImageData.height || !staticImageData.width) {\n throw new Error(\n `An object should only be passed to the image component src parameter if it comes from a static image import. It must include height and width. Received ${JSON.stringify(\n staticImageData\n )}`\n )\n }\n\n blurWidth = staticImageData.blurWidth\n blurHeight = staticImageData.blurHeight\n blurDataURL = blurDataURL || staticImageData.blurDataURL\n staticSrc = staticImageData.src\n\n if (!fill) {\n if (!widthInt && !heightInt) {\n widthInt = staticImageData.width\n heightInt = staticImageData.height\n } else if (widthInt && !heightInt) {\n const ratio = widthInt / staticImageData.width\n heightInt = Math.round(staticImageData.height * ratio)\n } else if (!widthInt && heightInt) {\n const ratio = heightInt / staticImageData.height\n widthInt = Math.round(staticImageData.width * ratio)\n }\n }\n }\n src = typeof src === 'string' ? src : staticSrc\n\n let isLazy =\n !priority &&\n !preload &&\n (loading === 'lazy' || typeof loading === 'undefined')\n if (!src || src.startsWith('data:') || src.startsWith('blob:')) {\n // https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/Data_URIs\n unoptimized = true\n isLazy = false\n }\n if (config.unoptimized) {\n unoptimized = true\n }\n if (\n isDefaultLoader &&\n !config.dangerouslyAllowSVG &&\n src.split('?', 1)[0].endsWith('.svg')\n ) {\n // Special case to make svg serve as-is to avoid proxying\n // through the built-in Image Optimization API.\n unoptimized = true\n }\n\n const qualityInt = getInt(quality)\n\n if (process.env.NODE_ENV !== 'production') {\n if (config.output === 'export' && isDefaultLoader && !unoptimized) {\n throw new Error(\n `Image Optimization using the default loader is not compatible with \\`{ output: 'export' }\\`.\n Possible solutions:\n - Remove \\`{ output: 'export' }\\` and run \"next start\" to run server mode including the Image Optimization API.\n - Configure \\`{ images: { unoptimized: true } }\\` in \\`next.config.js\\` to disable the Image Optimization API.\n Read more: https://nextjs.org/docs/messages/export-image-api`\n )\n }\n if (!src) {\n // React doesn't show the stack trace and there's\n // no `src` to help identify which image, so we\n // instead console.error(ref) during mount.\n unoptimized = true\n } else {\n if (fill) {\n if (width) {\n throw new Error(\n `Image with src \"${src}\" has both \"width\" and \"fill\" properties. Only one should be used.`\n )\n }\n if (height) {\n throw new Error(\n `Image with src \"${src}\" has both \"height\" and \"fill\" properties. Only one should be used.`\n )\n }\n if (style?.position && style.position !== 'absolute') {\n throw new Error(\n `Image with src \"${src}\" has both \"fill\" and \"style.position\" properties. Images with \"fill\" always use position absolute - it cannot be modified.`\n )\n }\n if (style?.width && style.width !== '100%') {\n throw new Error(\n `Image with src \"${src}\" has both \"fill\" and \"style.width\" properties. Images with \"fill\" always use width 100% - it cannot be modified.`\n )\n }\n if (style?.height && style.height !== '100%') {\n throw new Error(\n `Image with src \"${src}\" has both \"fill\" and \"style.height\" properties. Images with \"fill\" always use height 100% - it cannot be modified.`\n )\n }\n } else {\n if (typeof widthInt === 'undefined') {\n throw new Error(\n `Image with src \"${src}\" is missing required \"width\" property.`\n )\n } else if (isNaN(widthInt)) {\n throw new Error(\n `Image with src \"${src}\" has invalid \"width\" property. Expected a numeric value in pixels but received \"${width}\".`\n )\n }\n if (typeof heightInt === 'undefined') {\n throw new Error(\n `Image with src \"${src}\" is missing required \"height\" property.`\n )\n } else if (isNaN(heightInt)) {\n throw new Error(\n `Image with src \"${src}\" has invalid \"height\" property. Expected a numeric value in pixels but received \"${height}\".`\n )\n }\n // eslint-disable-next-line no-control-regex\n if (/^[\\x00-\\x20]/.test(src)) {\n throw new Error(\n `Image with src \"${src}\" cannot start with a space or control character. Use src.trimStart() to remove it or encodeURIComponent(src) to keep it.`\n )\n }\n // eslint-disable-next-line no-control-regex\n if (/[\\x00-\\x20]$/.test(src)) {\n throw new Error(\n `Image with src \"${src}\" cannot end with a space or control character. Use src.trimEnd() to remove it or encodeURIComponent(src) to keep it.`\n )\n }\n }\n }\n if (!VALID_LOADING_VALUES.includes(loading)) {\n throw new Error(\n `Image with src \"${src}\" has invalid \"loading\" property. Provided \"${loading}\" should be one of ${VALID_LOADING_VALUES.map(\n String\n ).join(',')}.`\n )\n }\n if (priority && loading === 'lazy') {\n throw new Error(\n `Image with src \"${src}\" has both \"priority\" and \"loading='lazy'\" properties. Only one should be used.`\n )\n }\n if (preload && loading === 'lazy') {\n throw new Error(\n `Image with src \"${src}\" has both \"preload\" and \"loading='lazy'\" properties. Only one should be used.`\n )\n }\n if (preload && priority) {\n throw new Error(\n `Image with src \"${src}\" has both \"preload\" and \"priority\" properties. Only \"preload\" should be used.`\n )\n }\n if (\n placeholder !== 'empty' &&\n placeholder !== 'blur' &&\n !placeholder.startsWith('data:image/')\n ) {\n throw new Error(\n `Image with src \"${src}\" has invalid \"placeholder\" property \"${placeholder}\".`\n )\n }\n if (placeholder !== 'empty') {\n if (widthInt && heightInt && widthInt * heightInt < 1600) {\n warnOnce(\n `Image with src \"${src}\" is smaller than 40x40. Consider removing the \"placeholder\" property to improve performance.`\n )\n }\n }\n if (\n qualityInt &&\n config.qualities &&\n !config.qualities.includes(qualityInt)\n ) {\n warnOnce(\n `Image with src \"${src}\" is using quality \"${qualityInt}\" which is not configured in images.qualities [${config.qualities.join(', ')}]. Please update your config to [${[...config.qualities, qualityInt].sort().join(', ')}].` +\n `\\nRead more: https://nextjs.org/docs/messages/next-image-unconfigured-qualities`\n )\n }\n if (placeholder === 'blur' && !blurDataURL) {\n const VALID_BLUR_EXT = ['jpeg', 'png', 'webp', 'avif'] // should match next-image-loader\n\n throw new Error(\n `Image with src \"${src}\" has \"placeholder='blur'\" property but is missing the \"blurDataURL\" property.\n Possible solutions:\n - Add a \"blurDataURL\" property, the contents should be a small Data URL to represent the image\n - Change the \"src\" property to a static import with one of the supported file types: ${VALID_BLUR_EXT.join(\n ','\n )} (animated images not supported)\n - Remove the \"placeholder\" property, effectively no blur effect\n Read more: https://nextjs.org/docs/messages/placeholder-blur-data-url`\n )\n }\n if ('ref' in rest) {\n warnOnce(\n `Image with src \"${src}\" is using unsupported \"ref\" property. Consider using the \"onLoad\" property instead.`\n )\n }\n\n if (!unoptimized && !isDefaultLoader) {\n const urlStr = loader({\n config,\n src,\n width: widthInt || 400,\n quality: qualityInt || 75,\n })\n let url: URL | undefined\n try {\n url = new URL(urlStr)\n } catch (err) {}\n if (urlStr === src || (url && url.pathname === src && !url.search)) {\n warnOnce(\n `Image with src \"${src}\" has a \"loader\" property that does not implement width. Please implement it or use the \"unoptimized\" property instead.` +\n `\\nRead more: https://nextjs.org/docs/messages/next-image-missing-loader-width`\n )\n }\n }\n\n if (onLoadingComplete) {\n warnOnce(\n `Image with src \"${src}\" is using deprecated \"onLoadingComplete\" property. Please use the \"onLoad\" property instead.`\n )\n }\n\n for (const [legacyKey, legacyValue] of Object.entries({\n layout,\n objectFit,\n objectPosition,\n lazyBoundary,\n lazyRoot,\n })) {\n if (legacyValue) {\n warnOnce(\n `Image with src \"${src}\" has legacy prop \"${legacyKey}\". Did you forget to run the codemod?` +\n `\\nRead more: https://nextjs.org/docs/messages/next-image-upgrade-to-13`\n )\n }\n }\n\n if (\n typeof window !== 'undefined' &&\n !perfObserver &&\n window.PerformanceObserver\n ) {\n perfObserver = new PerformanceObserver((entryList) => {\n for (const entry of entryList.getEntries()) {\n // @ts-ignore - missing \"LargestContentfulPaint\" class with \"element\" prop\n const imgSrc = entry?.element?.src || ''\n const lcpImage = allImgs.get(imgSrc)\n if (\n lcpImage &&\n lcpImage.loading === 'lazy' &&\n lcpImage.placeholder === 'empty' &&\n !lcpImage.src.startsWith('data:') &&\n !lcpImage.src.startsWith('blob:')\n ) {\n // https://web.dev/lcp/#measure-lcp-in-javascript\n warnOnce(\n `Image with src \"${lcpImage.src}\" was detected as the Largest Contentful Paint (LCP). Please add the \\`loading=\"eager\"\\` property if this image is above the fold.` +\n `\\nRead more: https://nextjs.org/docs/app/api-reference/components/image#loading`\n )\n }\n }\n })\n try {\n perfObserver.observe({\n type: 'largest-contentful-paint',\n buffered: true,\n })\n } catch (err) {\n // Log error but don't crash the app\n console.error(err)\n }\n }\n }\n const imgStyle = Object.assign(\n fill\n ? {\n position: 'absolute',\n height: '100%',\n width: '100%',\n left: 0,\n top: 0,\n right: 0,\n bottom: 0,\n objectFit,\n objectPosition,\n }\n : {},\n showAltText ? {} : { color: 'transparent' },\n style\n )\n\n const backgroundImage =\n !blurComplete && placeholder !== 'empty'\n ? placeholder === 'blur'\n ? `url(\"data:image/svg+xml;charset=utf-8,${getImageBlurSvg({\n widthInt,\n heightInt,\n blurWidth,\n blurHeight,\n blurDataURL: blurDataURL || '', // assume not undefined\n objectFit: imgStyle.objectFit,\n })}\")`\n : `url(\"${placeholder}\")` // assume `data:image/`\n : null\n\n const backgroundSize = !INVALID_BACKGROUND_SIZE_VALUES.includes(\n imgStyle.objectFit\n )\n ? imgStyle.objectFit\n : imgStyle.objectFit === 'fill'\n ? '100% 100%' // the background-size equivalent of `fill`\n : 'cover'\n\n let placeholderStyle: PlaceholderStyle = backgroundImage\n ? {\n backgroundSize,\n backgroundPosition: imgStyle.objectPosition || '50% 50%',\n backgroundRepeat: 'no-repeat',\n backgroundImage,\n }\n : {}\n\n if (process.env.NODE_ENV === 'development') {\n if (\n placeholderStyle.backgroundImage &&\n placeholder === 'blur' &&\n blurDataURL?.startsWith('/')\n ) {\n // During `next dev`, we don't want to generate blur placeholders with webpack\n // because it can delay starting the dev server. Instead, `next-image-loader.js`\n // will inline a special url to lazily generate the blur placeholder at request time.\n placeholderStyle.backgroundImage = `url(\"${blurDataURL}\")`\n }\n }\n\n const imgAttributes = generateImgAttrs({\n config,\n src,\n unoptimized,\n width: widthInt,\n quality: qualityInt,\n sizes,\n loader,\n })\n\n const loadingFinal = isLazy ? 'lazy' : loading\n\n if (process.env.NODE_ENV !== 'production') {\n if (typeof window !== 'undefined') {\n let fullUrl: URL\n try {\n fullUrl = new URL(imgAttributes.src)\n } catch (e) {\n fullUrl = new URL(imgAttributes.src, window.location.href)\n }\n allImgs.set(fullUrl.href, { src, loading: loadingFinal, placeholder })\n }\n }\n\n const props: ImgProps = {\n ...rest,\n loading: loadingFinal,\n fetchPriority,\n width: widthInt,\n height: heightInt,\n decoding,\n className,\n style: { ...imgStyle, ...placeholderStyle },\n sizes: imgAttributes.sizes,\n srcSet: imgAttributes.srcSet,\n src: overrideSrc || imgAttributes.src,\n }\n const meta = { unoptimized, preload: preload || priority, placeholder, fill }\n return { props, meta }\n}\n","// This file is generated by next-core EcmascriptClientReferenceModule.\nconst { createClientModuleProxy } = require(\"react-server-dom-turbopack/server\");\n\n__turbopack_context__.n(createClientModuleProxy(\"[project]/node_modules/next/dist/client/image-component.js\"));\n","'use client'\n\nimport React, {\n useRef,\n useEffect,\n useCallback,\n useContext,\n useMemo,\n useState,\n forwardRef,\n use,\n} from 'react'\nimport ReactDOM from 'react-dom'\nimport Head from '../shared/lib/head'\nimport { getImgProps } from '../shared/lib/get-img-props'\nimport type {\n ImageProps,\n ImgProps,\n OnLoad,\n OnLoadingComplete,\n PlaceholderValue,\n} from '../shared/lib/get-img-props'\nimport type {\n ImageConfigComplete,\n ImageLoaderProps,\n} from '../shared/lib/image-config'\nimport { imageConfigDefault } from '../shared/lib/image-config'\nimport { ImageConfigContext } from '../shared/lib/image-config-context.shared-runtime'\nimport { warnOnce } from '../shared/lib/utils/warn-once'\nimport { RouterContext } from '../shared/lib/router-context.shared-runtime'\n\n// This is replaced by webpack alias\nimport defaultLoader from 'next/dist/shared/lib/image-loader'\nimport { useMergedRef } from './use-merged-ref'\n\n// This is replaced by webpack define plugin\nconst configEnv = process.env.__NEXT_IMAGE_OPTS as any as ImageConfigComplete\n\nif (typeof window === 'undefined') {\n ;(globalThis as any).__NEXT_IMAGE_IMPORTED = true\n}\n\nexport type { ImageLoaderProps }\nexport type ImageLoader = (p: ImageLoaderProps) => string\n\ntype ImgElementWithDataProp = HTMLImageElement & {\n 'data-loaded-src': string | undefined\n}\n\ntype ImageElementProps = ImgProps & {\n unoptimized: boolean\n placeholder: PlaceholderValue\n onLoadRef: React.MutableRefObject<OnLoad | undefined>\n onLoadingCompleteRef: React.MutableRefObject<OnLoadingComplete | undefined>\n setBlurComplete: (b: boolean) => void\n setShowAltText: (b: boolean) => void\n sizesInput: string | undefined\n}\n\n// See https://stackoverflow.com/q/39777833/266535 for why we use this ref\n// handler instead of the img's onLoad attribute.\nfunction handleLoading(\n img: ImgElementWithDataProp,\n placeholder: PlaceholderValue,\n onLoadRef: React.MutableRefObject<OnLoad | undefined>,\n onLoadingCompleteRef: React.MutableRefObject<OnLoadingComplete | undefined>,\n setBlurComplete: (b: boolean) => void,\n unoptimized: boolean,\n sizesInput: string | undefined\n) {\n const src = img?.src\n if (!img || img['data-loaded-src'] === src) {\n return\n }\n img['data-loaded-src'] = src\n const p = 'decode' in img ? img.decode() : Promise.resolve()\n p.catch(() => {}).then(() => {\n if (!img.parentElement || !img.isConnected) {\n // Exit early in case of race condition:\n // - onload() is called\n // - decode() is called but incomplete\n // - unmount is called\n // - decode() completes\n return\n }\n if (placeholder !== 'empty') {\n setBlurComplete(true)\n }\n if (onLoadRef?.current) {\n // Since we don't have the SyntheticEvent here,\n // we must create one with the same shape.\n // See https://reactjs.org/docs/events.html\n const event = new Event('load')\n Object.defineProperty(event, 'target', { writable: false, value: img })\n let prevented = false\n let stopped = false\n onLoadRef.current({\n ...event,\n nativeEvent: event,\n currentTarget: img,\n target: img,\n isDefaultPrevented: () => prevented,\n isPropagationStopped: () => stopped,\n persist: () => {},\n preventDefault: () => {\n prevented = true\n event.preventDefault()\n },\n stopPropagation: () => {\n stopped = true\n event.stopPropagation()\n },\n })\n }\n if (onLoadingCompleteRef?.current) {\n onLoadingCompleteRef.current(img)\n }\n if (process.env.NODE_ENV !== 'production') {\n const origSrc = new URL(src, 'http://n').searchParams.get('url') || src\n if (img.getAttribute('data-nimg') === 'fill') {\n if (!unoptimized && (!sizesInput || sizesInput === '100vw')) {\n let widthViewportRatio =\n img.getBoundingClientRect().width / window.innerWidth\n if (widthViewportRatio < 0.6) {\n if (sizesInput === '100vw') {\n warnOnce(\n `Image with src \"${origSrc}\" has \"fill\" prop and \"sizes\" prop of \"100vw\", but image is not rendered at full viewport width. Please adjust \"sizes\" to improve page performance. Read more: https://nextjs.org/docs/api-reference/next/image#sizes`\n )\n } else {\n warnOnce(\n `Image with src \"${origSrc}\" has \"fill\" but is missing \"sizes\" prop. Please add it to improve page performance. Read more: https://nextjs.org/docs/api-reference/next/image#sizes`\n )\n }\n }\n }\n if (img.parentElement) {\n const { position } = window.getComputedStyle(img.parentElement)\n const valid = ['absolute', 'fixed', 'relative']\n if (!valid.includes(position)) {\n warnOnce(\n `Image with src \"${origSrc}\" has \"fill\" and parent element with invalid \"position\". Provided \"${position}\" should be one of ${valid\n .map(String)\n .join(',')}.`\n )\n }\n }\n if (img.height === 0) {\n warnOnce(\n `Image with src \"${origSrc}\" has \"fill\" and a height value of 0. This is likely because the parent element of the image has not been styled to have a set height.`\n )\n }\n }\n\n const heightModified =\n img.height.toString() !== img.getAttribute('height')\n const widthModified = img.width.toString() !== img.getAttribute('width')\n if (\n (heightModified && !widthModified) ||\n (!heightModified && widthModified)\n ) {\n warnOnce(\n `Image with src \"${origSrc}\" has either width or height modified, but not the other. If you use CSS to change the size of your image, also include the styles 'width: \"auto\"' or 'height: \"auto\"' to maintain the aspect ratio.`\n )\n }\n }\n })\n}\n\nfunction getDynamicProps(\n fetchPriority?: string\n): Record<string, string | undefined> {\n if (Boolean(use)) {\n // In React 19.0.0 or newer, we must use camelCase\n // prop to avoid \"Warning: Invalid DOM property\".\n // See https://github.com/facebook/react/pull/25927\n return { fetchPriority }\n }\n // In React 18.2.0 or older, we must use lowercase prop\n // to avoid \"Warning: Invalid DOM property\".\n return { fetchpriority: fetchPriority }\n}\n\nconst ImageElement = forwardRef<HTMLImageElement | null, ImageElementProps>(\n (\n {\n src,\n srcSet,\n sizes,\n height,\n width,\n decoding,\n className,\n style,\n fetchPriority,\n placeholder,\n loading,\n unoptimized,\n fill,\n onLoadRef,\n onLoadingCompleteRef,\n setBlurComplete,\n setShowAltText,\n sizesInput,\n onLoad,\n onError,\n ...rest\n },\n forwardedRef\n ) => {\n const ownRef = useCallback(\n (img: ImgElementWithDataProp | null) => {\n if (!img) {\n return\n }\n if (onError) {\n // If the image has an error before react hydrates, then the error is lost.\n // The workaround is to wait until the image is mounted which is after hydration,\n // then we set the src again to trigger the error handler (if there was an error).\n // eslint-disable-next-line no-self-assign\n img.src = img.src\n }\n if (process.env.NODE_ENV !== 'production') {\n if (!src) {\n console.error(`Image is missing required \"src\" property:`, img)\n }\n if (img.getAttribute('alt') === null) {\n console.error(\n `Image is missing required \"alt\" property. Please add Alternative Text to describe the image for screen readers and search engines.`\n )\n }\n }\n if (img.complete) {\n handleLoading(\n img,\n placeholder,\n onLoadRef,\n onLoadingCompleteRef,\n setBlurComplete,\n unoptimized,\n sizesInput\n )\n }\n },\n [\n src,\n placeholder,\n onLoadRef,\n onLoadingCompleteRef,\n setBlurComplete,\n onError,\n unoptimized,\n sizesInput,\n ]\n )\n\n const ref = useMergedRef(forwardedRef, ownRef)\n\n return (\n <img\n {...rest}\n {...getDynamicProps(fetchPriority)}\n // It's intended to keep `loading` before `src` because React updates\n // props in order which causes Safari/Firefox to not lazy load properly.\n // See https://github.com/facebook/react/issues/25883\n loading={loading}\n width={width}\n height={height}\n decoding={decoding}\n data-nimg={fill ? 'fill' : '1'}\n className={className}\n style={style}\n // It's intended to keep `src` the last attribute because React updates\n // attributes in order. If we keep `src` the first one, Safari will\n // immediately start to fetch `src`, before `sizes` and `srcSet` are even\n // updated by React. That causes multiple unnecessary requests if `srcSet`\n // and `sizes` are defined.\n // This bug cannot be reproduced in Chrome or Firefox.\n sizes={sizes}\n srcSet={srcSet}\n src={src}\n ref={ref}\n onLoad={(event) => {\n const img = event.currentTarget as ImgElementWithDataProp\n handleLoading(\n img,\n placeholder,\n onLoadRef,\n onLoadingCompleteRef,\n setBlurComplete,\n unoptimized,\n sizesInput\n )\n }}\n onError={(event) => {\n // if the real image fails to load, this will ensure \"alt\" is visible\n setShowAltText(true)\n if (placeholder !== 'empty') {\n // If the real image fails to load, this will still remove the placeholder.\n setBlurComplete(true)\n }\n if (onError) {\n onError(event)\n }\n }}\n />\n )\n }\n)\n\nfunction ImagePreload({\n isAppRouter,\n imgAttributes,\n}: {\n isAppRouter: boolean\n imgAttributes: ImgProps\n}) {\n const opts: ReactDOM.PreloadOptions = {\n as: 'image',\n imageSrcSet: imgAttributes.srcSet,\n imageSizes: imgAttributes.sizes,\n crossOrigin: imgAttributes.crossOrigin,\n referrerPolicy: imgAttributes.referrerPolicy,\n ...getDynamicProps(imgAttributes.fetchPriority),\n }\n\n if (isAppRouter && ReactDOM.preload) {\n ReactDOM.preload(imgAttributes.src, opts)\n return null\n }\n\n return (\n <Head>\n <link\n key={\n '__nimg-' +\n imgAttributes.src +\n imgAttributes.srcSet +\n imgAttributes.sizes\n }\n rel=\"preload\"\n // Note how we omit the `href` attribute, as it would only be relevant\n // for browsers that do not support `imagesrcset`, and in those cases\n // it would cause the incorrect image to be preloaded.\n //\n // https://html.spec.whatwg.org/multipage/semantics.html#attr-link-imagesrcset\n href={imgAttributes.srcSet ? undefined : imgAttributes.src}\n {...opts}\n />\n </Head>\n )\n}\n\n/**\n * The `Image` component is used to optimize images.\n *\n * Read more: [Next.js docs: `Image`](https://nextjs.org/docs/app/api-reference/components/image)\n */\nexport const Image = forwardRef<HTMLImageElement | null, ImageProps>(\n (props, forwardedRef) => {\n const pagesRouter = useContext(RouterContext)\n // We're in the app directory if there is no pages router.\n const isAppRouter = !pagesRouter\n\n const configContext = useContext(ImageConfigContext)\n const config = useMemo(() => {\n const c = configEnv || configContext || imageConfigDefault\n\n const allSizes = [...c.deviceSizes, ...c.imageSizes].sort((a, b) => a - b)\n const deviceSizes = c.deviceSizes.sort((a, b) => a - b)\n const qualities = c.qualities?.sort((a, b) => a - b)\n return {\n ...c,\n allSizes,\n deviceSizes,\n qualities,\n // During the SSR, configEnv (__NEXT_IMAGE_OPTS) does not include\n // security sensitive configs like `localPatterns`, which is needed\n // during the server render to ensure it's validated. Therefore use\n // configContext, which holds the config from the server for validation.\n localPatterns:\n typeof window === 'undefined'\n ? configContext?.localPatterns\n : c.localPatterns,\n }\n }, [configContext])\n\n const { onLoad, onLoadingComplete } = props\n const onLoadRef = useRef(onLoad)\n\n useEffect(() => {\n onLoadRef.current = onLoad\n }, [onLoad])\n\n const onLoadingCompleteRef = useRef(onLoadingComplete)\n\n useEffect(() => {\n onLoadingCompleteRef.current = onLoadingComplete\n }, [onLoadingComplete])\n\n const [blurComplete, setBlurComplete] = useState(false)\n const [showAltText, setShowAltText] = useState(false)\n const { props: imgAttributes, meta: imgMeta } = getImgProps(props, {\n defaultLoader,\n imgConf: config,\n blurComplete,\n showAltText,\n })\n\n return (\n <>\n {\n <ImageElement\n {...imgAttributes}\n unoptimized={imgMeta.unoptimized}\n placeholder={imgMeta.placeholder}\n fill={imgMeta.fill}\n onLoadRef={onLoadRef}\n onLoadingCompleteRef={onLoadingCompleteRef}\n setBlurComplete={setBlurComplete}\n setShowAltText={setShowAltText}\n sizesInput={props.sizes}\n ref={forwardedRef}\n />\n }\n {imgMeta.preload ? (\n <ImagePreload\n isAppRouter={isAppRouter}\n imgAttributes={imgAttributes}\n />\n ) : null}\n </>\n )\n }\n)\n","import type { NextConfig } from '../../server/config-shared'\n\n/**\n * Find the closest matching `quality` in the list of `config.qualities`\n * @param quality the quality prop passed to the image component\n * @param config the \"images\" configuration from next.config.js\n * @returns the closest matching quality value\n */\nexport function findClosestQuality(\n quality: number | undefined,\n config: NextConfig['images'] | undefined\n): number {\n const q = quality || 75\n if (!config?.qualities?.length) {\n return q\n }\n return config.qualities.reduce(\n (prev, cur) => (Math.abs(cur - q) < Math.abs(prev - q) ? cur : prev),\n config.qualities[0]\n )\n}\n","import type { ImageLoaderPropsWithConfig } from './image-config'\nimport { findClosestQuality } from './find-closest-quality'\nimport { getDeploymentId } from './deployment-id'\n\nfunction defaultLoader({\n config,\n src,\n width,\n quality,\n}: ImageLoaderPropsWithConfig): string {\n if (process.env.NODE_ENV !== 'production') {\n const missingValues = []\n\n // these should always be provided but make sure they are\n if (!src) missingValues.push('src')\n if (!width) missingValues.push('width')\n\n if (missingValues.length > 0) {\n throw new Error(\n `Next Image Optimization requires ${missingValues.join(\n ', '\n )} to be provided. Make sure you pass them as props to the \\`next/image\\` component. Received: ${JSON.stringify(\n { src, width, quality }\n )}`\n )\n }\n }\n\n // Extract dpl parameter early so validation uses the clean URL.\n // If a immutable asset token should be used, it was already added as a query parameter and will\n // be extracted and reused here.\n let deploymentId = getDeploymentId()\n if (src.startsWith('/') && !src.startsWith('//')) {\n // We unfortunately can't easily use `new URL()` here, because it normalizes the URL which causes\n // double-encoding with the `encodeURIComponent(src)` below\n const qIndex = src.indexOf('?')\n if (qIndex !== -1) {\n const params = new URLSearchParams(src.slice(qIndex + 1))\n const srcDpl = params.get('dpl')\n if (srcDpl) {\n deploymentId = srcDpl\n params.delete('dpl')\n const remaining = params.toString()\n src = src.slice(0, qIndex) + (remaining ? '?' + remaining : '')\n }\n }\n }\n\n if (\n src.startsWith('/') &&\n src.includes('?') &&\n config.localPatterns?.length === 1 &&\n config.localPatterns[0].pathname === '**' &&\n config.localPatterns[0].search === ''\n ) {\n throw new Error(\n `Image with src \"${src}\" is using a query string which is not configured in images.localPatterns.` +\n `\\nRead more: https://nextjs.org/docs/messages/next-image-unconfigured-localpatterns`\n )\n }\n\n if (process.env.NODE_ENV !== 'production') {\n if (src.startsWith('//')) {\n throw new Error(\n `Failed to parse src \"${src}\" on \\`next/image\\`, protocol-relative URL (//) must be changed to an absolute URL (http:// or https://)`\n )\n }\n\n if (src.startsWith('/') && config.localPatterns) {\n if (\n process.env.NODE_ENV !== 'test' &&\n // micromatch isn't compatible with edge runtime\n process.env.NEXT_RUNTIME !== 'edge'\n ) {\n // We use dynamic require because this should only error in development\n const { hasLocalMatch } =\n require('./match-local-pattern') as typeof import('./match-local-pattern')\n if (!hasLocalMatch(config.localPatterns, src)) {\n throw new Error(\n `Invalid src prop (${src}) on \\`next/image\\` does not match \\`images.localPatterns\\` configured in your \\`next.config.js\\`\\n` +\n `See more info: https://nextjs.org/docs/messages/next-image-unconfigured-localpatterns`\n )\n }\n }\n }\n\n if (!src.startsWith('/') && (config.domains || config.remotePatterns)) {\n let parsedSrc: URL\n try {\n parsedSrc = new URL(src)\n } catch (err) {\n console.error(err)\n throw new Error(\n `Failed to parse src \"${src}\" on \\`next/image\\`, if using relative image it must start with a leading slash \"/\" or be an absolute URL (http:// or https://)`\n )\n }\n\n if (\n process.env.NODE_ENV !== 'test' &&\n // micromatch isn't compatible with edge runtime\n process.env.NEXT_RUNTIME !== 'edge'\n ) {\n // We use dynamic require because this should only error in development\n const { hasRemoteMatch } =\n require('./match-remote-pattern') as typeof import('./match-remote-pattern')\n if (\n !hasRemoteMatch(config.domains!, config.remotePatterns!, parsedSrc)\n ) {\n throw new Error(\n `Invalid src prop (${src}) on \\`next/image\\`, hostname \"${parsedSrc.hostname}\" is not configured under images in your \\`next.config.js\\`\\n` +\n `See more info: https://nextjs.org/docs/messages/next-image-unconfigured-host`\n )\n }\n }\n }\n }\n\n const q = findClosestQuality(quality, config)\n\n return `${config.path}?url=${encodeURIComponent(src)}&w=${width}&q=${q}${\n src.startsWith('/') && deploymentId ? `&dpl=${deploymentId}` : ''\n }`\n}\n\n// We use this to determine if the import is the default loader\n// or a custom loader defined by the user in next.config.js\ndefaultLoader.__next_img_default = true\n\nexport default defaultLoader\n","import type { ImageConfigComplete, ImageLoaderProps } from './image-config'\nimport type { ImageProps, ImageLoader, StaticImageData } from './get-img-props'\n\nimport { getImgProps } from './get-img-props'\nimport { Image } from '../../client/image-component'\n\n// This is replaced by webpack alias\nimport defaultLoader from 'next/dist/shared/lib/image-loader'\n\n/**\n * For more advanced use cases, you can call `getImageProps()`\n * to get the props that would be passed to the underlying `<img>` element,\n * and instead pass to them to another component, style, canvas, etc.\n *\n * Read more: [Next.js docs: `getImageProps`](https://nextjs.org/docs/app/api-reference/components/image#getimageprops)\n */\nexport function getImageProps(imgProps: ImageProps) {\n const { props } = getImgProps(imgProps, {\n defaultLoader,\n // This is replaced by webpack define plugin\n imgConf: process.env.__NEXT_IMAGE_OPTS as any as ImageConfigComplete,\n })\n // Normally we don't care about undefined props because we pass to JSX,\n // but this exported function could be used by the end user for anything\n // so we delete undefined props to clean it up a little.\n for (const [key, value] of Object.entries(props)) {\n if (value === undefined) {\n delete props[key as keyof typeof props]\n }\n }\n return { props }\n}\n\nexport default Image\n\nexport type { ImageProps, ImageLoaderProps, ImageLoader, StaticImageData }\n","module.exports = require('./dist/shared/lib/image-external')\n","export const dynamic = 'force-dynamic';\n\nimport { getDb } from '@/lib/db';\nimport { Dashboard } from '@/components/Dashboard';\nimport Link from 'next/link';\nimport { activityStreak, burndownPoints, fileHotspots, spendingStats, dayTimeline, achievements } from '@/lib/stats';\nimport type { SessionRow } from '@/lib/schema';\nimport { getCodexAccounts } from '@/lib/codex-auth';\nimport { getLatestUsageSnapshot } from '@/lib/usage-snapshots';\nimport { MarketingPage } from '@/components/MarketingPage';\nimport { LocaleSwitcher } from '@/components/LocaleSwitcher';\nimport { getServerLocale } from '@/lib/i18n/server';\nimport { t } from '@/lib/i18n';\n\nconst DEMO_PROJECTS = [\n 'kanban-board', 'pomodoro', 'weather-widget', 'recipe-box', 'mood-journal',\n 'habit-tracker', 'flashcards', 'spelling-bee', 'budget-app', 'markdown-blog',\n 'todo-cli', 'music-player', 'photo-gallery', 'note-vault', 'expense-split',\n];\n\nconst DEMO_TITLES = [\n 'add dark mode toggle',\n 'refactor router boundaries',\n 'fix mobile layout overflow',\n 'wire up websocket reconnect',\n 'optimize image lazy loading',\n 'migrate to server components',\n 'tighten type signatures',\n 'investigate flaky e2e tests',\n 'add keyboard shortcuts',\n 'improve empty states',\n];\n\nfunction anonymize<T extends { cwd: string | null; ai_title: string | null; id: string }>(\n rows: T[],\n): T[] {\n const projectMap = new Map<string, string>();\n return rows.map((s, i) => {\n if (!s.cwd) return s;\n const base = s.cwd.split('/').filter(Boolean).pop() ?? '';\n if (!projectMap.has(base)) {\n projectMap.set(base, DEMO_PROJECTS[projectMap.size % DEMO_PROJECTS.length]);\n }\n return {\n ...s,\n cwd: `/Users/demo/code/${projectMap.get(base)}`,\n ai_title: s.ai_title ? DEMO_TITLES[i % DEMO_TITLES.length] : null,\n };\n });\n}\n\nfunction injectMockCursorSessions<T extends { id: string; tool: string; started_at: number; ended_at: number | null; cwd: string | null; confidence: string; summary: string | null; ai_title: string | null; tags: string | null }>(\n rows: T[],\n): T[] {\n const now = Date.now();\n const extra: T[] = [];\n for (let i = 0; i < 160; i++) {\n const proj = DEMO_PROJECTS[i % DEMO_PROJECTS.length];\n const start = now - (i * 2 + 1) * 2_700_000 - Math.random() * 3_600_000;\n const dur = (15 + Math.random() * 80) * 60_000;\n extra.push({\n id: `demo-cursor-${i}`,\n tool: 'cursor',\n started_at: Math.round(start),\n ended_at: Math.round(start + dur),\n cwd: `/Users/demo/code/${proj}`,\n confidence: 'high',\n summary: null,\n ai_title: DEMO_TITLES[i % DEMO_TITLES.length],\n tags: null,\n } as T);\n }\n return [...rows, ...extra].sort((a, b) => b.started_at - a.started_at);\n}\n\nconst AGENTS = new Set(['all', 'claude-code', 'codex', 'cursor']);\n\nexport default async function DashboardPage({ searchParams }: { searchParams: Promise<{ demo?: string; agent?: string; codexAccount?: string }> }) {\n if (process.env.VIBEMETER_SITE === 'marketing') {\n return <MarketingPage />;\n }\n\n const locale = await getServerLocale();\n const params = await searchParams;\n const demo = params.demo === '1' || params.demo === 'true';\n const initialAgent = AGENTS.has(params.agent ?? '') ? params.agent as 'all' | 'claude-code' | 'codex' | 'cursor' : 'all';\n\n const db = getDb();\n const codexAccounts = await getCodexAccounts();\n const requestedCodexAccountId = params.codexAccount ?? null;\n const selectedCodexAccountId =\n requestedCodexAccountId && codexAccounts.some((account) => account.accountId === requestedCodexAccountId)\n ? requestedCodexAccountId\n : null;\n\n let sessions = db.prepare(`\n SELECT id, tool, started_at, ended_at, cwd, confidence, summary, ai_title, tags\n FROM sessions\n ORDER BY started_at DESC\n `).all() as Pick<SessionRow, 'id' | 'tool' | 'started_at' | 'ended_at' | 'cwd' | 'confidence' | 'summary' | 'ai_title' | 'tags'>[];\n\n if (demo) {\n sessions = anonymize(sessions);\n sessions = injectMockCursorSessions(sessions);\n }\n\n const claudeUsageRow = getLatestUsageSnapshot(db, 'statusline');\n const codexUsageRow = selectedCodexAccountId\n ? getLatestUsageSnapshot(db, 'codex', selectedCodexAccountId)\n : getLatestUsageSnapshot(db, 'codex');\n\n const toUsageInfo = (row: typeof claudeUsageRow) => row ? {\n window_5h_used_pct: row.window_5h_used_pct,\n window_weekly_used_pct: row.window_weekly_used_pct,\n reset_at_5h: row.reset_at_5h,\n reset_at_weekly: row.reset_at_weekly,\n } : null;\n\n // For demo, also fabricate a \"today's timeline\" mostly populated with cursor work\n let timeline = dayTimeline(0);\n if (demo) {\n const dayStart = new Date().setHours(0, 0, 0, 0);\n const mockToday = [\n { id: 'demo-t1', tool: 'cursor', project: 'kanban-board', startMs: dayStart + 9 * 3_600_000, endMs: dayStart + 10 * 3_600_000 + 30 * 60_000, aiTitle: 'add drag-drop sorting' },\n { id: 'demo-t2', tool: 'claude-code', project: 'note-vault', startMs: dayStart + 10 * 3_600_000 + 45 * 60_000, endMs: dayStart + 12 * 3_600_000 + 15 * 60_000, aiTitle: 'wire markdown export' },\n { id: 'demo-t3', tool: 'cursor', project: 'pomodoro', startMs: dayStart + 13 * 3_600_000, endMs: dayStart + 14 * 3_600_000 + 50 * 60_000, aiTitle: 'fix timer drift' },\n { id: 'demo-t4', tool: 'codex', project: 'recipe-box', startMs: dayStart + 15 * 3_600_000, endMs: dayStart + 17 * 3_600_000, aiTitle: 'design ingredient parser' },\n { id: 'demo-t5', tool: 'cursor', project: 'habit-tracker', startMs: dayStart + 17 * 3_600_000 + 10 * 60_000, endMs: dayStart + 19 * 3_600_000, aiTitle: 'streak animation polish' },\n { id: 'demo-t6', tool: 'cursor', project: 'budget-app', startMs: dayStart + 20 * 3_600_000, endMs: dayStart + 21 * 3_600_000 + 30 * 60_000, aiTitle: 'csv import wizard' },\n ];\n timeline = { dateLabel: new Date().toISOString().slice(0, 10), sessions: mockToday };\n }\n\n return (\n <div className=\"min-h-screen bg-zinc-950 text-zinc-100 font-mono\">\n <div className=\"max-w-6xl mx-auto px-6 py-8\">\n <div className=\"mb-6 flex items-start justify-between gap-4\">\n <div>\n <h1 className=\"text-xl font-semibold tracking-tight text-zinc-100\">\n <span className=\"text-violet-400\">Vibe</span>meter\n </h1>\n <p className=\"text-zinc-600 text-xs mt-1\">{t(locale, 'header.tagline')}</p>\n </div>\n <div className=\"flex items-center gap-2\">\n <LocaleSwitcher />\n <Link\n href=\"/settings\"\n className=\"rounded-md border border-zinc-800 px-3 py-2 text-xs text-zinc-400 transition-colors hover:border-zinc-600 hover:text-zinc-100\"\n >\n {t(locale, 'common.settings')}\n </Link>\n <Link\n href=\"/admin\"\n className=\"rounded-md border border-zinc-800 px-3 py-2 text-xs text-zinc-400 transition-colors hover:border-zinc-600 hover:text-zinc-100\"\n >\n {t(locale, 'common.admin')}\n </Link>\n </div>\n </div>\n\n <Dashboard\n sessions={sessions}\n streak={activityStreak()}\n allBurndown={burndownPoints(168)}\n claudeBurndown={burndownPoints(168, 'statusline')}\n codexBurndown={burndownPoints(168, 'codex', selectedCodexAccountId)}\n hotspots={fileHotspots(8)}\n spending={spendingStats()}\n timeline={timeline}\n achievements={achievements()}\n claudeUsage={toUsageInfo(claudeUsageRow)}\n codexUsage={toUsageInfo(codexUsageRow)}\n codexAccounts={codexAccounts}\n selectedCodexAccountId={selectedCodexAccountId}\n initialToolFilter={initialAgent}\n />\n </div>\n </div>\n );\n}\n","import { getDb } from './db';\n\nexport interface ToolSplit {\n tool: string;\n sessions: number;\n totalMs: number;\n pct: number;\n}\n\nexport function toolSplit(): ToolSplit[] {\n const rows = getDb().prepare(`\n SELECT tool,\n COUNT(*) AS sessions,\n SUM(COALESCE(ended_at, started_at) - started_at) AS total_ms\n FROM sessions\n GROUP BY tool\n ORDER BY total_ms DESC\n `).all() as { tool: string; sessions: number; total_ms: number }[];\n\n const grand = rows.reduce((s, r) => s + (r.total_ms ?? 0), 0) || 1;\n return rows.map((r) => ({\n tool: r.tool,\n sessions: r.sessions,\n totalMs: r.total_ms ?? 0,\n pct: Math.round(((r.total_ms ?? 0) / grand) * 100),\n }));\n}\n\nexport interface StreakInfo {\n current: number; // consecutive days up to today\n longest: number;\n totalDays: number;\n heatmap: { date: string; count: number }[]; // last 84 days (12 weeks)\n}\n\nexport function activityStreak(): StreakInfo {\n const rows = getDb().prepare(`\n SELECT DATE(started_at / 1000, 'unixepoch', 'localtime') AS day,\n COUNT(*) AS n\n FROM sessions\n GROUP BY day\n ORDER BY day ASC\n `).all() as { day: string; n: number }[];\n\n const byDay = new Map(rows.map((r) => [r.day, r.n]));\n\n // Build last 84 days heatmap\n const heatmap: { date: string; count: number }[] = [];\n const now = new Date();\n for (let i = 83; i >= 0; i--) {\n const d = new Date(now);\n d.setDate(d.getDate() - i);\n const key = d.toISOString().slice(0, 10);\n heatmap.push({ date: key, count: byDay.get(key) ?? 0 });\n }\n\n // Current streak (backwards from today)\n let current = 0;\n for (let i = 0; i < 365; i++) {\n const d = new Date(now);\n d.setDate(d.getDate() - i);\n const key = d.toISOString().slice(0, 10);\n if (byDay.has(key)) { current++; } else { break; }\n }\n\n // Longest streak\n let longest = 0, run = 0;\n const allDays = rows.map((r) => r.day).sort();\n for (let i = 0; i < allDays.length; i++) {\n if (i === 0) { run = 1; continue; }\n const prev = new Date(allDays[i - 1]);\n const cur = new Date(allDays[i]);\n const diff = (cur.getTime() - prev.getTime()) / 86400000;\n run = diff === 1 ? run + 1 : 1;\n if (run > longest) longest = run;\n }\n if (current > longest) longest = current;\n\n return { current, longest, totalDays: byDay.size, heatmap };\n}\n\nexport interface BurndownPoint {\n ts: number;\n pct5h: number | null;\n pctWeekly: number | null;\n}\n\nexport function burndownPoints(limitHours = 168, source?: string, accountId?: string | null): BurndownPoint[] {\n const since = Date.now() - limitHours * 3_600_000;\n const q = source && accountId != null\n ? `SELECT captured_at AS ts, window_5h_used_pct AS pct5h, window_weekly_used_pct AS pctWeekly\n FROM usage_snapshots WHERE captured_at > ? AND source = ? AND account_id = ? ORDER BY captured_at ASC`\n : source\n ? `SELECT captured_at AS ts, window_5h_used_pct AS pct5h, window_weekly_used_pct AS pctWeekly\n FROM usage_snapshots WHERE captured_at > ? AND source = ? ORDER BY captured_at ASC`\n : `SELECT captured_at AS ts, window_5h_used_pct AS pct5h, window_weekly_used_pct AS pctWeekly\n FROM usage_snapshots WHERE captured_at > ? ORDER BY captured_at ASC`;\n const args = source && accountId != null ? [since, source, accountId] : source ? [since, source] : [since];\n return (getDb().prepare(q).all(...args) as BurndownPoint[]);\n}\n\nexport interface FileHotspot {\n path: string;\n changes: number;\n sessions: number;\n}\n\nexport function fileHotspots(limit = 10): FileHotspot[] {\n return getDb().prepare(`\n SELECT path,\n COUNT(*) AS changes,\n COUNT(DISTINCT session_id) AS sessions\n FROM file_changes\n GROUP BY path\n ORDER BY changes DESC\n LIMIT ?\n `).all(limit) as FileHotspot[];\n}\n\nexport interface CodexCategorySplit {\n category: string;\n count: number;\n}\n\nexport function codexCategories(): CodexCategorySplit[] {\n return getDb().prepare(`\n SELECT COALESCE(codex_category, 'unclassified') AS category,\n COUNT(*) AS count\n FROM sessions\n WHERE tool = 'codex'\n GROUP BY category\n ORDER BY count DESC\n `).all() as CodexCategorySplit[];\n}\n\nexport interface DailySpend {\n date: string; // YYYY-MM-DD\n claudeUsd: number;\n codexTokens: number;\n}\n\nexport interface SpendingStats {\n claudeTotalUsd: number;\n codexTotalTokens: number;\n daily: DailySpend[]; // last 14 days\n}\n\nexport function spendingStats(): SpendingStats {\n const db = getDb();\n\n // Claude Code: sum max cost per session from usage_snapshots JSON\n const claudeTotal = (db.prepare(`\n SELECT COALESCE(SUM(session_max), 0) AS total\n FROM (\n SELECT MAX(CAST(json_extract(raw_output, '$.cost.total_cost_usd') AS REAL)) AS session_max\n FROM usage_snapshots\n WHERE source = 'statusline'\n AND json_extract(raw_output, '$.cost.total_cost_usd') IS NOT NULL\n GROUP BY json_extract(raw_output, '$.session_id')\n )\n `).get() as { total: number }).total;\n\n // Codex: sum tokens_used\n const codexTotal = (db.prepare(`\n SELECT COALESCE(SUM(tokens_used), 0) AS total\n FROM sessions WHERE tool = 'codex' AND tokens_used IS NOT NULL\n `).get() as { total: number }).total;\n\n // Daily Claude cost: per session per day (max cost snapshot that day)\n const since = Date.now() - 14 * 86_400_000;\n const claudeDaily = db.prepare(`\n SELECT DATE(captured_at/1000, 'unixepoch', 'localtime') AS day,\n json_extract(raw_output, '$.session_id') AS sid,\n MAX(CAST(json_extract(raw_output, '$.cost.total_cost_usd') AS REAL)) AS cost\n FROM usage_snapshots\n WHERE source = 'statusline'\n AND captured_at > ?\n AND json_extract(raw_output, '$.cost.total_cost_usd') IS NOT NULL\n GROUP BY day, sid\n `).all(since) as { day: string; sid: string; cost: number }[];\n\n const claudeByDay = new Map<string, number>();\n for (const r of claudeDaily) {\n claudeByDay.set(r.day, (claudeByDay.get(r.day) ?? 0) + (r.cost ?? 0));\n }\n\n // Daily Codex tokens\n const codexDaily = db.prepare(`\n SELECT DATE(started_at/1000, 'unixepoch', 'localtime') AS day,\n SUM(tokens_used) AS tokens\n FROM sessions\n WHERE tool = 'codex' AND tokens_used IS NOT NULL AND started_at > ?\n GROUP BY day\n `).all(since) as { day: string; tokens: number }[];\n\n const codexByDay = new Map(codexDaily.map((r) => [r.day, r.tokens]));\n\n // Build last 14 days\n const daily: DailySpend[] = [];\n const now = new Date();\n for (let i = 13; i >= 0; i--) {\n const d = new Date(now);\n d.setDate(d.getDate() - i);\n const key = d.toISOString().slice(0, 10);\n daily.push({\n date: key,\n claudeUsd: claudeByDay.get(key) ?? 0,\n codexTokens: codexByDay.get(key) ?? 0,\n });\n }\n\n return { claudeTotalUsd: claudeTotal, codexTotalTokens: codexTotal, daily };\n}\n\nexport interface TimelineSession {\n id: string;\n tool: string;\n project: string;\n startMs: number;\n endMs: number;\n aiTitle: string | null;\n}\n\nexport function dayTimeline(dayOffset = 0): { dateLabel: string; sessions: TimelineSession[] } {\n const target = new Date();\n target.setDate(target.getDate() + dayOffset);\n target.setHours(0, 0, 0, 0);\n const start = target.getTime();\n const end = start + 86_400_000;\n\n const rows = getDb().prepare(`\n SELECT id, tool, cwd, started_at, ended_at, ai_title\n FROM sessions\n WHERE started_at < ? AND COALESCE(ended_at, started_at + 60000) > ?\n ORDER BY started_at ASC\n `).all(end, start) as { id: string; tool: string; cwd: string | null; started_at: number; ended_at: number | null; ai_title: string | null }[];\n\n return {\n dateLabel: target.toISOString().slice(0, 10),\n sessions: rows.map((r) => ({\n id: r.id,\n tool: r.tool,\n project: r.cwd?.split('/').filter(Boolean).pop() ?? '—',\n startMs: r.started_at,\n endMs: r.ended_at ?? Math.min(Date.now(), end),\n aiTitle: r.ai_title,\n })),\n };\n}\n\nexport interface Achievement {\n id: string;\n title: string;\n description: string;\n unlocked: boolean;\n progress?: { current: number; target: number };\n}\n\nexport function achievements(): Achievement[] {\n const db = getDb();\n const totalSessions = (db.prepare(`SELECT COUNT(*) AS n FROM sessions`).get() as { n: number }).n;\n const longestStreak = activityStreak().longest;\n const sp = spendingStats();\n const longestMs = (db.prepare(`\n SELECT COALESCE(MAX(COALESCE(ended_at, started_at) - started_at), 0) AS ms FROM sessions\n `).get() as { ms: number }).ms;\n const projectCount = (db.prepare(`\n SELECT COUNT(DISTINCT cwd) AS n FROM sessions WHERE cwd IS NOT NULL\n `).get() as { n: number }).n;\n const lateNight = (db.prepare(`\n SELECT COUNT(*) AS n FROM sessions\n WHERE CAST(strftime('%H', started_at/1000, 'unixepoch', 'localtime') AS INT) >= 23\n OR CAST(strftime('%H', started_at/1000, 'unixepoch', 'localtime') AS INT) < 4\n `).get() as { n: number }).n;\n const earlyBird = (db.prepare(`\n SELECT COUNT(*) AS n FROM sessions\n WHERE CAST(strftime('%H', started_at/1000, 'unixepoch', 'localtime') AS INT) >= 4\n AND CAST(strftime('%H', started_at/1000, 'unixepoch', 'localtime') AS INT) < 7\n `).get() as { n: number }).n;\n const toolCount = (db.prepare(`SELECT COUNT(DISTINCT tool) AS n FROM sessions`).get() as { n: number }).n;\n\n const prog = (current: number, target: number) => ({ current: Math.min(current, target), target });\n\n return [\n { id: 'sessions-100', title: '百战不殆', description: '100 sessions logged', unlocked: totalSessions >= 100, progress: prog(totalSessions, 100) },\n { id: 'sessions-500', title: '已成习惯', description: '500 sessions logged', unlocked: totalSessions >= 500, progress: prog(totalSessions, 500) },\n { id: 'sessions-1000', title: '千锤百炼', description: '1000 sessions logged', unlocked: totalSessions >= 1000, progress: prog(totalSessions, 1000) },\n { id: 'streak-7', title: '一周连击', description: '7-day coding streak', unlocked: longestStreak >= 7, progress: prog(longestStreak, 7) },\n { id: 'streak-30', title: '月度坚持', description: '30-day coding streak', unlocked: longestStreak >= 30, progress: prog(longestStreak, 30) },\n { id: 'spend-10', title: '小试牛刀', description: 'Claude spend $10+', unlocked: sp.claudeTotalUsd >= 10, progress: prog(sp.claudeTotalUsd, 10) },\n { id: 'spend-100', title: '挥金如土', description: 'Claude spend $100+', unlocked: sp.claudeTotalUsd >= 100, progress: prog(sp.claudeTotalUsd, 100) },\n { id: 'tokens-100m', title: 'Token 富翁', description: '100M Codex tokens', unlocked: sp.codexTotalTokens >= 100_000_000, progress: prog(sp.codexTotalTokens, 100_000_000) },\n { id: 'tokens-1b', title: 'Token 大户', description: '1B Codex tokens', unlocked: sp.codexTotalTokens >= 1_000_000_000, progress: prog(sp.codexTotalTokens, 1_000_000_000) },\n { id: 'marathon-4h', title: '马拉松选手', description: 'Single session 4h+', unlocked: longestMs >= 4 * 3_600_000, progress: prog(longestMs, 4 * 3_600_000) },\n { id: 'marathon-8h', title: '通宵达旦', description: 'Single session 8h+', unlocked: longestMs >= 8 * 3_600_000, progress: prog(longestMs, 8 * 3_600_000) },\n { id: 'projects-10', title: '博学多才', description: 'Worked on 10+ projects', unlocked: projectCount >= 10, progress: prog(projectCount, 10) },\n { id: 'projects-30', title: '杂家', description: 'Worked on 30+ projects', unlocked: projectCount >= 30, progress: prog(projectCount, 30) },\n { id: 'night-owl', title: '夜猫子', description: 'Past-midnight sessions 10+', unlocked: lateNight >= 10, progress: prog(lateNight, 10) },\n { id: 'early-bird', title: '晨型人', description: 'Pre-7am sessions 5+', unlocked: earlyBird >= 5, progress: prog(earlyBird, 5) },\n { id: 'multi-tool', title: '多面手', description: 'Used 3 different tools', unlocked: toolCount >= 3, progress: prog(toolCount, 3) },\n ];\n}\n","import Image from 'next/image';\n\nconst HIGHLIGHTS = [\n ['Usage windows', 'Claude Code and Codex 5h / 7-day quota snapshots.'],\n ['Work history', 'Sessions, projects, activity heatmap, spend, and tokens.'],\n ['macOS helper', 'Floating meter and optional voice alerts when agents finish.'],\n];\n\nconst SOURCES = [\n '~/.claude/projects/**/*.jsonl',\n '~/.codex/state_5.sqlite',\n 'Cursor workspaceStorage',\n];\n\nexport function MarketingPage() {\n return (\n <main className=\"min-h-screen bg-zinc-950 text-zinc-100\">\n <section className=\"mx-auto grid max-w-6xl items-center gap-10 px-6 pb-8 pt-10 lg:min-h-[78vh] lg:grid-cols-[0.86fr_1.14fr]\">\n <div>\n <p className=\"mb-3 text-xs font-medium uppercase tracking-[0.24em] text-violet-300\">local-first AI coding meter</p>\n <h1 className=\"text-4xl font-semibold tracking-tight text-zinc-50 sm:text-5xl\">Vibemeter</h1>\n <p className=\"mt-4 max-w-xl text-sm leading-7 text-zinc-400\">\n Track Claude Code, Codex, and Cursor usage from local files. Dashboard, macOS floating meter, and voice notifications when long-running agents finish.\n </p>\n\n <ul className=\"mt-5 space-y-2 text-sm text-zinc-400\">\n <li><span className=\"text-zinc-200\">No cloud:</span> reads files already on your disk.</li>\n <li><span className=\"text-zinc-200\">Quota view:</span> 5h / 7-day windows for Claude Code and Codex.</li>\n <li><span className=\"text-zinc-200\">macOS helper:</span> floating meter plus optional spoken completion alerts.</li>\n </ul>\n\n <div className=\"mt-7 rounded-lg border border-zinc-800 bg-zinc-900 p-4 font-mono\">\n <p className=\"mb-2 text-xs uppercase tracking-wider text-zinc-500\">one-command install</p>\n <code className=\"block overflow-x-auto whitespace-nowrap rounded-md bg-zinc-950 px-3 py-3 text-sm text-zinc-100\">\n curl -fsSL https://vibemeter.siney.top/install.sh | bash\n </code>\n </div>\n\n <div className=\"mt-5 flex flex-wrap gap-3 text-xs text-zinc-400\">\n <a className=\"rounded-full border border-violet-500/40 bg-violet-500/10 px-4 py-2 text-violet-100 transition-colors hover:bg-violet-500/20\" href=\"/install.sh\">\n install.sh\n </a>\n <a className=\"rounded-full border border-zinc-700 px-4 py-2 transition-colors hover:border-zinc-500 hover:text-zinc-100\" href=\"https://www.npmjs.com/package/@hirra/vibemeter\">\n npm\n </a>\n </div>\n </div>\n\n <div className=\"space-y-4\">\n <Image\n src=\"/float-expanded.png\"\n alt=\"Vibemeter expanded floating meter\"\n width={520}\n height={360}\n className=\"mx-auto block h-auto w-full max-w-[420px] rounded-lg border border-zinc-800 bg-zinc-900 shadow-2xl shadow-black/50\"\n priority\n />\n <Image\n src=\"/float-collapsed.png\"\n alt=\"Vibemeter collapsed progress bar\"\n width={520}\n height={260}\n className=\"mx-auto block h-auto w-full max-w-[420px] rounded-lg border border-zinc-800 bg-zinc-900\"\n />\n </div>\n </section>\n\n <section className=\"mx-auto max-w-6xl px-6 pb-14\">\n <div className=\"grid gap-3 md:grid-cols-3\">\n {HIGHLIGHTS.map(([title, body]) => (\n <div key={title} className=\"rounded-lg border border-zinc-800 bg-zinc-900 px-4 py-4\">\n <h2 className=\"text-sm font-semibold text-zinc-100\">{title}</h2>\n <p className=\"mt-2 text-xs leading-6 text-zinc-500\">{body}</p>\n </div>\n ))}\n </div>\n\n <div className=\"mt-4 grid gap-4 lg:grid-cols-[1fr_0.72fr]\">\n <div className=\"rounded-lg border border-zinc-800 bg-zinc-900 p-5\">\n <h2 className=\"text-sm font-semibold text-zinc-100\">Data stays local</h2>\n <p className=\"mt-2 text-xs leading-6 text-zinc-500\">\n Vibemeter reads the files your tools already write. No account, no telemetry, no cloud database.\n </p>\n <div className=\"mt-4 flex flex-wrap gap-2\">\n {SOURCES.map((source) => (\n <code key={source} className=\"rounded-md border border-zinc-800 bg-zinc-950 px-2.5 py-1.5 text-[11px] text-zinc-400\">\n {source}\n </code>\n ))}\n </div>\n </div>\n\n <div className=\"rounded-lg border border-zinc-800 bg-zinc-900 p-5\">\n <h2 className=\"text-sm font-semibold text-zinc-100\">Voice notifications</h2>\n <p className=\"mt-2 text-xs leading-6 text-zinc-500\">\n On macOS, Vibemeter can install Claude Code hooks and Codex notify config, then speak a short completion alert.\n </p>\n <a className=\"mt-4 inline-block rounded-md border border-zinc-700 px-3 py-2 text-xs text-zinc-300 transition-colors hover:border-zinc-500 hover:text-zinc-100\" href=\"/settings\">\n Settings\n </a>\n </div>\n </div>\n </section>\n </main>\n );\n}\n"],"names":["Dashboard","Error","warnOnce","_","process","env","NODE_ENV","warnings","Set","msg","has","console","warn","add","getAssetToken","getAssetTokenQuery","getDeploymentId","getDeploymentIdQuery","deploymentId","window","document","documentElement","dataset","dplId","NEXT_DEPLOYMENT_ID","undefined","ampersand","id","NEXT_IMMUTABLE_ASSET_TOKEN","getImageBlurSvg","widthInt","heightInt","blurWidth","blurHeight","blurDataURL","objectFit","std","svgWidth","svgHeight","viewBox","preserveAspectRatio","VALID_LOADERS","imageConfigDefault","deviceSizes","imageSizes","path","loader","loaderFile","domains","disableStaticImages","minimumCacheTTL","formats","maximumDiskCacheSize","maximumRedirects","maximumResponseBody","dangerouslyAllowLocalIP","dangerouslyAllowSVG","contentSecurityPolicy","contentDispositionType","localPatterns","remotePatterns","qualities","unoptimized","customCacheHandler","getImgProps","VALID_LOADING_VALUES","INVALID_BACKGROUND_SIZE_VALUES","isStaticRequire","src","default","isStaticImageData","isStaticImport","allImgs","Map","perfObserver","getInt","x","Number","isFinite","NaN","test","parseInt","getWidths","allSizes","width","sizes","viewportWidthRe","percentSizes","match","exec","push","length","smallestRatio","Math","min","widths","filter","s","kind","map","w","find","p","generateImgAttrs","config","quality","startsWith","qIndex","indexOf","params","URLSearchParams","slice","srcDpl","get","append","toString","srcSet","last","i","join","priority","preload","loading","className","height","fill","style","overrideSrc","onLoad","onLoadingComplete","placeholder","fetchPriority","decoding","layout","objectPosition","lazyBoundary","lazyRoot","rest","_state","imgConf","showAltText","blurComplete","defaultLoader","c","sort","a","b","isDefaultLoader","customImageLoader","obj","opts","layoutToStyle","intrinsic","maxWidth","responsive","layoutToSizes","layoutStyle","layoutSizes","staticSrc","staticImageData","JSON","stringify","ratio","round","isLazy","split","endsWith","qualityInt","output","position","isNaN","includes","String","VALID_BLUR_EXT","urlStr","url","URL","err","pathname","search","legacyKey","legacyValue","Object","entries","PerformanceObserver","entryList","entry","getEntries","imgSrc","element","lcpImage","observe","type","buffered","error","imgStyle","assign","left","top","right","bottom","color","backgroundImage","backgroundSize","placeholderStyle","backgroundPosition","backgroundRepeat","imgAttributes","loadingFinal","fullUrl","e","location","href","set","props","meta","createClientModuleProxy","__turbopack_context__","n","Image","configEnv","__NEXT_IMAGE_OPTS","globalThis","__NEXT_IMAGE_IMPORTED","handleLoading","img","onLoadRef","onLoadingCompleteRef","setBlurComplete","sizesInput","decode","Promise","resolve","catch","then","parentElement","isConnected","current","event","Event","defineProperty","writable","value","prevented","stopped","nativeEvent","currentTarget","target","isDefaultPrevented","isPropagationStopped","persist","preventDefault","stopPropagation","origSrc","searchParams","getAttribute","widthViewportRatio","getBoundingClientRect","innerWidth","getComputedStyle","valid","heightModified","widthModified","getDynamicProps","Boolean","use","fetchpriority","ImageElement","forwardRef","setShowAltText","onError","forwardedRef","ownRef","useCallback","complete","ref","useMergedRef","data-nimg","ImagePreload","isAppRouter","as","imageSrcSet","crossOrigin","referrerPolicy","ReactDOM","Head","link","rel","pagesRouter","useContext","RouterContext","configContext","ImageConfigContext","useMemo","useRef","useEffect","useState","imgMeta","findClosestQuality","q","reduce","prev","cur","abs","missingValues","delete","remaining","NEXT_RUNTIME","hasLocalMatch","require","parsedSrc","hasRemoteMatch","hostname","encodeURIComponent","__next_img_default","getImageProps","imgProps","key","module","exports","toolSplit","rows","prepare","all","grand","r","total_ms","tool","sessions","totalMs","pct","activityStreak","byDay","day","heatmap","now","Date","d","setDate","getDate","toISOString","date","count","longest","run","allDays","diff","getTime","totalDays","size","burndownPoints","limitHours","source","accountId","since","args","fileHotspots","limit","codexCategories","spendingStats","db","claudeTotal","total","codexTotal","claudeDaily","claudeByDay","cost","codexDaily","codexByDay","tokens","daily","claudeUsd","codexTokens","claudeTotalUsd","codexTotalTokens","dayTimeline","dayOffset","setHours","start","end","dateLabel","project","cwd","pop","startMs","started_at","endMs","ended_at","aiTitle","ai_title","achievements","totalSessions","longestStreak","sp","longestMs","ms","projectCount","lateNight","earlyBird","toolCount","prog","title","description","unlocked","progress"],"mappings":"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","ignoreList":[0,1,2,3,4,5,6,8,9,10,11]}