@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.
- package/.next/BUILD_ID +1 -1
- package/.next/app-path-routes-manifest.json +7 -1
- package/.next/build-manifest.json +7 -8
- package/.next/fallback-build-manifest.json +3 -3
- package/.next/prerender-manifest.json +16 -12
- package/.next/required-server-files.js +5 -4
- package/.next/required-server-files.json +5 -4
- package/.next/routes-manifest.json +36 -0
- package/.next/server/app/_global-error/page/build-manifest.json +4 -5
- package/.next/server/app/_global-error/page.js +4 -4
- package/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page/build-manifest.json +4 -5
- package/.next/server/app/_not-found/page.js +5 -4
- package/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/admin/page/build-manifest.json +4 -5
- package/.next/server/app/admin/page.js +7 -5
- package/.next/server/app/admin/page.js.nft.json +1 -1
- package/.next/server/app/admin/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/codex-accounts/route.js +1 -1
- package/.next/server/app/api/codex-accounts/route.js.nft.json +1 -1
- package/.next/server/app/api/float/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/float/route/build-manifest.json +9 -0
- package/.next/server/app/api/float/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/float/route.js +8 -0
- package/.next/server/app/api/float/route.js.map +5 -0
- package/.next/server/app/api/float/route.js.nft.json +1 -0
- package/.next/server/app/api/float/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/import-sessions/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/tags/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/tags/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/route.js +1 -1
- package/.next/server/app/api/sessions/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/alerts/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/settings/alerts/route/build-manifest.json +9 -0
- package/.next/server/app/api/settings/alerts/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/settings/alerts/route.js +9 -0
- package/.next/server/app/api/settings/alerts/route.js.map +5 -0
- package/.next/server/app/api/settings/alerts/route.js.nft.json +1 -0
- package/.next/server/app/api/settings/alerts/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/settings/notify/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/settings/notify/route/build-manifest.json +9 -0
- package/.next/server/app/api/settings/notify/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/settings/notify/route.js +7 -0
- package/.next/server/app/api/settings/notify/route.js.map +5 -0
- package/.next/server/app/api/settings/notify/route.js.nft.json +1 -0
- package/.next/server/app/api/settings/notify/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/usage/route.js +1 -1
- package/.next/server/app/api/usage/route.js.nft.json +1 -1
- package/.next/server/app/float/page/app-paths-manifest.json +3 -0
- package/.next/server/app/float/page/build-manifest.json +16 -0
- package/.next/server/app/float/page/next-font-manifest.json +11 -0
- package/.next/server/app/float/page/react-loadable-manifest.json +1 -0
- package/.next/server/app/float/page/server-reference-manifest.json +4 -0
- package/.next/server/app/float/page.js +15 -0
- package/.next/server/app/float/page.js.map +5 -0
- package/.next/server/app/float/page.js.nft.json +1 -0
- package/.next/server/app/float/page_client-reference-manifest.js +3 -0
- package/.next/server/app/install.sh/route/app-paths-manifest.json +3 -0
- package/.next/server/app/install.sh/route/build-manifest.json +9 -0
- package/.next/server/app/install.sh/route/server-reference-manifest.json +4 -0
- package/.next/server/app/install.sh/route.js +6 -0
- package/.next/server/app/install.sh/route.js.map +5 -0
- package/.next/server/app/install.sh/route.js.nft.json +1 -0
- package/.next/server/app/install.sh/route_client-reference-manifest.js +3 -0
- package/.next/server/app/install.sh.body +108 -0
- package/.next/server/app/install.sh.meta +1 -0
- package/.next/server/app/page/build-manifest.json +4 -5
- package/.next/server/app/page.js +8 -5
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/page/app-paths-manifest.json +3 -0
- package/.next/server/app/settings/page/build-manifest.json +16 -0
- package/.next/server/app/settings/page/next-font-manifest.json +11 -0
- package/.next/server/app/settings/page/react-loadable-manifest.json +1 -0
- package/.next/server/app/settings/page/server-reference-manifest.json +4 -0
- package/.next/server/app/settings/page.js +17 -0
- package/.next/server/app/settings/page.js.map +5 -0
- package/.next/server/app/settings/page.js.nft.json +1 -0
- package/.next/server/app/settings/page_client-reference-manifest.js +3 -0
- package/.next/server/app-paths-manifest.json +7 -1
- package/.next/server/chunks/[externals]__0_i~3ox._.js +3 -0
- package/.next/server/chunks/[externals]__0_i~3ox._.js.map +1 -0
- package/.next/server/chunks/[externals]__13p_1zh._.js +3 -0
- package/.next/server/chunks/[externals]__13p_1zh._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__01t2c3w._.js +38 -0
- package/.next/server/chunks/[root-of-the-server]__01t2c3w._.js.map +1 -0
- package/.next/server/chunks/{[root-of-the-server]__0g0u0lm._.js → [root-of-the-server]__024yzee._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__00q0o~z._.js → [root-of-the-server]__082iwfa._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__0chedn~._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0mwf0bn._.js +38 -0
- package/.next/server/chunks/[root-of-the-server]__0mwf0bn._.js.map +1 -0
- package/.next/server/chunks/{[root-of-the-server]__0-74syk._.js → [root-of-the-server]__0ru3_it._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__0u6y_k1._.js +111 -0
- package/.next/server/chunks/[root-of-the-server]__0u6y_k1._.js.map +1 -0
- package/.next/server/chunks/{[root-of-the-server]__0866q87._.js → [root-of-the-server]__0xa4dzi._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__13415c6._.js +96 -0
- package/.next/server/chunks/[root-of-the-server]__13415c6._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__13j_28o._.js +96 -0
- package/.next/server/chunks/[root-of-the-server]__13j_28o._.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_float_route_actions_012j~jr.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_float_route_actions_012j~jr.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_settings_alerts_route_actions_0ydcyko.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_settings_alerts_route_actions_0ydcyko.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_settings_notify_route_actions_0-j35mb.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_settings_notify_route_actions_0-j35mb.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_install_sh_route_actions_0cj-6me.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_install_sh_route_actions_0cj-6me.js.map +1 -0
- package/.next/server/chunks/node_modules_next_06f88ko._.js +19 -0
- package/.next/server/chunks/node_modules_next_06f88ko._.js.map +1 -0
- package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_03jj5jj.js +18 -0
- package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_03jj5jj.js.map +1 -0
- package/.next/server/chunks/src_12i1qk5._.js +3 -0
- package/.next/server/chunks/src_12i1qk5._.js.map +1 -0
- package/.next/server/chunks/src_lib_alerts_ticker_ts_0n6oy1d._.js +169 -0
- package/.next/server/chunks/src_lib_alerts_ticker_ts_0n6oy1d._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__03mt8o0._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__03mt8o0._.js.map +1 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__098zro9._.js → [root-of-the-server]__090jxzh._.js} +2 -2
- package/.next/server/chunks/ssr/[root-of-the-server]__090jxzh._.js.map +1 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__09hgk-7._.js → [root-of-the-server]__0c3j40u._.js} +2 -2
- package/.next/server/chunks/ssr/[root-of-the-server]__0c3j40u._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0ot4nev._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0ot4nev._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0q_~l2m._.js +90 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0q_~l2m._.js.map +1 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__0cqes87._.js → [root-of-the-server]__0qt26ty._.js} +2 -2
- package/.next/server/chunks/ssr/[root-of-the-server]__0qt26ty._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0s5.uhg._.js +55 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0s5.uhg._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0x~-phx._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0x~-phx._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0y_zq8k._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0y_zq8k._.js.map +1 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__08qr2ji._.js → [root-of-the-server]__0~953ob._.js} +2 -2
- package/.next/server/chunks/ssr/[root-of-the-server]__0~953ob._.js.map +1 -0
- package/.next/server/chunks/ssr/_0-9j34y._.js +70 -0
- package/.next/server/chunks/ssr/_0-9j34y._.js.map +1 -0
- package/.next/server/chunks/ssr/_0jxmm9h._.js +6 -0
- package/.next/server/chunks/ssr/_0jxmm9h._.js.map +1 -0
- package/.next/server/chunks/ssr/_0lfe3wr._.js +3 -0
- package/.next/server/chunks/ssr/_0lfe3wr._.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_0i2xw~e._.js → _0nvprxh._.js} +5 -2
- package/.next/server/chunks/ssr/_0nvprxh._.js.map +1 -0
- package/.next/server/chunks/ssr/_0pugb10._.js +6 -0
- package/.next/server/chunks/ssr/_0pugb10._.js.map +1 -0
- package/.next/server/chunks/ssr/_next-internal_server_app_float_page_actions_0x6hm4p.js +3 -0
- package/.next/server/chunks/ssr/_next-internal_server_app_float_page_actions_0x6hm4p.js.map +1 -0
- package/.next/server/chunks/ssr/_next-internal_server_app_settings_page_actions_0mr68ai.js +3 -0
- package/.next/server/chunks/ssr/_next-internal_server_app_settings_page_actions_0mr68ai.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_@swc_helpers_cjs__interop_require_default_cjs_11~q6fv._.js +3 -0
- package/.next/server/chunks/ssr/node_modules_@swc_helpers_cjs__interop_require_default_cjs_11~q6fv._.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_09jzzl8._.js +3 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_09jzzl8._.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_next_dist_0e1izl_._.js → node_modules_next_dist_0h9llsw._.js} +2 -2
- package/.next/server/chunks/ssr/node_modules_next_dist_0h9llsw._.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_06b_a87.js +4 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_06b_a87.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0p_u4px.js +4 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0p_u4px.js.map +1 -0
- package/.next/server/chunks/ssr/src_0urkups._.js +3 -0
- package/.next/server/chunks/ssr/src_0urkups._.js.map +1 -0
- package/.next/server/chunks/ssr/src_components_0ox9d~w._.js +3 -0
- package/.next/server/chunks/ssr/src_components_0ox9d~w._.js.map +1 -0
- package/.next/server/chunks/ssr/src_components_CodexAccountsPanel_tsx_0n9xjzi._.js +1 -1
- package/.next/server/chunks/ssr/src_components_CodexAccountsPanel_tsx_0n9xjzi._.js.map +1 -1
- package/.next/server/chunks/ssr/src_components_FloatingWidget_tsx_089.6oo._.js +3 -0
- package/.next/server/chunks/ssr/src_components_FloatingWidget_tsx_089.6oo._.js.map +1 -0
- package/.next/server/chunks/ssr/src_lib_i18n_client_tsx_07pysgz._.js +3 -0
- package/.next/server/chunks/ssr/src_lib_i18n_client_tsx_07pysgz._.js.map +1 -0
- package/.next/server/edge/chunks/_0-m5tdn._.js +3 -0
- package/.next/server/edge/chunks/_0-m5tdn._.js.map +1 -0
- package/.next/server/edge/chunks/node_modules_next_dist_esm_build_templates_edge-wrapper_0mz-5sp.js.map +1 -0
- package/.next/server/edge/chunks/turbopack-node_modules_next_dist_esm_build_templates_edge-wrapper_0mz-5sp.js +3 -0
- package/.next/server/functions-config-manifest.json +4 -1
- package/.next/server/instrumentation/middleware-manifest.json +12 -0
- package/.next/server/instrumentation.js +4 -0
- package/.next/server/instrumentation.js.map +5 -0
- package/.next/server/instrumentation.js.nft.json +1 -0
- package/.next/server/middleware-build-manifest.js +7 -8
- package/.next/server/next-font-manifest.js +1 -1
- package/.next/server/next-font-manifest.json +8 -0
- package/.next/server/pages/500.html +1 -1
- package/.next/server/pages-manifest.json +0 -1
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/0bymg5d-lqs0o.js +5 -0
- package/.next/static/chunks/0ebdqsutnp8y4.js +1 -0
- package/.next/static/chunks/0i3~mnai-l497.js +1 -0
- package/.next/static/chunks/0idj4tdmyr934.js +1 -0
- package/.next/static/chunks/10eoi4q2wk80z.js +1 -0
- package/.next/static/chunks/10refkmyp9rbl.css +3 -0
- package/.next/static/chunks/{07lhk_q6pmm3r.js → 10u3y4bw1ayzs.js} +1 -1
- package/.next/static/chunks/{00gq-v0e07i1q.js → 115dplafwys-z.js} +1 -1
- package/.next/static/chunks/12-9memveha-v.js +1 -0
- package/.next/static/chunks/163s8y.j70104.js +4 -0
- package/.next/static/chunks/turbopack-0k9twle9a8sh6.js +1 -0
- package/.next/types/routes.d.ts +8 -2
- package/.next/types/validator.ts +54 -0
- package/README.md +57 -17
- package/bin/vibemeter-float.swift +970 -0
- package/bin/vibemeter-notify.sh +172 -0
- package/bin/vibemeter.mjs +385 -7
- package/package.json +2 -1
- package/public/demo1.png +0 -0
- package/public/float-ball.png +0 -0
- package/public/float-collapsed.png +0 -0
- package/public/float-expanded.png +0 -0
- package/public/pay-alipay.jpg +0 -0
- package/.next/server/app/_not-found.html +0 -1
- package/.next/server/app/_not-found.meta +0 -16
- package/.next/server/app/_not-found.rsc +0 -16
- package/.next/server/app/_not-found.segments/_full.segment.rsc +0 -16
- package/.next/server/app/_not-found.segments/_head.segment.rsc +0 -6
- package/.next/server/app/_not-found.segments/_index.segment.rsc +0 -5
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +0 -5
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +0 -5
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +0 -2
- package/.next/server/chunks/[root-of-the-server]__0y68a5d._.js +0 -96
- package/.next/server/chunks/[root-of-the-server]__0y68a5d._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__054lv8d._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__054lv8d._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__08qr2ji._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__098zro9._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__09hgk-7._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0cqes87._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0l.drdn._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0l.drdn._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0v1zqf~._.js +0 -120
- package/.next/server/chunks/ssr/[root-of-the-server]__0v1zqf~._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0v73tbn._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0v73tbn._.js.map +0 -1
- package/.next/server/chunks/ssr/_0ye~8el._.js +0 -7
- package/.next/server/chunks/ssr/_0ye~8el._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_0ck2~9g._.js +0 -3
- package/.next/server/chunks/ssr/node_modules_0ck2~9g._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_0i2xw~e._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_0e1izl_._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_0gsjr7_._.js +0 -3
- package/.next/server/chunks/ssr/node_modules_next_dist_0gsjr7_._.js.map +0 -1
- package/.next/server/pages/404.html +0 -1
- package/.next/static/chunks/002~6040mndie.css +0 -3
- package/.next/static/chunks/02g3221oh~3le.js +0 -2
- package/.next/static/chunks/0erq0bmub6w_z.js +0 -2
- package/.next/static/chunks/0ljfidstam_7k.js +0 -1
- package/.next/static/chunks/0pqt~8bl3ukh4.js +0 -4
- package/.next/static/chunks/turbopack-14vio.b1b9i4l.js +0 -1
- /package/.next/server/chunks/{[root-of-the-server]__0g0u0lm._.js.map → [root-of-the-server]__024yzee._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__00q0o~z._.js.map → [root-of-the-server]__082iwfa._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__0-74syk._.js.map → [root-of-the-server]__0ru3_it._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__0866q87._.js.map → [root-of-the-server]__0xa4dzi._.js.map} +0 -0
- /package/.next/static/{Ong62ufsHaRU36s0QK5ZZ → _Y03MiN6NI16Ms86q6vCJ}/_buildManifest.js +0 -0
- /package/.next/static/{Ong62ufsHaRU36s0QK5ZZ → _Y03MiN6NI16Ms86q6vCJ}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{Ong62ufsHaRU36s0QK5ZZ → _Y03MiN6NI16Ms86q6vCJ}/_ssgManifest.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/Dashboard.tsx","../../../../src/components/SessionsTable.tsx","../../../../src/components/ToolSplitCard.tsx","../../../../src/components/BurndownChart.tsx","../../../../src/components/FileHotspots.tsx","../../../../src/components/SpendingCard.tsx","../../../../src/components/ActivityCard.tsx","../../../../src/components/ProjectLeaderboard.tsx","../../../../src/components/AchievementsCard.tsx","../../../../node_modules/next/src/shared/lib/side-effect.tsx","../../../../node_modules/next/src/server/route-modules/app-page/vendored/contexts/head-manager-context.ts","../../../../node_modules/next/src/shared/lib/head.tsx","../../../../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/src/server/route-modules/app-page/vendored/contexts/image-config-context.ts","../../../../node_modules/next/src/server/route-modules/app-page/vendored/contexts/router-context.ts","../../../../node_modules/next/src/shared/lib/find-closest-quality.ts","../../../../node_modules/next/src/shared/lib/image-loader.ts","../../../../node_modules/next/src/client/image-component.tsx"],"sourcesContent":["'use client';\n\nimport { useState, useMemo } from 'react';\nimport Link from 'next/link';\nimport { usePathname, useRouter, useSearchParams } from 'next/navigation';\nimport { SessionsTable } from './SessionsTable';\nimport { ToolSplitCard } from './ToolSplitCard';\nimport { BurndownChart } from './BurndownChart';\nimport { FileHotspots } from './FileHotspots';\nimport { SpendingCard } from './SpendingCard';\nimport { ActivityCard } from './ActivityCard';\nimport { ProjectLeaderboard } from './ProjectLeaderboard';\nimport { AchievementsCard } from './AchievementsCard';\nimport type { SessionEntry } from './SessionsTable';\nimport type { StreakInfo, BurndownPoint, FileHotspot, SpendingStats, TimelineSession, Achievement } from '@/lib/stats';\nimport { useT } from '@/lib/i18n/client';\n\nexport interface UsageInfo {\n window_5h_used_pct: number | null;\n window_weekly_used_pct: number | null;\n reset_at_5h: number | null;\n reset_at_weekly: number | null;\n}\n\nexport interface CodexAccountOption {\n accountId: string;\n label: string;\n email: string | null;\n planType: string | null;\n isCurrent: boolean;\n}\n\ninterface Props {\n sessions: SessionEntry[];\n streak: StreakInfo;\n allBurndown: BurndownPoint[];\n claudeBurndown: BurndownPoint[];\n codexBurndown: BurndownPoint[];\n hotspots: FileHotspot[];\n claudeUsage: UsageInfo | null;\n codexUsage: UsageInfo | null;\n codexAccounts: CodexAccountOption[];\n selectedCodexAccountId: string | null;\n initialToolFilter: ToolFilter;\n spending: SpendingStats;\n timeline: { dateLabel: string; sessions: TimelineSession[] };\n achievements: Achievement[];\n}\n\nconst TOOLS = ['all', 'claude-code', 'codex', 'cursor'] as const;\ntype ToolFilter = typeof TOOLS[number];\nconst TOOL_LABEL_KEYS: Record<ToolFilter, string> = {\n all: 'dashboard.toolAll',\n 'claude-code': 'dashboard.toolClaude',\n codex: 'dashboard.toolCodex',\n cursor: 'dashboard.toolCursor',\n};\n\nconst DATE_PRESETS = ['today', '7d', '30d', 'all'] as const;\ntype DatePreset = typeof DATE_PRESETS[number];\nconst DATE_LABEL_KEYS: Record<DatePreset, string> = {\n today: 'dashboard.dateToday2',\n '7d': 'dashboard.date7days',\n '30d': 'dashboard.date30days',\n all: 'dashboard.dateAlltime',\n};\n\nfunction isToolFilter(value: string | null): value is ToolFilter {\n return TOOLS.includes(value as ToolFilter);\n}\n\nfunction startOfPreset(preset: DatePreset): number {\n const now = new Date();\n if (preset === 'today') { now.setHours(0, 0, 0, 0); return now.getTime(); }\n if (preset === '7d') return Date.now() - 7 * 86_400_000;\n if (preset === '30d') return Date.now() - 30 * 86_400_000;\n return 0;\n}\n\nfunction formatResetAt(ms: number | null, t: (k: string, v?: Record<string, string | number>) => string): string {\n if (!ms) return '';\n const diff = ms - Date.now();\n if (diff <= 0) return t('dashboard.resetting');\n const d = new Date(ms);\n const time = d.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit', hour12: false });\n const isToday = new Date().toDateString() === d.toDateString();\n const dateStr = isToday ? time : `${(d.getMonth() + 1).toString().padStart(2, '0')}/${d.getDate().toString().padStart(2, '0')} ${time}`;\n const h = Math.floor(diff / 3_600_000);\n const m = Math.floor((diff % 3_600_000) / 60_000);\n const rel = h > 0 ? `${h}h ${m}m` : `${m}m`;\n return t('dashboard.resetsAt', { date: dateStr, rel });\n}\n\nfunction formatRemainingPercent(value: number): string {\n const clamped = Math.max(0, Math.min(100, value));\n return `${clamped >= 100 ? 100 : Math.floor(clamped)}%`;\n}\n\nfunction formatUsedPercent(value: number): string {\n const clamped = Math.max(0, Math.min(100, value));\n return `${clamped <= 0 ? 0 : Math.ceil(clamped)}%`;\n}\n\nfunction shortAccountId(value: string) {\n return value.length > 12 ? `${value.slice(0, 6)}...${value.slice(-4)}` : value;\n}\n\nexport function Dashboard({\n sessions,\n streak,\n allBurndown,\n claudeBurndown,\n codexBurndown,\n hotspots,\n claudeUsage,\n codexUsage,\n codexAccounts,\n selectedCodexAccountId,\n initialToolFilter,\n spending,\n timeline,\n achievements,\n}: Props) {\n const t = useT();\n const router = useRouter();\n const pathname = usePathname();\n const searchParams = useSearchParams();\n const queryToolFilter = searchParams.get('agent');\n const toolFilter = isToolFilter(queryToolFilter) ? queryToolFilter : initialToolFilter;\n const [datePreset, setDatePreset] = useState<DatePreset>('all');\n const [refreshState, setRefreshState] = useState<'idle' | 'refreshing' | 'done' | 'error'>('idle');\n const [refreshMessage, setRefreshMessage] = useState<string | null>(null);\n\n const selectedCodexAccount = useMemo(\n () => codexAccounts.find((account) => account.accountId === selectedCodexAccountId) ?? null,\n [codexAccounts, selectedCodexAccountId],\n );\n const selectedCodexLabel = selectedCodexAccount\n ? `${t('dashboard.codexLabelPrefix')} · ${selectedCodexAccount.label}`\n : t('dashboard.codexLabel');\n const selectedCodexEmptyTitle = selectedCodexAccountId\n ? t('dashboard.noSnapshot')\n : t('dashboard.noData');\n const selectedCodexEmptyHint = selectedCodexAccountId\n ? selectedCodexAccount?.isCurrent\n ? t('dashboard.useCodexThenRefresh')\n : t('dashboard.switchAdminThenUse')\n : t('dashboard.noData');\n\n const since = useMemo(() => startOfPreset(datePreset), [datePreset]);\n\n const toolCounts = useMemo(() => {\n const src = since > 0 ? sessions.filter((s) => s.started_at >= since) : sessions;\n const counts: Record<string, number> = { all: src.length };\n for (const s of src) counts[s.tool] = (counts[s.tool] ?? 0) + 1;\n return counts;\n }, [sessions, since]);\n\n const filteredSessions = useMemo(() => {\n let s = toolFilter === 'all' ? sessions : sessions.filter((s) => s.tool === toolFilter);\n if (since > 0) s = s.filter((s) => s.started_at >= since);\n return s;\n }, [sessions, toolFilter, since]);\n\n const filteredToolSplit = useMemo(() => {\n const byTool = new Map<string, { sessions: number; totalMs: number }>();\n for (const s of filteredSessions) {\n const ms = (s.ended_at ?? s.started_at) - s.started_at;\n const cur = byTool.get(s.tool) ?? { sessions: 0, totalMs: 0 };\n byTool.set(s.tool, { sessions: cur.sessions + 1, totalMs: cur.totalMs + ms });\n }\n const grandMs = Math.max([...byTool.values()].reduce((s, v) => s + v.totalMs, 0), 1);\n return [...byTool.entries()]\n .map(([tool, v]) => ({ tool, sessions: v.sessions, totalMs: v.totalMs, pct: Math.round(v.totalMs / grandMs * 100) }))\n .sort((a, b) => b.totalMs - a.totalMs);\n }, [filteredSessions]);\n\n const filteredSpending = useMemo(() => {\n if (since === 0) return spending;\n const sinceDate = new Date(since).toISOString().slice(0, 10);\n return { ...spending, daily: spending.daily.filter((d) => d.date >= sinceDate) };\n }, [spending, since]);\n\n async function refreshData() {\n setRefreshState('refreshing');\n setRefreshMessage(null);\n try {\n const response = await fetch('/api/import-sessions', { method: 'POST' });\n const payload = await response.json();\n if (!response.ok) throw new Error(payload.error ?? t('dashboard.refreshFailed'));\n setRefreshState('done');\n setRefreshMessage(t('dashboard.scanned', { n: payload.scanned ?? 0, seconds: Math.round((payload.durationMs ?? 0) / 100) / 10 }));\n router.refresh();\n } catch (error) {\n setRefreshState('error');\n setRefreshMessage(error instanceof Error ? error.message : t('dashboard.refreshFailed'));\n }\n }\n\n function replaceQuery(nextTool: ToolFilter, accountId: string | null) {\n const params = new URLSearchParams(searchParams.toString());\n if (nextTool === 'all') {\n params.delete('agent');\n params.delete('codexAccount');\n } else {\n params.set('agent', nextTool);\n if (nextTool !== 'codex') {\n params.delete('codexAccount');\n }\n }\n\n if (nextTool === 'codex' && accountId) {\n params.set('codexAccount', accountId);\n } else {\n params.delete('codexAccount');\n }\n\n const query = params.toString();\n router.replace(query ? `${pathname}?${query}` : pathname, { scroll: false });\n router.refresh();\n }\n\n function changeToolFilter(nextTool: ToolFilter) {\n replaceQuery(nextTool, nextTool === 'codex' ? selectedCodexAccountId : null);\n }\n\n function changeCodexAccount(accountId: string) {\n const nextAccountId = accountId || null;\n replaceQuery('codex', nextAccountId);\n }\n\n return (\n <>\n {/* Filters row */}\n <div className=\"flex flex-wrap items-center justify-between mb-4 gap-3\">\n <div className=\"flex flex-wrap gap-2\">\n {TOOLS\n .filter((tool) => tool === 'all' || (toolCounts[tool] ?? 0) > 0)\n .sort((a, b) => {\n if (a === 'all') return -1;\n if (b === 'all') return 1;\n return (toolCounts[b] ?? 0) - (toolCounts[a] ?? 0);\n })\n .map((tool) => (\n <button key={tool} onClick={() => changeToolFilter(tool)}\n className={`text-xs px-3 py-1.5 rounded-full border transition-colors ${\n toolFilter === tool\n ? 'bg-zinc-700 border-zinc-500 text-zinc-100'\n : 'border-zinc-700 text-zinc-500 hover:text-zinc-300 hover:border-zinc-600'\n }`}\n >\n {t(TOOL_LABEL_KEYS[tool])}\n <span className=\"ml-1.5 text-zinc-600 tabular-nums\">{toolCounts[tool] ?? 0}</span>\n </button>\n ))}\n </div>\n <div className=\"flex flex-wrap items-center justify-end gap-2\">\n <div className=\"flex gap-1\">\n {DATE_PRESETS.map((p) => (\n <button key={p} onClick={() => setDatePreset(p)}\n className={`text-xs px-3 py-1.5 rounded-full border transition-colors ${\n datePreset === p\n ? 'bg-zinc-700 border-zinc-500 text-zinc-100'\n : 'border-zinc-700 text-zinc-500 hover:text-zinc-300 hover:border-zinc-600'\n }`}\n >\n {t(DATE_LABEL_KEYS[p])}\n </button>\n ))}\n </div>\n <button\n type=\"button\"\n onClick={refreshData}\n disabled={refreshState === 'refreshing'}\n className=\"text-xs px-3 py-1.5 rounded-full border border-violet-500/40 bg-violet-500/10 text-violet-100 transition-colors hover:bg-violet-500/20 disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {refreshState === 'refreshing' ? t('dashboard.refreshing') : t('dashboard.refreshData')}\n </button>\n </div>\n </div>\n {refreshMessage && (\n <div className={`mb-4 rounded-lg border px-4 py-3 text-xs ${\n refreshState === 'error'\n ? 'border-red-900/60 bg-red-950/40 text-red-200'\n : 'border-emerald-900/60 bg-emerald-950/30 text-emerald-200'\n }`}>\n {refreshMessage}\n </div>\n )}\n\n {toolFilter === 'codex' && codexAccounts.length > 0 && (\n <div className=\"mb-3 flex flex-wrap items-center justify-between gap-2 rounded-lg border border-zinc-800 bg-zinc-900 px-4 py-3\">\n <div className=\"min-w-0\">\n <p className=\"text-xs uppercase tracking-wider text-zinc-500\">{t('dashboard.codexAccount')}</p>\n <p className=\"mt-1 truncate text-xs text-zinc-600\">\n {selectedCodexAccount\n ? selectedCodexAccount.isCurrent ? t('dashboard.codexCurrentOnly') : t('dashboard.codexSavedOnly')\n : t('dashboard.codexAllUsage')}\n </p>\n </div>\n <div className=\"flex min-w-0 items-center gap-2\">\n <select\n value={selectedCodexAccountId ?? ''}\n onChange={(event) => changeCodexAccount(event.target.value)}\n className=\"max-w-72 rounded-md border border-zinc-700 bg-zinc-950 px-3 py-2 text-xs text-zinc-100 outline-none transition-colors hover:border-zinc-500 focus:border-violet-500\"\n >\n <option value=\"\">{t('dashboard.codexAccountAll')}</option>\n {codexAccounts.map((account) => (\n <option key={account.accountId} value={account.accountId}>\n {account.label} · {account.planType ?? t('common.unknown')}{account.isCurrent ? ' · current' : ''}\n </option>\n ))}\n </select>\n <span className=\"hidden shrink-0 text-xs text-zinc-600 sm:inline\">\n {selectedCodexAccount ? shortAccountId(selectedCodexAccount.accountId) : t('dashboard.short')}\n </span>\n </div>\n {selectedCodexAccount && !selectedCodexAccount.isCurrent && (\n <Link\n href=\"/admin\"\n className=\"basis-full text-xs text-violet-300 transition-colors hover:text-violet-100\"\n >\n {t('dashboard.codexSwitchHint')}\n </Link>\n )}\n </div>\n )}\n\n {/* Usage cards — only meaningful for agents with quota windows */}\n {toolFilter !== 'all' && (() => {\n const usage = toolFilter === 'codex' ? codexUsage\n : toolFilter === 'claude-code' ? claudeUsage\n : null;\n const label = toolFilter === 'codex' ? selectedCodexLabel\n : toolFilter === 'claude-code' ? t('dashboard.claudeCodeLower')\n : t(TOOL_LABEL_KEYS[toolFilter]).toLowerCase();\n return (\n <>\n <div className=\"grid grid-cols-2 gap-4 mb-4\">\n <div className=\"rounded-lg border border-zinc-800 bg-zinc-900 p-5\">\n <p className=\"text-xs text-zinc-500 uppercase tracking-wider mb-2\">{t('dashboard.window5h')} · {label}</p>\n {usage?.window_5h_used_pct != null ? (\n <>\n <p className=\"text-3xl font-bold text-zinc-100\">\n {formatRemainingPercent(100 - usage.window_5h_used_pct)}\n </p>\n <p className=\"text-xs text-zinc-500 mt-1\">{t('dashboard.remaining')} · {formatUsedPercent(usage.window_5h_used_pct)} {t('dashboard.used')}</p>\n {usage.reset_at_5h && <p className=\"text-xs text-zinc-600 mt-1\">{formatResetAt(usage.reset_at_5h, t)}</p>}\n </>\n ) : (\n <p className=\"text-zinc-600 text-sm mt-1\">\n {toolFilter === 'codex' ? selectedCodexEmptyTitle : t('dashboard.noData')}\n </p>\n )}\n </div>\n <div className=\"rounded-lg border border-zinc-800 bg-zinc-900 p-5\">\n <p className=\"text-xs text-zinc-500 uppercase tracking-wider mb-2\">{t('dashboard.window7d')} · {label}</p>\n {usage?.window_weekly_used_pct != null ? (\n <>\n <p className=\"text-3xl font-bold text-zinc-100\">\n {formatRemainingPercent(100 - usage.window_weekly_used_pct)}\n </p>\n <p className=\"text-xs text-zinc-500 mt-1\">{t('dashboard.remaining')} · {formatUsedPercent(usage.window_weekly_used_pct)} {t('dashboard.used')}</p>\n {usage.reset_at_weekly && <p className=\"text-xs text-zinc-600 mt-1\">{formatResetAt(usage.reset_at_weekly, t)}</p>}\n </>\n ) : (\n <p className=\"text-zinc-600 text-sm mt-1\">\n {toolFilter === 'codex' ? selectedCodexEmptyHint : t('dashboard.noData')}\n </p>\n )}\n </div>\n </div>\n </>\n );\n })()}\n\n {/* Spending + achievements */}\n <div className=\"grid grid-cols-2 gap-4 mb-4\">\n <SpendingCard data={filteredSpending} toolFilter={toolFilter} />\n <AchievementsCard data={achievements} />\n </div>\n\n {/* Activity — pattern (heatmap) / today (timeline) */}\n <div className=\"mb-4\">\n <ActivityCard sessions={filteredSessions} streak={streak} timeline={timeline} />\n </div>\n\n {/* Burndown chart */}\n <div className=\"mb-4\">\n <BurndownChart\n data={toolFilter === 'codex' ? codexBurndown : toolFilter === 'claude-code' ? claudeBurndown : allBurndown}\n label={toolFilter === 'codex' ? selectedCodexLabel : toolFilter === 'claude-code' ? t('dashboard.claudeCodeLower') : t('dashboard.allAgents')}\n />\n </div>\n\n {/* Tool split + Project leaderboard */}\n <div className=\"grid grid-cols-2 gap-4 mb-4\">\n <ToolSplitCard data={filteredToolSplit} />\n <ProjectLeaderboard sessions={filteredSessions} />\n </div>\n\n {/* Sessions table */}\n <div className=\"mb-4\">\n <SessionsTable sessions={filteredSessions.slice(0, 40)} />\n </div>\n\n {/* File hotspots */}\n {hotspots.length > 0 && (\n <FileHotspots data={hotspots} />\n )}\n </>\n );\n}\n","'use client';\n\nimport React, { useState, useMemo } from 'react';\nimport { useT } from '@/lib/i18n/client';\n\nexport interface SessionEntry {\n id: string;\n tool: string;\n started_at: number;\n ended_at: number | null;\n cwd: string | null;\n confidence: string;\n summary: string | null;\n ai_title: string | null;\n tags: string | null;\n}\n\nconst PRESET_TAGS = ['blocked', 'poc', 'spike', 'review', 'done'];\n\nfunction formatTime(ms: number): string {\n return new Date(ms).toLocaleString(undefined, {\n month: '2-digit', day: '2-digit',\n hour: '2-digit', minute: '2-digit', hour12: false,\n });\n}\nfunction cwdBasename(cwd: string | null): string {\n if (!cwd) return '—';\n return cwd.split('/').filter(Boolean).pop() ?? cwd;\n}\nfunction duration(startMs: number, endMs: number | null, activeLabel: string): string {\n if (!endMs) return activeLabel;\n const mins = Math.round((endMs - startMs) / 60_000);\n if (mins < 60) return `${mins}m`;\n return `${Math.floor(mins / 60)}h ${mins % 60}m`;\n}\nfunction parseTags(raw: string | null): string[] {\n try { return raw ? (JSON.parse(raw) as string[]) : []; } catch { return []; }\n}\n\nfunction ToolBadge({ tool }: { tool: string }) {\n if (tool === 'codex')\n return <span className=\"text-xs px-1.5 py-0.5 rounded bg-emerald-900/40 text-emerald-400 border border-emerald-800/50\">codex</span>;\n if (tool === 'cursor')\n return <span className=\"text-xs px-1.5 py-0.5 rounded bg-sky-900/40 text-sky-400 border border-sky-800/50\">cursor</span>;\n return <span className=\"text-xs px-1.5 py-0.5 rounded bg-violet-900/40 text-violet-400 border border-violet-800/50\">claude</span>;\n}\n\nfunction TagChip({ label, onRemove }: { label: string; onRemove?: () => void }) {\n const colors: Record<string, string> = {\n blocked: 'bg-red-900/40 text-red-400 border-red-800/50',\n poc: 'bg-yellow-900/40 text-yellow-400 border-yellow-800/50',\n spike: 'bg-orange-900/40 text-orange-400 border-orange-800/50',\n review: 'bg-blue-900/40 text-blue-400 border-blue-800/50',\n done: 'bg-zinc-700/40 text-zinc-400 border-zinc-600/50',\n };\n const cls = colors[label] ?? 'bg-zinc-800/40 text-zinc-400 border-zinc-700/50';\n return (\n <span className={`inline-flex items-center gap-1 text-xs px-1.5 py-0.5 rounded border ${cls}`}>\n {label}\n {onRemove && (\n <button onClick={onRemove} className=\"hover:text-white leading-none\">×</button>\n )}\n </span>\n );\n}\n\nexport function SessionsTable({ sessions }: { sessions: SessionEntry[] }) {\n const t = useT();\n const [search, setSearch] = useState('');\n const [tagStates, setTagStates] = useState<Record<string, string[]>>({});\n const [tagInput, setTagInput] = useState<Record<string, string>>({});\n const [tagOpen, setTagOpen] = useState<string | null>(null);\n\n const filtered = useMemo(() => {\n const q = search.toLowerCase();\n if (!q) return sessions;\n return sessions.filter((s) =>\n cwdBasename(s.cwd).toLowerCase().includes(q) ||\n (s.ai_title ?? '').toLowerCase().includes(q) ||\n (s.summary ?? '').toLowerCase().includes(q)\n );\n }, [sessions, search]);\n\n async function saveTags(sessionId: string, tags: string[]) {\n setTagStates((t) => ({ ...t, [sessionId]: tags }));\n await fetch(`/api/sessions/${sessionId}/tags`, {\n method: 'PATCH', headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ tags }),\n });\n }\n\n function getTags(s: SessionEntry): string[] {\n return tagStates[s.id] ?? parseTags(s.tags);\n }\n\n function addTag(s: SessionEntry, tag: string) {\n const trimmed = tag.trim().toLowerCase().replace(/\\s+/g, '-');\n if (!trimmed) return;\n const cur = getTags(s);\n if (cur.includes(trimmed)) return;\n saveTags(s.id, [...cur, trimmed]);\n setTagInput((t) => ({ ...t, [s.id]: '' }));\n }\n\n function removeTag(s: SessionEntry, tag: string) {\n saveTags(s.id, getTags(s).filter((t) => t !== tag));\n }\n\n return (\n <div className=\"rounded-lg border border-zinc-800 bg-zinc-900\">\n <div className=\"flex items-center justify-between px-5 py-3 border-b border-zinc-800 gap-4\">\n <h2 className=\"text-sm font-medium text-zinc-300 shrink-0\">{t('card.sessions.recent')}</h2>\n <input\n type=\"text\"\n placeholder={t('card.sessions.search')}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"flex-1 max-w-xs bg-zinc-800 border border-zinc-700 rounded px-3 py-1 text-xs text-zinc-200 placeholder-zinc-600 focus:outline-none focus:border-zinc-500\"\n />\n <span className=\"text-xs text-zinc-500 shrink-0\">\n {t('card.sessions.activeCount', { active: sessions.filter((s) => !s.ended_at).length, shown: filtered.length, total: sessions.length })}\n </span>\n </div>\n\n {filtered.length === 0 ? (\n <p className=\"px-5 py-8 text-zinc-600 text-sm text-center\">{t('card.sessions.noMatch')}</p>\n ) : (\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"text-xs text-zinc-500 border-b border-zinc-800\">\n <th className=\"px-4 py-2 text-left font-normal\">{t('card.sessions.started')}</th>\n <th className=\"px-4 py-2 text-left font-normal\">{t('card.sessions.tool')}</th>\n <th className=\"px-4 py-2 text-left font-normal\">{t('card.sessions.project')}</th>\n <th className=\"px-4 py-2 text-left font-normal\">{t('card.sessions.duration')}</th>\n <th className=\"px-4 py-2 text-left font-normal\">{t('card.sessions.status')}</th>\n <th className=\"px-4 py-2 text-left font-normal\">{t('card.sessions.tags')}</th>\n </tr>\n </thead>\n <tbody>\n {filtered.map((s) => {\n const isActive = !s.ended_at;\n const tags = getTags(s);\n const isTagOpen = tagOpen === s.id;\n\n return (\n <React.Fragment key={s.id}>\n <tr className=\"border-b border-zinc-800/40 hover:bg-zinc-800/20 transition-colors\">\n <td className=\"px-4 py-2 text-zinc-500 tabular-nums whitespace-nowrap text-xs\">\n {formatTime(s.started_at)}\n </td>\n <td className=\"px-4 py-2\">\n <ToolBadge tool={s.tool} />\n </td>\n <td className=\"px-4 py-2 max-w-xs\">\n <div className=\"text-zinc-200 text-xs font-medium\">{cwdBasename(s.cwd)}</div>\n {s.ai_title && (\n <div className=\"text-zinc-500 text-xs truncate\">{s.ai_title}</div>\n )}\n {!s.ai_title && s.summary && (\n <div className=\"text-zinc-600 text-xs truncate\">{s.summary}</div>\n )}\n </td>\n <td className=\"px-4 py-2 text-zinc-500 tabular-nums text-xs\">\n {duration(s.started_at, s.ended_at ?? null, t('card.sessions.active'))}\n </td>\n <td className=\"px-4 py-2\">\n {isActive ? (\n <span className=\"inline-flex items-center gap-1 text-emerald-400 text-xs\">\n <span className=\"w-1.5 h-1.5 rounded-full bg-emerald-400 animate-pulse inline-block\" />\n {t('card.sessions.active')}\n </span>\n ) : (\n <span className=\"text-zinc-700 text-xs\">{t('card.sessions.done')}</span>\n )}\n </td>\n <td className=\"px-4 py-2\">\n <div className=\"flex flex-wrap gap-1 items-center\">\n {tags.map((t) => (\n <TagChip key={t} label={t} onRemove={() => removeTag(s, t)} />\n ))}\n {isTagOpen ? (\n <div className=\"flex items-center gap-1\">\n <input\n autoFocus\n value={tagInput[s.id] ?? ''}\n onChange={(e) => setTagInput((x) => ({ ...x, [s.id]: e.target.value }))}\n onKeyDown={(e) => {\n if (e.key === 'Enter') { addTag(s, tagInput[s.id] ?? ''); }\n if (e.key === 'Escape') setTagOpen(null);\n }}\n placeholder={t('card.sessions.tagPlaceholder')}\n className=\"w-16 bg-zinc-800 border border-zinc-600 rounded px-1 py-0.5 text-xs text-zinc-200 focus:outline-none\"\n />\n <div className=\"flex gap-1\">\n {PRESET_TAGS.filter((pt) => !tags.includes(pt)).slice(0, 3).map((pt) => (\n <button key={pt} onClick={() => addTag(s, pt)}\n className=\"text-xs text-zinc-500 hover:text-zinc-300 px-1 py-0.5 rounded border border-zinc-700\">\n {pt}\n </button>\n ))}\n </div>\n <button onClick={() => setTagOpen(null)} className=\"text-zinc-600 hover:text-zinc-400 text-xs\">✕</button>\n </div>\n ) : (\n <button onClick={() => setTagOpen(s.id)}\n className=\"text-zinc-700 hover:text-zinc-400 text-xs leading-none\">+</button>\n )}\n </div>\n </td>\n </tr>\n </React.Fragment>\n );\n })}\n </tbody>\n </table>\n )}\n </div>\n );\n}\n","'use client';\n\nimport type { ToolSplit } from '@/lib/stats';\nimport { useT } from '@/lib/i18n/client';\n\nfunction fmtHours(ms: number) {\n const h = ms / 3_600_000;\n return h < 1 ? `${Math.round(h * 60)}m` : `${h.toFixed(1)}h`;\n}\n\nconst TOOL_COLOR: Record<string, string> = {\n 'claude-code': 'bg-violet-500',\n codex: 'bg-emerald-500',\n cursor: 'bg-sky-500',\n other: 'bg-zinc-500',\n};\n\nexport function ToolSplitCard({ data }: { data: ToolSplit[] }) {\n const t = useT();\n const total = data.reduce((s, d) => s + d.sessions, 0);\n return (\n <div className=\"rounded-lg border border-zinc-800 bg-zinc-900 p-5\">\n <p className=\"text-xs text-zinc-500 uppercase tracking-wider mb-3\">{t('card.toolSplit.title')}</p>\n {data.length === 0 ? (\n <p className=\"text-zinc-600 text-sm\">{t('common.empty')}</p>\n ) : (\n <>\n {/* Stacked bar */}\n <div className=\"flex h-2 rounded overflow-hidden gap-0.5 mb-3\">\n {data.map((d) => (\n <div\n key={d.tool}\n className={`${TOOL_COLOR[d.tool] ?? 'bg-zinc-500'} rounded-sm`}\n style={{ width: `${d.pct}%` }}\n />\n ))}\n </div>\n <div className=\"space-y-1.5\">\n {data.map((d) => (\n <div key={d.tool} className=\"flex items-center justify-between text-xs\">\n <div className=\"flex items-center gap-2\">\n <span className={`w-2 h-2 rounded-sm inline-block ${TOOL_COLOR[d.tool] ?? 'bg-zinc-500'}`} />\n <span className=\"text-zinc-300\">{d.tool === 'claude-code' ? 'claude code' : d.tool}</span>\n </div>\n <span className=\"text-zinc-500 tabular-nums\">\n {d.sessions} {t('card.toolSplit.sessions')} · {fmtHours(d.totalMs)} · {d.pct}%\n </span>\n </div>\n ))}\n </div>\n <p className=\"text-xs text-zinc-600 mt-2\">{t('card.toolSplit.totalSessions', { n: total })}</p>\n </>\n )}\n </div>\n );\n}\n","'use client';\n\nimport { useState, useRef, useCallback } from 'react';\nimport type { BurndownPoint } from '@/lib/stats';\nimport { useT } from '@/lib/i18n/client';\n\nconst W = 560, H = 120, PL = 32, PR = 8, PT = 4, PB = 4;\n\nfunction toSvgPoints(pts: { x: number; y: number }[]): string {\n return pts.map((p) => `${p.x.toFixed(1)},${p.y.toFixed(1)}`).join(' ');\n}\n\nfunction fmtTs(ts: number): string {\n const d = new Date(ts);\n const today = new Date();\n const time = d.toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit', hour12: false });\n if (d.toDateString() === today.toDateString()) return time;\n return `${(d.getMonth() + 1).toString().padStart(2, '0')}/${d.getDate().toString().padStart(2, '0')} ${time}`;\n}\n\ninterface HoverState {\n svgX: number; // in viewBox coords\n screenX: number;\n screenY: number;\n point: BurndownPoint;\n}\n\nexport function BurndownChart({ data, label = 'claude code' }: { data: BurndownPoint[]; label?: string }) {\n const t = useT();\n const svgRef = useRef<SVGSVGElement>(null);\n const [hover, setHover] = useState<HoverState | null>(null);\n\n const minTs = data.length >= 2 ? data[0].ts : 0;\n const maxTs = data.length >= 2 ? data[data.length - 1].ts : 1;\n const tsRange = maxTs - minTs || 1;\n\n const xOf = (ts: number) => PL + ((ts - minTs) / tsRange) * (W - PL - PR);\n const yOf = (pct: number | null) => pct == null ? null : PT + (1 - pct / 100) * (H - PT - PB);\n\n const handleMouseMove = useCallback((e: React.MouseEvent<SVGSVGElement>) => {\n if (!svgRef.current || data.length < 2) return;\n const rect = svgRef.current.getBoundingClientRect();\n const frac = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width));\n // frac maps to viewBox x: PL..W-PR\n const svgX = PL + frac * (W - PL - PR);\n // find nearest data point by x\n let best = data[0];\n let bestDist = Infinity;\n for (const pt of data) {\n const d = Math.abs(xOf(pt.ts) - svgX);\n if (d < bestDist) { bestDist = d; best = pt; }\n }\n setHover({ svgX: xOf(best.ts), screenX: e.clientX, screenY: rect.top, point: best });\n }, [data, minTs, tsRange]); // eslint-disable-line react-hooks/exhaustive-deps\n\n if (data.length < 2) {\n return (\n <div className=\"rounded-lg border border-zinc-800 bg-zinc-900 p-5\">\n <p className=\"text-xs text-zinc-500 uppercase tracking-wider mb-2\">{t('card.burndown.header', { label })}</p>\n <p className=\"text-zinc-600 text-sm\">{t('card.burndown.notEnough')}</p>\n </div>\n );\n }\n\n const pts5h = data.filter((d) => d.pct5h != null).map((d) => ({ x: xOf(d.ts), y: yOf(d.pct5h)! }));\n const ptsWeekly = data.filter((d) => d.pctWeekly != null).map((d) => ({ x: xOf(d.ts), y: yOf(d.pctWeekly)! }));\n\n const last5h = data.filter((d) => d.pct5h != null).at(-1)?.pct5h;\n const lastWeekly = data.filter((d) => d.pctWeekly != null).at(-1)?.pctWeekly;\n\n return (\n <div className=\"rounded-lg border border-zinc-800 bg-zinc-900 p-5 relative\">\n <p className=\"text-xs text-zinc-500 uppercase tracking-wider mb-3\">{t('card.burndown.header', { label })}</p>\n\n <svg\n ref={svgRef}\n viewBox={`0 0 ${W} ${H}`}\n className=\"w-full h-28 cursor-crosshair\"\n preserveAspectRatio=\"none\"\n onMouseMove={handleMouseMove}\n onMouseLeave={() => setHover(null)}\n >\n {/* Y-axis grid + labels */}\n {[0, 25, 50, 75, 100].map((pct) => {\n const y = yOf(pct)!;\n return (\n <g key={pct}>\n <line x1={PL} y1={y} x2={W - PR} y2={y} stroke=\"#27272a\" strokeWidth=\"1\" />\n <text x={PL - 3} y={y + 3.5} textAnchor=\"end\" fontSize=\"8\" fill=\"#52525b\">{pct}%</text>\n </g>\n );\n })}\n\n {pts5h.length >= 2 && (\n <polyline points={toSvgPoints(pts5h)}\n fill=\"none\" stroke=\"#8b5cf6\" strokeWidth=\"1.5\" strokeLinejoin=\"round\" />\n )}\n {ptsWeekly.length >= 2 && (\n <polyline points={toSvgPoints(ptsWeekly)}\n fill=\"none\" stroke=\"#10b981\" strokeWidth=\"1.5\" strokeLinejoin=\"round\" strokeDasharray=\"4 2\" />\n )}\n\n {/* Crosshair */}\n {hover && (\n <>\n <line x1={hover.svgX} y1={PT} x2={hover.svgX} y2={H - PB}\n stroke=\"#52525b\" strokeWidth=\"1\" strokeDasharray=\"3 2\" />\n {hover.point.pct5h != null && (\n <circle cx={hover.svgX} cy={yOf(hover.point.pct5h)!} r=\"2.5\" fill=\"#8b5cf6\" />\n )}\n {hover.point.pctWeekly != null && (\n <circle cx={hover.svgX} cy={yOf(hover.point.pctWeekly)!} r=\"2.5\" fill=\"#10b981\" />\n )}\n </>\n )}\n </svg>\n\n {/* Floating tooltip */}\n {hover && (\n <div className=\"pointer-events-none absolute z-10 bg-zinc-800 border border-zinc-700 rounded px-2 py-1.5 text-xs shadow-lg\"\n style={{\n left: `${((hover.svgX - PL) / (W - PL - PR) * 100).toFixed(1)}%`,\n transform: hover.svgX > W * 0.65 ? 'translateX(-110%)' : 'translateX(4px)',\n top: '40px',\n }}\n >\n <p className=\"text-zinc-400 mb-1\">{fmtTs(hover.point.ts)}</p>\n {hover.point.pct5h != null && (\n <p className=\"text-violet-400\">{t('card.burndown.legend5h')}: {hover.point.pct5h.toFixed(0)}% {t('card.burndown.tipUsed')}</p>\n )}\n {hover.point.pctWeekly != null && (\n <p className=\"text-emerald-400\">{t('card.burndown.legend7d')}: {hover.point.pctWeekly.toFixed(0)}% {t('card.burndown.tipUsed')}</p>\n )}\n </div>\n )}\n\n <div className=\"flex items-center justify-between mt-1 text-xs text-zinc-600\">\n <span>{fmtTs(minTs)}</span>\n <div className=\"flex gap-4\">\n <span className=\"text-violet-400\">— {t('card.burndown.legend5h')} {last5h != null ? `(${last5h.toFixed(0)}% ${t('card.burndown.tipUsed')})` : ''}</span>\n <span className=\"text-emerald-400\">-- {t('card.burndown.legend7d')} {lastWeekly != null ? `(${lastWeekly.toFixed(0)}% ${t('card.burndown.tipUsed')})` : ''}</span>\n </div>\n <span>{fmtTs(maxTs)}</span>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport type { FileHotspot } from '@/lib/stats';\nimport { useT } from '@/lib/i18n/client';\n\nexport function FileHotspots({ data }: { data: FileHotspot[] }) {\n const t = useT();\n if (data.length === 0) return null;\n\n const max = data[0].changes;\n const basename = (p: string) => p.split('/').pop() ?? p;\n const dirpart = (p: string) => {\n const parts = p.split('/');\n return parts.length > 1 ? parts.slice(-2, -1)[0] : '';\n };\n\n return (\n <div className=\"rounded-lg border border-zinc-800 bg-zinc-900 p-5\">\n <p className=\"text-xs text-zinc-500 uppercase tracking-wider mb-3\">{t('card.hotspots.title')}</p>\n <div className=\"space-y-2\">\n {data.map((f) => (\n <div key={f.path}>\n <div className=\"flex items-center justify-between text-xs mb-0.5\">\n <span className=\"text-zinc-300 truncate max-w-xs\" title={f.path}>\n <span className=\"text-zinc-600\">{dirpart(f.path)}/</span>\n {basename(f.path)}\n </span>\n <span className=\"text-zinc-500 tabular-nums ml-2 shrink-0\">\n {f.changes}× · {f.sessions} {t('card.hotspots.sessions')}\n </span>\n </div>\n <div className=\"h-1 bg-zinc-800 rounded\">\n <div\n className=\"h-1 bg-amber-500/60 rounded\"\n style={{ width: `${(f.changes / max) * 100}%` }}\n />\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport type { SpendingStats } from '@/lib/stats';\nimport { useT } from '@/lib/i18n/client';\n\nfunction fmtTokens(n: number): string {\n if (n >= 1_000_000_000) return `${(n / 1_000_000_000).toFixed(1)}B`;\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(0)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(0)}K`;\n return String(n);\n}\n\ntype ToolFilter = 'all' | 'claude-code' | 'codex' | 'cursor';\n\nexport function SpendingCard({ data, toolFilter }: { data: SpendingStats; toolFilter: ToolFilter }) {\n const t = useT();\n const showClaude = toolFilter === 'all' || toolFilter === 'claude-code';\n const showCodex = toolFilter === 'all' || toolFilter === 'codex';\n\n const maxClaude = showClaude ? Math.max(...data.daily.map((d) => d.claudeUsd), 0.01) : 0.01;\n const maxCodex = showCodex ? Math.max(...data.daily.map((d) => d.codexTokens), 1) : 1;\n\n if (!showClaude && !showCodex) {\n return (\n <div className=\"rounded-lg border border-zinc-800 bg-zinc-900 p-5\">\n <p className=\"text-xs text-zinc-500 uppercase tracking-wider mb-3\">{t('card.spending.title')}</p>\n <p className=\"text-zinc-600 text-sm\">{t('card.spending.noCursor')}</p>\n </div>\n );\n }\n\n return (\n <div className=\"rounded-lg border border-zinc-800 bg-zinc-900 p-5\">\n <p className=\"text-xs text-zinc-500 uppercase tracking-wider mb-3\">{t('card.spending.title')}</p>\n\n {/* Totals row */}\n <div className=\"flex gap-6 mb-4\">\n {showClaude && (\n <div>\n <p className=\"text-xl font-bold text-violet-400\">${data.claudeTotalUsd.toFixed(2)}</p>\n <p className=\"text-xs text-zinc-600 mt-0.5\">{t('card.spending.claudeCost')}</p>\n </div>\n )}\n {showCodex && (\n <div>\n <p className=\"text-xl font-bold text-emerald-400\">{fmtTokens(data.codexTotalTokens)}</p>\n <p className=\"text-xs text-zinc-600 mt-0.5\">{t('card.spending.codexTokens')}</p>\n </div>\n )}\n </div>\n\n {/* 14-day bar chart */}\n <p className=\"text-xs text-zinc-600 mb-2\">{t('card.spending.last14d')}</p>\n <div className=\"flex items-end gap-px h-16\">\n {data.daily.map((d) => {\n const claudePct = showClaude ? (d.claudeUsd / maxClaude) * 100 : 0;\n const codexPct = showCodex ? (d.codexTokens / maxCodex) * 100 : 0;\n const label = d.date.slice(5);\n const tip = [\n label,\n showClaude ? `Claude $${d.claudeUsd.toFixed(2)}` : '',\n showCodex ? `Codex ${fmtTokens(d.codexTokens)} tokens` : '',\n ].filter(Boolean).join('\\n');\n return (\n <div key={d.date} className=\"flex-1 flex flex-col items-center\" title={tip}>\n <div className=\"w-full flex flex-col justify-end gap-px\" style={{ height: '56px' }}>\n {showCodex && d.codexTokens > 0 && (\n <div className=\"w-full bg-emerald-600/60 rounded-sm\" style={{ height: `${Math.max(codexPct * 0.56, 1)}px` }} />\n )}\n {showClaude && d.claudeUsd > 0 && (\n <div className=\"w-full bg-violet-500/70 rounded-sm\" style={{ height: `${Math.max(claudePct * 0.56, 1)}px` }} />\n )}\n </div>\n </div>\n );\n })}\n </div>\n <div className=\"flex justify-between mt-1\">\n <span className=\"text-zinc-700 text-xs\">{data.daily[0]?.date.slice(5)}</span>\n <span className=\"text-zinc-700 text-xs\">{data.daily[data.daily.length - 1]?.date.slice(5)}</span>\n </div>\n\n {/* Legend */}\n <div className=\"flex gap-4 mt-2\">\n {showClaude && (\n <span className=\"flex items-center gap-1 text-xs text-zinc-600\">\n <span className=\"w-2 h-2 rounded-sm bg-violet-500/70 inline-block\" /> {t('card.spending.legendClaude')}\n </span>\n )}\n {showCodex && (\n <span className=\"flex items-center gap-1 text-xs text-zinc-600\">\n <span className=\"w-2 h-2 rounded-sm bg-emerald-600/60 inline-block\" /> {t('card.spending.legendCodex')}\n </span>\n )}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { useState, useMemo } from 'react';\nimport type { SessionEntry } from './SessionsTable';\nimport type { StreakInfo, TimelineSession } from '@/lib/stats';\nimport { useT } from '@/lib/i18n/client';\n\nconst DOW_KEYS = ['card.activity.dayMon', 'card.activity.dayTue', 'card.activity.dayWed', 'card.activity.dayThu', 'card.activity.dayFri', 'card.activity.daySat', 'card.activity.daySun'];\nconst LANE_HEIGHT = 28;\nconst LANE_GAP = 4;\n\ninterface Cell { dow: number; hour: number; minutes: number; sessions: number; }\n\nfunction buildCells(sessions: SessionEntry[]): Cell[] {\n const buckets = new Map<string, { minutes: number; sessions: number }>();\n for (const s of sessions) {\n const start = s.started_at;\n const end = s.ended_at ?? Math.min(Date.now(), s.started_at + 60 * 60_000);\n let cur = start;\n let firstSessionBucket: string | null = null;\n while (cur < end) {\n const d = new Date(cur);\n const dow = (d.getDay() + 6) % 7;\n const hour = d.getHours();\n const key = `${dow}-${hour}`;\n const nextBoundary = new Date(d);\n nextBoundary.setMinutes(0, 0, 0);\n nextBoundary.setHours(d.getHours() + 1);\n const slice = (Math.min(nextBoundary.getTime(), end) - cur) / 60_000;\n const cell = buckets.get(key) ?? { minutes: 0, sessions: 0 };\n cell.minutes += slice;\n if (firstSessionBucket === null) {\n cell.sessions += 1;\n firstSessionBucket = key;\n }\n buckets.set(key, cell);\n cur = nextBoundary.getTime();\n }\n }\n const out: Cell[] = [];\n for (let dow = 0; dow < 7; dow++) {\n for (let hour = 0; hour < 24; hour++) {\n const c = buckets.get(`${dow}-${hour}`) ?? { minutes: 0, sessions: 0 };\n out.push({ dow, hour, ...c });\n }\n }\n return out;\n}\n\nfunction intensityClass(minutes: number, max: number): string {\n if (minutes === 0) return 'bg-zinc-900';\n const t = max > 0 ? minutes / max : 0;\n if (t < 0.15) return 'bg-violet-900/40';\n if (t < 0.3) return 'bg-violet-800/60';\n if (t < 0.5) return 'bg-violet-700';\n if (t < 0.75) return 'bg-violet-600';\n return 'bg-violet-400';\n}\n\nfunction fmtMins(m: number): string {\n if (m < 60) return `${Math.round(m)}m`;\n return `${(m / 60).toFixed(1)}h`;\n}\n\nfunction fmtHHmm(ms: number): string {\n const d = new Date(ms);\n return `${d.getHours().toString().padStart(2, '0')}:${d.getMinutes().toString().padStart(2, '0')}`;\n}\n\nfunction durMin(start: number, end: number): number {\n return Math.max(1, Math.round((end - start) / 60_000));\n}\n\nconst TOOL_BG: Record<string, string> = {\n 'claude-code': 'bg-violet-500/80 border-violet-400 text-violet-50',\n codex: 'bg-emerald-600/80 border-emerald-400 text-emerald-50',\n cursor: 'bg-sky-600/80 border-sky-400 text-sky-50',\n};\n\ninterface Props {\n sessions: SessionEntry[];\n streak: StreakInfo;\n timeline: { dateLabel: string; sessions: TimelineSession[] };\n}\n\nexport function ActivityCard({ sessions, streak, timeline }: Props) {\n const t = useT();\n const DOW = DOW_KEYS.map((k) => t(k));\n const [view, setView] = useState<'pattern' | 'today'>('pattern');\n const [hover, setHover] = useState<{ s: TimelineSession; x: number; y: number } | null>(null);\n\n const cells = useMemo(() => buildCells(sessions), [sessions]);\n const max = Math.max(...cells.map((c) => c.minutes), 1);\n const totalHours = cells.reduce((s, c) => s + c.minutes, 0) / 60;\n const peak = cells.reduce((best, c) => c.minutes > best.minutes ? c : best, cells[0]);\n\n // Today's data\n const dayStart = new Date(timeline.dateLabel + 'T00:00:00').getTime();\n const dayEnd = dayStart + 86_400_000;\n const valid = timeline.sessions\n .map((s) => ({ ...s, _start: Math.max(s.startMs, dayStart), _end: Math.min(s.endMs, dayEnd) }))\n .filter((s) => s._end > s._start)\n .sort((a, b) => a._start - b._start);\n const lanes: Array<typeof valid> = [];\n for (const s of valid) {\n let placed = false;\n for (const lane of lanes) {\n if (lane[lane.length - 1]._end <= s._start) { lane.push(s); placed = true; break; }\n }\n if (!placed) lanes.push([s]);\n }\n const laneCount = Math.max(lanes.length, 1);\n const containerHeight = laneCount * (LANE_HEIGHT + LANE_GAP) + LANE_GAP;\n const totalActiveHours = valid.reduce((sum, s) => sum + (s._end - s._start), 0) / 3_600_000;\n\n return (\n <div className=\"rounded-lg border border-zinc-800 bg-zinc-900 p-5 relative\">\n {/* Header: title + tabs + streak stats */}\n <div className=\"flex items-center justify-between mb-4 gap-4 flex-wrap\">\n <div className=\"flex items-center gap-3\">\n <p className=\"text-xs text-zinc-500 uppercase tracking-wider\">{t('card.activity.title')}</p>\n <div className=\"flex gap-1\">\n <button onClick={() => setView('pattern')}\n className={`text-xs px-2.5 py-1 rounded border transition-colors ${\n view === 'pattern'\n ? 'bg-zinc-700 border-zinc-500 text-zinc-100'\n : 'border-zinc-800 text-zinc-500 hover:text-zinc-300 hover:border-zinc-600'\n }`}>{t('card.activity.viewPattern')}</button>\n <button onClick={() => setView('today')}\n className={`text-xs px-2.5 py-1 rounded border transition-colors ${\n view === 'today'\n ? 'bg-zinc-700 border-zinc-500 text-zinc-100'\n : 'border-zinc-800 text-zinc-500 hover:text-zinc-300 hover:border-zinc-600'\n }`}>{t('card.activity.viewToday')}</button>\n </div>\n </div>\n <div className=\"flex items-center gap-4 text-xs\">\n <div><span className=\"text-base font-bold text-zinc-100 tabular-nums\">{streak.current}</span><span className=\"text-zinc-500 ml-1\">{t('card.activity.dayStreak')}</span></div>\n <div><span className=\"text-base font-bold text-zinc-300 tabular-nums\">{streak.longest}</span><span className=\"text-zinc-500 ml-1\">{t('card.activity.longest')}</span></div>\n <div><span className=\"text-base font-bold text-zinc-300 tabular-nums\">{streak.totalDays}</span><span className=\"text-zinc-500 ml-1\">{t('card.activity.activeDays')}</span></div>\n <div className=\"border-l border-zinc-800 pl-4\">\n <span className=\"text-base font-bold text-violet-400 tabular-nums\">{totalHours.toFixed(0)}h</span><span className=\"text-zinc-500 ml-1\">{t('card.activity.total')}</span>\n </div>\n </div>\n </div>\n\n {view === 'pattern' ? (\n <>\n <p className=\"text-xs text-zinc-600 mb-2\">\n {t('card.activity.peakSlotFmt', { day: DOW[peak.dow], hour: peak.hour.toString().padStart(2, '0'), mins: fmtMins(peak.minutes) })}\n </p>\n <div className=\"flex gap-1 text-xs\">\n <div className=\"w-8 shrink-0\"></div>\n <div className=\"flex-1 grid gap-px\" style={{ gridTemplateColumns: 'repeat(24, minmax(0, 1fr))' }}>\n {Array.from({ length: 24 }).map((_, h) => (\n <div key={h} className={`text-center text-[9px] text-zinc-600 ${h % 3 === 0 ? '' : 'opacity-40'}`}>\n {h % 3 === 0 ? h.toString().padStart(2, '0') : ''}\n </div>\n ))}\n </div>\n </div>\n {DOW.map((day, dow) => (\n <div key={day} className=\"flex gap-1 mt-px\">\n <div className=\"w-8 shrink-0 text-[10px] text-zinc-600 leading-4\">{day}</div>\n <div className=\"flex-1 grid gap-px\" style={{ gridTemplateColumns: 'repeat(24, minmax(0, 1fr))' }}>\n {Array.from({ length: 24 }).map((_, hour) => {\n const c = cells[dow * 24 + hour];\n return (\n <div key={hour}\n className={`h-4 rounded-sm ${intensityClass(c.minutes, max)}`}\n title={`${day} ${hour.toString().padStart(2, '0')}:00\\n${fmtMins(c.minutes)} · ${c.sessions} sessions`}\n />\n );\n })}\n </div>\n </div>\n ))}\n <div className=\"flex items-center gap-2 mt-3 text-[10px] text-zinc-600\">\n <span>{t('card.activity.less')}</span>\n <span className=\"w-3 h-3 rounded-sm bg-zinc-900 border border-zinc-800\" />\n <span className=\"w-3 h-3 rounded-sm bg-violet-900/40\" />\n <span className=\"w-3 h-3 rounded-sm bg-violet-800/60\" />\n <span className=\"w-3 h-3 rounded-sm bg-violet-700\" />\n <span className=\"w-3 h-3 rounded-sm bg-violet-600\" />\n <span className=\"w-3 h-3 rounded-sm bg-violet-400\" />\n <span>{t('card.activity.more')}</span>\n </div>\n </>\n ) : (\n <>\n <p className=\"text-xs text-zinc-600 mb-2\">\n {t('card.activity.dayHeader', { date: timeline.dateLabel, n: valid.length, hours: totalActiveHours.toFixed(1) })}\n </p>\n {valid.length === 0 ? (\n <p className=\"text-zinc-600 text-sm py-4\">{t('card.activity.noToday')}</p>\n ) : (\n <>\n <div className=\"relative h-4 mb-1\">\n {Array.from({ length: 25 }).map((_, h) => (\n <div key={h} className=\"absolute top-0 text-[10px] text-zinc-600 tabular-nums\"\n style={{ left: `${(h / 24) * 100}%`, transform: 'translateX(-50%)' }}>\n {h % 3 === 0 ? h.toString().padStart(2, '0') : ''}\n </div>\n ))}\n </div>\n <div className=\"relative bg-zinc-950/50 rounded overflow-hidden\"\n style={{ height: `${containerHeight}px` }}>\n {Array.from({ length: 25 }).map((_, h) => (\n <div key={h} className=\"absolute top-0 bottom-0 border-l border-zinc-800/40\"\n style={{ left: `${(h / 24) * 100}%` }} />\n ))}\n {lanes.flatMap((lane, li) =>\n lane.map((s) => {\n const left = ((s._start - dayStart) / 86_400_000) * 100;\n const width = ((s._end - s._start) / 86_400_000) * 100;\n const showLabel = width > 4;\n return (\n <div key={s.id}\n className={`absolute rounded border text-[11px] font-medium leading-none cursor-pointer hover:brightness-125 transition-all overflow-hidden ${TOOL_BG[s.tool] ?? 'bg-zinc-600 border-zinc-500 text-zinc-100'}`}\n style={{\n left: `${left}%`, width: `${Math.max(width, 0.4)}%`,\n top: `${LANE_GAP + li * (LANE_HEIGHT + LANE_GAP)}px`,\n height: `${LANE_HEIGHT}px`,\n }}\n onMouseEnter={(e) => setHover({ s, x: e.clientX, y: e.clientY })}\n onMouseMove={(e) => setHover({ s, x: e.clientX, y: e.clientY })}\n onMouseLeave={() => setHover(null)}\n >\n {showLabel && (\n <div className=\"px-1.5 py-1 truncate\">\n <span className=\"opacity-80\">{fmtHHmm(s._start)}</span>{' · '}{s.project}\n </div>\n )}\n </div>\n );\n })\n )}\n </div>\n <div className=\"flex gap-4 mt-3 text-[11px] text-zinc-600\">\n <span className=\"flex items-center gap-1\"><span className=\"w-2.5 h-2.5 rounded-sm bg-violet-500/80 inline-block\" /> claude code</span>\n <span className=\"flex items-center gap-1\"><span className=\"w-2.5 h-2.5 rounded-sm bg-emerald-600/80 inline-block\" /> codex</span>\n <span className=\"flex items-center gap-1\"><span className=\"w-2.5 h-2.5 rounded-sm bg-sky-600/80 inline-block\" /> cursor</span>\n </div>\n {hover && (\n <div className=\"fixed z-20 bg-zinc-800 border border-zinc-700 rounded px-3 py-2 text-xs shadow-xl pointer-events-none max-w-xs\"\n style={{ left: hover.x + 12, top: hover.y + 12 }}>\n <p className=\"text-zinc-100 font-medium mb-0.5\">\n {hover.s.project} <span className=\"text-zinc-500 font-normal\">· {hover.s.tool}</span>\n </p>\n {hover.s.aiTitle && <p className=\"text-zinc-400 mb-1 line-clamp-2\">{hover.s.aiTitle}</p>}\n <p className=\"text-zinc-500 tabular-nums\">\n {fmtHHmm(hover.s.startMs)} → {fmtHHmm(hover.s.endMs)} · {durMin(hover.s.startMs, hover.s.endMs)}m\n </p>\n </div>\n )}\n </>\n )}\n </>\n )}\n </div>\n );\n}\n","'use client';\n\nimport { useMemo } from 'react';\nimport type { SessionEntry } from './SessionsTable';\nimport { useT } from '@/lib/i18n/client';\n\ninterface ProjectRow {\n project: string;\n cwd: string | null;\n sessions: number;\n totalMs: number;\n tools: Record<string, number>;\n}\n\nfunction fmtHours(ms: number): string {\n const h = ms / 3_600_000;\n if (h < 1) return `${Math.round(h * 60)}m`;\n return `${h.toFixed(1)}h`;\n}\n\nfunction cwdBasename(cwd: string | null): string {\n if (!cwd) return '—';\n return cwd.split('/').filter(Boolean).pop() ?? cwd;\n}\n\nconst TOOL_DOT: Record<string, string> = {\n 'claude-code': 'bg-violet-500',\n codex: 'bg-emerald-500',\n cursor: 'bg-sky-500',\n};\n\nexport function ProjectLeaderboard({ sessions, limit = 10 }: { sessions: SessionEntry[]; limit?: number }) {\n const t = useT();\n const rows = useMemo(() => {\n const map = new Map<string, ProjectRow>();\n for (const s of sessions) {\n const project = cwdBasename(s.cwd);\n if (project === '—') continue;\n const ms = (s.ended_at ?? s.started_at) - s.started_at;\n const cur = map.get(project) ?? { project, cwd: s.cwd, sessions: 0, totalMs: 0, tools: {} };\n cur.sessions += 1;\n cur.totalMs += ms;\n cur.tools[s.tool] = (cur.tools[s.tool] ?? 0) + 1;\n map.set(project, cur);\n }\n return [...map.values()].sort((a, b) => b.totalMs - a.totalMs).slice(0, limit);\n }, [sessions, limit]);\n\n const maxMs = Math.max(...rows.map((r) => r.totalMs), 1);\n\n if (rows.length === 0) {\n return (\n <div className=\"rounded-lg border border-zinc-800 bg-zinc-900 p-5\">\n <p className=\"text-xs text-zinc-500 uppercase tracking-wider mb-3\">{t('card.leaderboard.title')}</p>\n <p className=\"text-zinc-600 text-sm\">{t('card.leaderboard.noProjects')}</p>\n </div>\n );\n }\n\n return (\n <div className=\"rounded-lg border border-zinc-800 bg-zinc-900 p-5\">\n <p className=\"text-xs text-zinc-500 uppercase tracking-wider mb-3\">{t('card.leaderboard.title')}</p>\n <div className=\"space-y-1.5\">\n {rows.map((r, i) => (\n <div key={r.project} className=\"group\">\n <div className=\"flex items-center gap-3 text-xs\">\n <span className=\"w-5 text-right text-zinc-600 tabular-nums\">{i + 1}</span>\n <span className=\"flex-1 text-zinc-200 truncate\" title={r.cwd ?? r.project}>\n {r.project}\n </span>\n <div className=\"flex gap-0.5\">\n {Object.entries(r.tools).map(([tool, count]) => (\n <span key={tool} className={`w-1.5 h-1.5 rounded-full ${TOOL_DOT[tool] ?? 'bg-zinc-500'}`} title={`${tool}: ${count}`} />\n ))}\n </div>\n <span className=\"text-zinc-500 tabular-nums w-12 text-right\">{r.sessions}×</span>\n <span className=\"text-zinc-400 tabular-nums w-14 text-right\">{fmtHours(r.totalMs)}</span>\n </div>\n <div className=\"flex gap-px h-1 mt-0.5 ml-8\">\n <div className=\"bg-violet-500/30 rounded-sm\" style={{ width: `${(r.totalMs / maxMs) * 100}%` }} />\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\nimport type { Achievement } from '@/lib/stats';\nimport { useT } from '@/lib/i18n/client';\n\nfunction fmtProgress(a: Achievement): string {\n if (!a.progress) return '';\n const { current, target } = a.progress;\n if (target >= 1_000_000) return `${(current / 1_000_000).toFixed(0)}M / ${(target / 1_000_000).toFixed(0)}M`;\n if (target >= 1000) return `${current.toLocaleString()} / ${target.toLocaleString()}`;\n if (target >= 100 && Number.isFinite(current) && current < 100 && current % 1 !== 0) {\n return `${current.toFixed(1)} / ${target}`;\n }\n return `${Math.floor(current)} / ${target}`;\n}\n\nexport function AchievementsCard({ data }: { data: Achievement[] }) {\n const t = useT();\n const [showAll, setShowAll] = useState(false);\n const tt = (id: string, fallback: string) => {\n const out = t(`achv.${id}.title`);\n return out === `achv.${id}.title` ? fallback : out;\n };\n const td = (id: string, fallback: string) => {\n const out = t(`achv.${id}.desc`);\n return out === `achv.${id}.desc` ? fallback : out;\n };\n const unlocked = data.filter((a) => a.unlocked);\n const locked = data.filter((a) => !a.unlocked).sort((a, b) => {\n const pa = a.progress ? a.progress.current / a.progress.target : 0;\n const pb = b.progress ? b.progress.current / b.progress.target : 0;\n return pb - pa;\n });\n\n const display = showAll\n ? [...unlocked, ...locked]\n : [...unlocked.slice(0, 4), ...locked.slice(0, Math.max(0, 6 - Math.min(unlocked.length, 4)))];\n\n return (\n <div className=\"rounded-lg border border-zinc-800 bg-zinc-900 p-5\">\n <div className=\"flex items-center justify-between mb-3\">\n <p className=\"text-xs text-zinc-500 uppercase tracking-wider\">{t('card.achievements.title')}</p>\n <p className=\"text-xs text-zinc-600\">{t('card.achievements.unlocked', { n: unlocked.length, total: data.length })}</p>\n </div>\n\n <div className=\"grid grid-cols-2 gap-2\">\n {display.map((a) => {\n const pct = a.progress ? Math.min(100, (a.progress.current / a.progress.target) * 100) : (a.unlocked ? 100 : 0);\n return (\n <div key={a.id}\n className={`rounded border px-2.5 py-2 ${\n a.unlocked\n ? 'border-amber-700/50 bg-amber-950/30'\n : 'border-zinc-800 bg-zinc-950/30'\n }`}\n title={a.description}\n >\n <div className=\"flex items-center justify-between gap-2\">\n <span className={`text-xs font-medium ${a.unlocked ? 'text-amber-300' : 'text-zinc-500'}`}>\n {a.unlocked ? '★' : '☆'} {tt(a.id, a.title)}\n </span>\n <span className=\"text-[10px] text-zinc-600 tabular-nums shrink-0\">\n {fmtProgress(a)}\n </span>\n </div>\n <div className=\"h-0.5 bg-zinc-800 rounded mt-1.5 overflow-hidden\">\n <div className={`h-full ${a.unlocked ? 'bg-amber-500' : 'bg-zinc-600'}`} style={{ width: `${pct}%` }} />\n </div>\n <p className=\"text-[10px] text-zinc-600 mt-1 truncate\">{td(a.id, a.description)}</p>\n </div>\n );\n })}\n </div>\n\n {data.length > 6 && (\n <button\n onClick={() => setShowAll(!showAll)}\n className=\"w-full mt-3 text-xs text-zinc-500 hover:text-zinc-300 border border-zinc-800 rounded py-1\"\n >\n {showAll ? t('card.achievements.showLess') : t('card.achievements.showAll', { n: data.length })}\n </button>\n )}\n </div>\n );\n}\n","import type React from 'react'\nimport { Children, useEffect, useLayoutEffect, type JSX } from 'react'\n\ntype State = JSX.Element[] | undefined\n\nexport type SideEffectProps = {\n reduceComponentsToState: (components: Array<React.ReactElement<any>>) => State\n handleStateChange?: (state: State) => void\n headManager: any\n children: React.ReactNode\n}\n\nconst isServer = typeof window === 'undefined'\nconst useClientOnlyLayoutEffect = isServer ? () => {} : useLayoutEffect\nconst useClientOnlyEffect = isServer ? () => {} : useEffect\n\nexport default function SideEffect(props: SideEffectProps) {\n const { headManager, reduceComponentsToState } = props\n\n function emitChange() {\n if (headManager && headManager.mountedInstances) {\n const headElements = Children.toArray(\n Array.from(headManager.mountedInstances as Set<React.ReactNode>).filter(\n Boolean\n )\n ) as React.ReactElement[]\n headManager.updateHead(reduceComponentsToState(headElements))\n }\n }\n\n if (isServer) {\n headManager?.mountedInstances?.add(props.children)\n emitChange()\n }\n\n useClientOnlyLayoutEffect(() => {\n headManager?.mountedInstances?.add(props.children)\n return () => {\n headManager?.mountedInstances?.delete(props.children)\n }\n })\n\n // We need to call `updateHead` method whenever the `SideEffect` is trigger in all\n // life-cycles: mount, update, unmount. However, if there are multiple `SideEffect`s\n // being rendered, we only trigger the method from the last one.\n // This is ensured by keeping the last unflushed `updateHead` in the `_pendingUpdate`\n // singleton in the layout effect pass, and actually trigger it in the effect pass.\n useClientOnlyLayoutEffect(() => {\n if (headManager) {\n headManager._pendingUpdate = emitChange\n }\n return () => {\n if (headManager) {\n headManager._pendingUpdate = emitChange\n }\n }\n })\n\n useClientOnlyEffect(() => {\n if (headManager && headManager._pendingUpdate) {\n headManager._pendingUpdate()\n headManager._pendingUpdate = null\n }\n return () => {\n if (headManager && headManager._pendingUpdate) {\n headManager._pendingUpdate()\n headManager._pendingUpdate = null\n }\n }\n })\n\n return null\n}\n","module.exports = (\n require('../../module.compiled') as typeof import('../../module.compiled')\n).vendored['contexts'].HeadManagerContext\n","'use client'\n\nimport React, { useContext, type JSX } from 'react'\nimport Effect from './side-effect'\nimport { HeadManagerContext } from './head-manager-context.shared-runtime'\nimport { warnOnce } from './utils/warn-once'\n\nexport function defaultHead(): JSX.Element[] {\n const head = [\n <meta charSet=\"utf-8\" key=\"charset\" />,\n <meta name=\"viewport\" content=\"width=device-width\" key=\"viewport\" />,\n ]\n return head\n}\n\nfunction onlyReactElement(\n list: Array<React.ReactElement<any>>,\n child: React.ReactElement | number | string\n): Array<React.ReactElement<any>> {\n // React children can be \"string\" or \"number\" in this case we ignore them for backwards compat\n if (typeof child === 'string' || typeof child === 'number') {\n return list\n }\n // Adds support for React.Fragment\n if (child.type === React.Fragment) {\n return list.concat(\n // @ts-expect-error @types/react does not remove fragments but this could also return ReactPortal[]\n React.Children.toArray(child.props.children).reduce(\n // @ts-expect-error @types/react does not remove fragments but this could also return ReactPortal[]\n (\n fragmentList: Array<React.ReactElement<any>>,\n fragmentChild: React.ReactElement | number | string\n ): Array<React.ReactElement<any>> => {\n if (\n typeof fragmentChild === 'string' ||\n typeof fragmentChild === 'number'\n ) {\n return fragmentList\n }\n return fragmentList.concat(fragmentChild)\n },\n []\n )\n )\n }\n return list.concat(child)\n}\n\nconst METATYPES = ['name', 'httpEquiv', 'charSet', 'itemProp']\n\n/*\n returns a function for filtering head child elements\n which shouldn't be duplicated, like <title/>\n Also adds support for deduplicated `key` properties\n*/\nfunction unique() {\n const keys = new Set()\n const tags = new Set()\n const metaTypes = new Set()\n const metaCategories: { [metatype: string]: Set<string> } = {}\n\n return (h: React.ReactElement<any>) => {\n let isUnique = true\n let hasKey = false\n\n if (h.key && typeof h.key !== 'number' && h.key.indexOf('$') > 0) {\n hasKey = true\n const key = h.key.slice(h.key.indexOf('$') + 1)\n if (keys.has(key)) {\n isUnique = false\n } else {\n keys.add(key)\n }\n }\n\n // eslint-disable-next-line default-case\n switch (h.type) {\n case 'title':\n case 'base':\n if (tags.has(h.type)) {\n isUnique = false\n } else {\n tags.add(h.type)\n }\n break\n case 'meta':\n for (let i = 0, len = METATYPES.length; i < len; i++) {\n const metatype = METATYPES[i]\n if (!h.props.hasOwnProperty(metatype)) continue\n\n if (metatype === 'charSet') {\n if (metaTypes.has(metatype)) {\n isUnique = false\n } else {\n metaTypes.add(metatype)\n }\n } else {\n const category = h.props[metatype]\n const categories = metaCategories[metatype] || new Set()\n if ((metatype !== 'name' || !hasKey) && categories.has(category)) {\n isUnique = false\n } else {\n categories.add(category)\n metaCategories[metatype] = categories\n }\n }\n }\n break\n }\n\n return isUnique\n }\n}\n\n/**\n *\n * @param headChildrenElements List of children of <Head>\n */\nfunction reduceComponents(\n headChildrenElements: Array<React.ReactElement<any>>\n) {\n return headChildrenElements\n .reduce(onlyReactElement, [])\n .reverse()\n .concat(defaultHead().reverse())\n .filter(unique())\n .reverse()\n .map((c: React.ReactElement<any>, i: number) => {\n const key = c.key || i\n if (process.env.NODE_ENV === 'development') {\n // omit JSON-LD structured data snippets from the warning\n if (c.type === 'script' && c.props['type'] !== 'application/ld+json') {\n const srcMessage = c.props['src']\n ? `<script> tag with src=\"${c.props['src']}\"`\n : `inline <script>`\n warnOnce(\n `Do not add <script> tags using next/head (see ${srcMessage}). Use next/script instead. \\nSee more info here: https://nextjs.org/docs/messages/no-script-tags-in-head-component`\n )\n } else if (c.type === 'link' && c.props['rel'] === 'stylesheet') {\n warnOnce(\n `Do not add stylesheets using next/head (see <link rel=\"stylesheet\"> tag with href=\"${c.props['href']}\"). Use Document instead. \\nSee more info here: https://nextjs.org/docs/messages/no-stylesheets-in-head-component`\n )\n }\n }\n return React.cloneElement(c, { key })\n })\n}\n\n/**\n * This component injects elements to `<head>` of your page.\n * To avoid duplicated `tags` in `<head>` you can use the `key` property, which will make sure every tag is only rendered once.\n */\nfunction Head({ children }: { children: React.ReactNode }) {\n const headManager = useContext(HeadManagerContext)\n return (\n <Effect\n reduceComponentsToState={reduceComponents}\n headManager={headManager}\n >\n {children}\n </Effect>\n )\n}\n\nexport default Head\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","module.exports = (\n require('../../module.compiled') as typeof import('../../module.compiled')\n).vendored['contexts'].ImageConfigContext\n","module.exports = (\n require('../../module.compiled') as typeof import('../../module.compiled')\n).vendored['contexts'].RouterContext\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","'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"],"names":["PRESET_TAGS","formatTime","ms","Date","toLocaleString","undefined","month","day","hour","minute","hour12","cwdBasename","cwd","split","filter","Boolean","pop","duration","startMs","endMs","activeLabel","mins","Math","round","floor","parseTags","raw","JSON","parse","ToolBadge","tool","className","TagChip","label","onRemove","colors","blocked","poc","spike","review","done","cls","onClick","SessionsTable","sessions","t","search","setSearch","tagStates","setTagStates","tagInput","setTagInput","tagOpen","setTagOpen","filtered","q","toLowerCase","s","includes","ai_title","summary","saveTags","sessionId","tags","fetch","method","headers","body","stringify","getTags","id","addTag","tag","trimmed","trim","replace","cur","removeTag","type","placeholder","value","onChange","e","target","active","ended_at","length","shown","total","map","isActive","isTagOpen","Fragment","started_at","autoFocus","x","onKeyDown","key","pt","slice","SideEffect","isServer","window","useClientOnlyLayoutEffect","useLayoutEffect","useClientOnlyEffect","useEffect","props","headManager","reduceComponentsToState","emitChange","mountedInstances","headElements","Children","toArray","Array","from","updateHead","add","children","delete","_pendingUpdate","module","exports","require","vendored","HeadManagerContext","defaultHead","head","meta","charSet","name","content","onlyReactElement","list","child","React","concat","reduce","fragmentList","fragmentChild","METATYPES","unique","keys","Set","metaTypes","metaCategories","h","isUnique","hasKey","indexOf","has","i","len","metatype","hasOwnProperty","category","categories","reduceComponents","headChildrenElements","reverse","c","process","env","NODE_ENV","srcMessage","warnOnce","cloneElement","Head","useContext","Effect","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","Number","isFinite","NaN","test","parseInt","getWidths","allSizes","width","sizes","viewportWidthRe","percentSizes","match","exec","push","smallestRatio","min","widths","kind","w","find","p","generateImgAttrs","config","quality","startsWith","deploymentId","getDeploymentId","qIndex","params","URLSearchParams","srcDpl","get","append","toString","srcSet","last","join","priority","preload","loading","height","fill","style","overrideSrc","onLoad","onLoadingComplete","fetchPriority","decoding","layout","objectPosition","lazyBoundary","lazyRoot","rest","_state","imgConf","showAltText","blurComplete","defaultLoader","sort","a","b","Error","isDefaultLoader","customImageLoader","obj","_","opts","layoutToStyle","intrinsic","maxWidth","responsive","layoutToSizes","layoutStyle","layoutSizes","staticSrc","staticImageData","ratio","isLazy","endsWith","qualityInt","output","position","isNaN","String","VALID_BLUR_EXT","urlStr","url","URL","err","pathname","legacyKey","legacyValue","Object","entries","PerformanceObserver","entryList","entry","getEntries","imgSrc","element","lcpImage","observe","buffered","console","error","imgStyle","assign","left","top","right","bottom","color","backgroundImage","backgroundSize","placeholderStyle","backgroundPosition","backgroundRepeat","imgAttributes","loadingFinal","fullUrl","location","href","set","ImageConfigContext","RouterContext","findClosestQuality","prev","abs","missingValues","remaining","NEXT_RUNTIME","hasLocalMatch","parsedSrc","hasRemoteMatch","hostname","encodeURIComponent","__next_img_default","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","prevented","stopped","nativeEvent","currentTarget","isDefaultPrevented","isPropagationStopped","persist","preventDefault","stopPropagation","origSrc","searchParams","getAttribute","widthViewportRatio","getBoundingClientRect","innerWidth","getComputedStyle","valid","heightModified","widthModified","getDynamicProps","use","fetchpriority","ImageElement","forwardRef","setShowAltText","onError","forwardedRef","ownRef","useCallback","complete","ref","useMergedRef","data-nimg","ImagePreload","isAppRouter","as","imageSrcSet","crossOrigin","referrerPolicy","ReactDOM","link","rel","pagesRouter","configContext","useMemo","useRef","useState","imgMeta"],"mappings":"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","ignoreList":[9,10,11,12,13,14,15,16,17,18,19]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
module.exports=[790,(a,b,c)=>{let{createClientModuleProxy:d}=a.r(11857);a.n(d("[project]/node_modules/next/dist/client/app-dir/link.js <module evaluation>"))},84707,(a,b,c)=>{let{createClientModuleProxy:d}=a.r(11857);a.n(d("[project]/node_modules/next/dist/client/app-dir/link.js"))},97647,a=>{"use strict";a.i(790);var b=a.i(84707);a.n(b)},95936,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0});var d={default:function(){return i},useLinkStatus:function(){return h.useLinkStatus}};for(var e in d)Object.defineProperty(c,e,{enumerable:!0,get:d[e]});let f=a.r(64240),g=a.r(7997),h=f._(a.r(97647));function i(a){let b=a.legacyBehavior,c="string"==typeof a.children||"number"==typeof a.children||"string"==typeof a.children?.type,d=a.children?.type?.$$typeof===Symbol.for("react.client.reference");return!b||c||d||(a.children?.type?.$$typeof===Symbol.for("react.lazy")?console.error("Using a Lazy Component as a direct child of `<Link legacyBehavior>` from a Server Component is not supported. If you need legacyBehavior, wrap your Lazy Component in a Client Component that renders the Link's `<a>` tag."):console.error("Using a Server Component as a direct child of `<Link legacyBehavior>` is not supported. If you need legacyBehavior, wrap your Server Component in a Client Component that renders the Link's `<a>` tag.")),(0,g.jsx)(h.default,{...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)},11769,a=>{"use strict";a.s(["LocaleSwitcher",()=>b]);let b=(0,a.i(11857).registerClientReference)(function(){throw Error("Attempted to call LocaleSwitcher() from the server but LocaleSwitcher 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/LocaleSwitcher.tsx <module evaluation>","LocaleSwitcher")},36419,a=>{"use strict";a.s(["LocaleSwitcher",()=>b]);let b=(0,a.i(11857).registerClientReference)(function(){throw Error("Attempted to call LocaleSwitcher() from the server but LocaleSwitcher 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/LocaleSwitcher.tsx","LocaleSwitcher")},60447,a=>{"use strict";a.i(11769);var b=a.i(36419);a.n(b)},18391,a=>{"use strict";let b={zh:{"common.dashboard":"仪表盘","common.admin":"管理","common.settings":"设置","common.cancel":"取消","common.save":"保存","common.delete":"删除","common.close":"关闭","common.add":"添加","common.edit":"编辑","common.refresh":"刷新","common.loading":"加载中…","common.unknown":"未知","common.all":"全部","common.empty":"暂无数据","common.language":"语言","header.tagline":"量化你的 AI 编码节奏 · 本地优先 · 数据永不离开本机","header.langZh":"中文","header.langEn":"EN","dashboard.refreshData":"刷新数据","dashboard.refreshing":"刷新中…","dashboard.toolAll":"全部","dashboard.toolClaude":"Claude Code","dashboard.toolCodex":"Codex","dashboard.toolCursor":"Cursor","dashboard.dateToday":"今天","dashboard.date7d":"近 7 天","dashboard.date30d":"近 30 天","dashboard.dateAll":"全部","dashboard.codexAccount":"Codex 账户","dashboard.codexAccountAll":"所有 Codex 账户","dashboard.codexHistoryFilter.current":"仅当前账户","dashboard.codexHistoryFilter.saved":"仅已保存账户的历史","dashboard.codexHistoryFilter.all":"所有已保存与历史 Codex 使用","dashboard.codexSwitchHint":"当前选项只筛选历史。如要采集新数据,请到「管理」切换账户。","dashboard.window5h":"5h 窗口","dashboard.windowWeekly":"本周窗口","dashboard.remaining":"剩余","dashboard.used":"已用","dashboard.noData":"暂无数据","dashboard.todaySessions":"今日会话","dashboard.totalSessions":"累计会话","dashboard.dateToday2":"今天","dashboard.date7days":"近 7 天","dashboard.date30days":"近 30 天","dashboard.dateAlltime":"全部时间","dashboard.refreshFailed":"刷新失败","dashboard.scanned":"扫了 {n} 条日志,耗时 {seconds}s","dashboard.codexCurrentOnly":"仅当前账户","dashboard.codexSavedOnly":"仅已保存账户的历史","dashboard.codexAllUsage":"所有已保存与历史 Codex 使用","dashboard.window7d":"7 天预算","dashboard.codexLabel":"codex · 所有账户","dashboard.codexLabelPrefix":"codex","dashboard.allAgents":"所有 agents","dashboard.claudeCodeLower":"claude code","dashboard.noSnapshot":"该账户暂无 rate-limit 快照","dashboard.useCodexThenRefresh":"在 Codex 用一次再刷新","dashboard.switchAdminThenUse":"到「管理」切换后用一次 Codex,再刷新","dashboard.resetting":"重置中…","dashboard.resetsAt":"{date}({rel}后)重置","dashboard.short":"all","card.spending.title":"消费 / 用量","card.spending.claudeCost":"claude code 累计","card.spending.codexTokens":"codex tokens","card.spending.last14d":"近 14 天","card.spending.noCursor":"当前筛选下无消费数据(cursor 无 token 计费)","card.spending.legendClaude":"claude ($)","card.spending.legendCodex":"codex (tokens)","card.activity.title":"活跃度","card.activity.streakDays":"连续 {n} 天","card.activity.peakSlot":"高峰时段","card.activity.todayTimeline":"今日时间线","card.activity.viewPattern":"热力图","card.activity.viewToday":"今日","card.activity.dayStreak":"天连续","card.activity.longest":"最长","card.activity.activeDays":"活跃天","card.activity.total":"累计","card.activity.peakSlotFmt":"高峰时段:{day} {hour}:00({mins})","card.activity.dayMon":"一","card.activity.dayTue":"二","card.activity.dayWed":"三","card.activity.dayThu":"四","card.activity.dayFri":"五","card.activity.daySat":"六","card.activity.daySun":"日","card.activity.less":"少","card.activity.more":"多","card.activity.dayHeader":"{date} · {n} 次会话 · 累计 {hours}h","card.activity.noToday":"今天还没有会话","card.achievements.title":"成就","card.achievements.unlocked":"已解锁 {n} / {total}","card.achievements.showLess":"收起","card.achievements.showAll":"查看全部({n})","achv.sessions-100.title":"百战不殆","achv.sessions-100.desc":"累计 100 个会话","achv.sessions-500.title":"已成习惯","achv.sessions-500.desc":"累计 500 个会话","achv.sessions-1000.title":"千锤百炼","achv.sessions-1000.desc":"累计 1000 个会话","achv.streak-7.title":"一周连击","achv.streak-7.desc":"连续编码 7 天","achv.streak-30.title":"月度坚持","achv.streak-30.desc":"连续编码 30 天","achv.spend-10.title":"小试牛刀","achv.spend-10.desc":"Claude 累计花费 $10+","achv.spend-100.title":"挥金如土","achv.spend-100.desc":"Claude 累计花费 $100+","achv.tokens-100m.title":"Token 富翁","achv.tokens-100m.desc":"Codex 累计 100M tokens","achv.tokens-1b.title":"Token 大户","achv.tokens-1b.desc":"Codex 累计 1B tokens","achv.marathon-4h.title":"马拉松选手","achv.marathon-4h.desc":"单次会话超过 4 小时","achv.marathon-8h.title":"通宵达旦","achv.marathon-8h.desc":"单次会话超过 8 小时","achv.projects-10.title":"博学多才","achv.projects-10.desc":"在 10+ 个项目里工作过","achv.projects-30.title":"杂家","achv.projects-30.desc":"在 30+ 个项目里工作过","achv.night-owl.title":"夜猫子","achv.night-owl.desc":"过午夜的会话 10+ 次","achv.early-bird.title":"晨型人","achv.early-bird.desc":"早 7 点前的会话 5+ 次","achv.multi-tool.title":"多面手","achv.multi-tool.desc":"用过 3 种不同的工具","card.burndown.title":"近 7 天用量","card.burndown.header":"近 7 天用量 · {label}","card.burndown.notEnough":"数据不足以画图","card.burndown.tipUsed":"已用","card.burndown.legend5h":"5h","card.burndown.legend7d":"7d","card.leaderboard.title":"项目榜","card.leaderboard.hours":"小时","card.leaderboard.sessions":"会话","card.leaderboard.tools":"工具","card.leaderboard.noProjects":"还没有项目数据","card.hotspots.title":"文件热点","card.hotspots.sessions":"次会话","card.toolSplit.title":"工具分布","card.toolSplit.sessions":"次会话","card.toolSplit.totalSessions":"共 {n} 次会话","card.sessions.title":"会话","card.sessions.search":"搜项目 / 标题…","card.sessions.tag":"标签","card.sessions.tool":"工具","card.sessions.project":"项目 · 标题","card.sessions.duration":"时长","card.sessions.started":"开始","card.sessions.status":"状态","card.sessions.tags":"标签","card.sessions.recent":"最近会话","card.sessions.activeCount":"{active} 进行中 · {shown}/{total}","card.sessions.noMatch":"没有匹配的会话。","card.sessions.active":"进行中","card.sessions.done":"完成","card.sessions.tagPlaceholder":"标签…","admin.title":"Vibemeter · 管理","admin.subtitle":"本地 Codex 账户切换 · token 永不离开本机","admin.activeAccount":"当前 Codex 账户","admin.importCurrent":"保存当前 Codex 登录","admin.importing":"保存中…","admin.switch":"切换","admin.switching":"切换中…","admin.deleting":"删除中…","admin.savedAccounts":"已保存账户","admin.lastRefresh":"上次刷新","admin.activeAccountLabel":"当前 Codex 账户","admin.plan":"套餐","admin.accountId":"账户 id","admin.accessToken":"访问 token","admin.expires":"过期于 {date}","admin.noAuth":"未在 ~/.codex/auth.json 找到可读的 Codex 凭据。","admin.localStore":"本地账户存储","admin.localStoreHint":"快照存在 {path}。Token 落到磁盘是为了支持切换,本页只渲染解码后的元数据。","admin.colAccount":"账户","admin.colPlan":"套餐","admin.colTokens":"tokens","admin.colActions":"操作","admin.noSaved":"还没有已保存的账户。先登录 Codex,再来这里保存当前登录。","admin.active":"当前","admin.accessFmt":"访问 {date}","admin.savedFmt":"保存于 {date}","admin.importSuccess":"当前 Codex 登录已存入账户列表。","admin.switchSuccess":"Codex auth.json 已切换。重启正在运行的 Codex 会话以生效。","admin.deleteSuccess":"已删除该账户快照。","settings.title":"Vibemeter · 设置","settings.subtitle":"本地偏好 · 任何配置都不会离开本机","notify.title":"语音 + 系统通知","notify.subtitle":"仅 macOS。Claude/Codex 完成后,朗读「{tool} {project} 完成」并弹出系统通知。改动 ~/.claude/settings.json 与 ~/.codex/config.toml 前都会备份。","notify.on":"已开启","notify.off":"未开启","notify.claudeStop":"Claude · Stop","notify.claudeNotification":"Claude · Notification","notify.codexComplete":"Codex · complete","notify.foreignNotifyWarning":"检测到 Codex 已配置其他 notify 命令,Vibemeter 不会覆盖:","notify.foreignNotifyHint":"若想交给 Vibemeter 接管,请手动移除上面那行。","notify.enable":"开启语音通知","notify.reapply":"重新套用","notify.disable":"关闭","notify.scriptMissing":"语音脚本不存在:{path}。请重装 @hirra/vibemeter。","notify.hookStop":"Claude Code Stop hook","notify.hookNotification":"Claude Code Notification hook(需介入时)","notify.hookCodex":"Codex notify({state})","notify.hookCodexConfigFound":"已找到配置","notify.hookCodexConfigMissing":"未找到 ~/.codex/config.toml","notify.foreignWarn":"检测到 foreign notify","notify.foreignBody":"Codex 已经配置了其他 notify 命令,Vibemeter **不会**覆盖:","notify.foreignRemove":"如需 Vibemeter 接管,请手动移除上面那一行。","notify.installing":"开启中…","notify.removing":"关闭中…","notify.skipNoCodex":"Codex 配置未找到 — 已跳过","notify.skipForeign":"Codex 已有其他 notify 命令,已保留原值:{cmd}","notify.updated":"已更新。{notes}","notify.enabledMsg":"语音通知已开启。","notify.disabledMsg":"语音通知已关闭。","alerts.title":"额度推送提醒","alerts.subtitle":"quota 触发阈值、每日摘要、5h/weekly 重置前提醒 — 推到企业微信群机器人或任意 webhook。webhook 只写本地 {path},{warn}","alerts.subtitleWarn":"绝不会进 GitHub","alerts.sectionChannels":"推送通道","alerts.sectionRules":"触发规则","alerts.addChannelWxwork":"+ 企业微信","alerts.addChannelGeneric":"+ 通用 webhook","alerts.addRuleThreshold":"+ 阈值","alerts.addRuleDaily":"+ 每日定时","alerts.addRuleReset":"+ 重置提醒","alerts.noChannels":"尚未配置任何通道。","alerts.noRules":"尚未配置任何规则。","alerts.testBtn":"测试","alerts.testing":"测试中…","alerts.sendNow":"现在发摘要","alerts.sending":"发送中…","alerts.delete":"删除","alerts.webhookLabel":"Webhook URL","alerts.webhookHintWxwork":"— qyapi.weixin.qq.com/cgi-bin/webhook/send?key=…","alerts.webhookPlaceholderEdit":"粘贴完整 webhook URL","alerts.webhookPlaceholderClick":"点击编辑","alerts.webhookStored":"已存储 — 编辑会替换;不编辑就保持原值","alerts.editFirst":"请先保存再测试","alerts.saveBtn":"保存配置","alerts.saving":"保存中…","alerts.runAllNow":"立即评估所有规则","alerts.evaluating":"评估中…","alerts.savedHint":"已保存。webhook 仅写入本地 ~/.vibemeter/alerts.json,不会上 GitHub。","alerts.testSuccess":"测试消息推送成功({channel}, {attempts} 次)","alerts.summarySuccess":"今日摘要推送成功({channel}, {attempts} 次)","alerts.pushFail":"推送失败:{message}","alerts.evalDone":"评估完成 — 触发 {fired} 次推送,启用规则 {evaluated} 条","alerts.kindThreshold":"阈值","alerts.kindDaily":"每日","alerts.kindReset":"重置提醒","alerts.enabled":"启用","alerts.metric":"指标","alerts.below":"低于","alerts.pushTime":"推送时间","alerts.pushTimeHint":"(本机时区,每天最多一条)","alerts.window":"窗口","alerts.minutesBefore":"提前","alerts.minutesBeforeHint":"分钟(60=1h,1440=1d)","alerts.remainingAbove":"剩余 ≥","alerts.remainingAboveHint":"% 时才推(赶在重置前用掉)","alerts.pushTo":"推送到","alerts.addChannelFirst":"先添加通道","alerts.pushLocale":"推送语言","alerts.pushLocaleHint":"群里发的消息用哪种语言(独立于 UI 语言)","alerts.pushLocaleZh":"中文","alerts.pushLocaleEn":"English","alerts.defaultLabelWxwork":"企业微信机器人","alerts.defaultLabelGeneric":"通用 webhook","alerts.testMsgWord":"测试消息","alerts.summaryWord":"今日摘要","alerts.pushFailUnknown":"未知错误","alerts.metric.claude_5h_remaining_pct":"Claude Code · 5h 剩余","alerts.metric.claude_weekly_remaining_pct":"Claude Code · 本周剩余","alerts.metric.codex_5h_remaining_pct":"Codex · 5h 剩余","alerts.metric.codex_weekly_remaining_pct":"Codex · 本周剩余","alerts.resetMetric.claude_5h":"Claude Code · 5h 窗口","alerts.resetMetric.claude_weekly":"Claude Code · 本周窗口","alerts.resetMetric.codex_5h":"Codex · 5h 窗口","alerts.resetMetric.codex_weekly":"Codex · 本周窗口","donate.title":"觉得好用?请作者喝杯咖啡","donate.subtitle":"Vibemeter 完全本地、完全免费。如果它帮你省了时间,欢迎随手打赏 — 无义务。","donate.alipay":"支付宝","donate.zoomClose":"关闭","donate.aside":"扫码即可,金额随意。备注里写一句你最常看哪个数据,下次迭代我会优先做。","donate.missing":"QR image not bundled yet — drop it at {path}.","float.unknownReset":"unknown reset","float.snapshotExpired":"snapshot expired","float.noSnapshot":"no snapshot","float.justNow":"just now","float.minAgo":"{n}m ago","float.hourAgo":"{n}h ago","float.currentQuota":"current quota","float.noQuota":"no quota","float.fiveHRemain":"5h remaining","float.usedPct":"{pct} used","float.usedNo":"No snapshot","float.refresh":"Refresh","float.refreshing":"Refreshing","float.statToday":"today","float.statTotal":"total","float.statWeekly":"weekly","float.noToday":"No sessions today","float.latest":"latest"},en:{"common.dashboard":"Dashboard","common.admin":"Admin","common.settings":"Settings","common.cancel":"Cancel","common.save":"Save","common.delete":"Delete","common.close":"Close","common.add":"Add","common.edit":"Edit","common.refresh":"Refresh","common.loading":"Loading…","common.unknown":"unknown","common.all":"All","common.empty":"no data yet","common.language":"Language","header.tagline":"measure your AI coding vibe · local-first · data never leaves this machine","header.langZh":"中文","header.langEn":"EN","dashboard.refreshData":"Refresh data","dashboard.refreshing":"Refreshing…","dashboard.toolAll":"All","dashboard.toolClaude":"Claude Code","dashboard.toolCodex":"Codex","dashboard.toolCursor":"Cursor","dashboard.dateToday":"Today","dashboard.date7d":"7d","dashboard.date30d":"30d","dashboard.dateAll":"All","dashboard.codexAccount":"Codex account","dashboard.codexAccountAll":"All Codex accounts","dashboard.codexHistoryFilter.current":"current account only","dashboard.codexHistoryFilter.saved":"saved account history only","dashboard.codexHistoryFilter.all":"all saved and legacy Codex usage","dashboard.codexSwitchHint":"Dashboard selection filters saved history only. Switch this account in Admin to collect new Codex usage.","dashboard.window5h":"5h window","dashboard.windowWeekly":"weekly window","dashboard.remaining":"remaining","dashboard.used":"used","dashboard.noData":"no data yet","dashboard.todaySessions":"Today's sessions","dashboard.totalSessions":"Total sessions","dashboard.dateToday2":"Today","dashboard.date7days":"7 days","dashboard.date30days":"30 days","dashboard.dateAlltime":"All time","dashboard.refreshFailed":"Refresh failed","dashboard.scanned":"scanned {n} logs in {seconds}s","dashboard.codexCurrentOnly":"current account only","dashboard.codexSavedOnly":"saved account history only","dashboard.codexAllUsage":"all saved and legacy Codex usage","dashboard.window7d":"7-day budget","dashboard.codexLabel":"codex · all accounts","dashboard.codexLabelPrefix":"codex","dashboard.allAgents":"all agents","dashboard.claudeCodeLower":"claude code","dashboard.noSnapshot":"no rate-limit snapshot for this account yet","dashboard.useCodexThenRefresh":"use Codex once, then Refresh data","dashboard.switchAdminThenUse":"switch it in Admin, use Codex once, then Refresh data","dashboard.resetting":"resetting…","dashboard.resetsAt":"resets at {date} (in {rel})","dashboard.short":"all","card.spending.title":"spending / consumption","card.spending.claudeCost":"claude code total","card.spending.codexTokens":"codex tokens","card.spending.last14d":"last 14 days","card.spending.noCursor":"no spending data for cursor","card.spending.legendClaude":"claude ($)","card.spending.legendCodex":"codex (tokens)","card.activity.title":"activity","card.activity.streakDays":"{n}-day streak","card.activity.peakSlot":"peak slot","card.activity.todayTimeline":"today's timeline","card.activity.viewPattern":"pattern","card.activity.viewToday":"today","card.activity.dayStreak":"day streak","card.activity.longest":"longest","card.activity.activeDays":"active days","card.activity.total":"total","card.activity.peakSlotFmt":"peak slot: {day} {hour}:00 ({mins})","card.activity.dayMon":"Mon","card.activity.dayTue":"Tue","card.activity.dayWed":"Wed","card.activity.dayThu":"Thu","card.activity.dayFri":"Fri","card.activity.daySat":"Sat","card.activity.daySun":"Sun","card.activity.less":"less","card.activity.more":"more","card.activity.dayHeader":"{date} · {n} sessions · {hours}h active","card.activity.noToday":"no sessions today","card.achievements.title":"achievements","card.achievements.unlocked":"{n} / {total} unlocked","card.achievements.showLess":"show less","card.achievements.showAll":"show all ({n})","achv.sessions-100.title":"Centurion","achv.sessions-100.desc":"100 sessions logged","achv.sessions-500.title":"Habituated","achv.sessions-500.desc":"500 sessions logged","achv.sessions-1000.title":"Veteran","achv.sessions-1000.desc":"1000 sessions logged","achv.streak-7.title":"Week streak","achv.streak-7.desc":"7-day coding streak","achv.streak-30.title":"Month streak","achv.streak-30.desc":"30-day coding streak","achv.spend-10.title":"First $10","achv.spend-10.desc":"Claude spend $10+","achv.spend-100.title":"Big spender","achv.spend-100.desc":"Claude spend $100+","achv.tokens-100m.title":"Token rich","achv.tokens-100m.desc":"100M Codex tokens","achv.tokens-1b.title":"Token tycoon","achv.tokens-1b.desc":"1B Codex tokens","achv.marathon-4h.title":"Marathoner","achv.marathon-4h.desc":"Single session 4h+","achv.marathon-8h.title":"All-nighter","achv.marathon-8h.desc":"Single session 8h+","achv.projects-10.title":"Polymath","achv.projects-10.desc":"Worked on 10+ projects","achv.projects-30.title":"Jack of all","achv.projects-30.desc":"Worked on 30+ projects","achv.night-owl.title":"Night owl","achv.night-owl.desc":"Past-midnight sessions 10+","achv.early-bird.title":"Early bird","achv.early-bird.desc":"Pre-7am sessions 5+","achv.multi-tool.title":"Multi-tool","achv.multi-tool.desc":"Used 3 different tools","card.burndown.title":"7-day burndown","card.burndown.header":"usage history (7d) · {label}","card.burndown.notEnough":"not enough data yet","card.burndown.tipUsed":"used","card.burndown.legend5h":"5h","card.burndown.legend7d":"7day","card.leaderboard.title":"project leaderboard","card.leaderboard.hours":"hours","card.leaderboard.sessions":"sessions","card.leaderboard.tools":"tools","card.leaderboard.noProjects":"no projects yet","card.hotspots.title":"file hotspots","card.hotspots.sessions":"sessions","card.toolSplit.title":"tool split","card.toolSplit.sessions":"sessions","card.toolSplit.totalSessions":"{n} total sessions","card.sessions.title":"Sessions","card.sessions.search":"search project / title…","card.sessions.tag":"tag","card.sessions.tool":"tool","card.sessions.project":"project · title","card.sessions.duration":"dur","card.sessions.started":"started","card.sessions.status":"status","card.sessions.tags":"tags","card.sessions.recent":"Recent Sessions","card.sessions.activeCount":"{active} active · {shown}/{total}","card.sessions.noMatch":"No sessions match.","card.sessions.active":"active","card.sessions.done":"done","card.sessions.tagPlaceholder":"tag…","admin.title":"Vibemeter Admin","admin.subtitle":"local Codex account switching · tokens stay on this machine","admin.activeAccount":"Active Codex account","admin.importCurrent":"Save current Codex login","admin.importing":"Saving…","admin.switch":"Switch","admin.switching":"Switching…","admin.deleting":"Deleting…","admin.savedAccounts":"Saved accounts","admin.lastRefresh":"last refresh","admin.activeAccountLabel":"Active Codex account","admin.plan":"plan","admin.accountId":"account id","admin.accessToken":"access token","admin.expires":"expires {date}","admin.noAuth":"No readable Codex auth found at ~/.codex/auth.json.","admin.localStore":"Local account store","admin.localStoreHint":"Saved snapshots live in {path}. Tokens are stored on disk for switching, but this page only renders decoded metadata.","admin.colAccount":"account","admin.colPlan":"plan","admin.colTokens":"tokens","admin.colActions":"actions","admin.noSaved":"No saved accounts yet. Log into Codex, then save the current login here.","admin.active":"active","admin.accessFmt":"access {date}","admin.savedFmt":"saved {date}","admin.importSuccess":"Current Codex login saved to the account list.","admin.switchSuccess":"Codex auth.json switched. Restart active Codex sessions to use the new account.","admin.deleteSuccess":"Saved account removed.","settings.title":"Vibemeter Settings","settings.subtitle":"local preferences · nothing leaves this machine","notify.title":"Voice + system notifications","notify.subtitle":'macOS only. When an agent finishes you\'ll hear a short "{tool} {project} done" and see a banner. ~/.claude/settings.json and ~/.codex/config.toml are backed up before any change.',"notify.on":"on","notify.off":"off","notify.claudeStop":"Claude · Stop","notify.claudeNotification":"Claude · Notification","notify.codexComplete":"Codex · complete","notify.foreignNotifyWarning":"Codex already has a different notify command. Vibemeter will not overwrite it:","notify.foreignNotifyHint":"Remove that line manually if you want Vibemeter to take over.","notify.enable":"Enable voice notifications","notify.reapply":"Re-apply","notify.disable":"Disable","notify.scriptMissing":"Speaker script not found at {path}. Reinstall @hirra/vibemeter.","notify.hookStop":"Claude Code Stop hook","notify.hookNotification":"Claude Code Notification hook (when permission needed)","notify.hookCodex":"Codex notify ({state})","notify.hookCodexConfigFound":"config found","notify.hookCodexConfigMissing":"no ~/.codex/config.toml","notify.foreignWarn":"foreign notify exists","notify.foreignBody":"Codex already has a different notify command. Vibemeter will **not** overwrite it:","notify.foreignRemove":"Remove that line manually if you want Vibemeter to take over.","notify.installing":"Enabling…","notify.removing":"Removing…","notify.skipNoCodex":"Codex config not found — skipped","notify.skipForeign":"Codex notify already set to a different command, left alone: {cmd}","notify.updated":"Updated. {notes}","notify.enabledMsg":"Voice notifications enabled.","notify.disabledMsg":"Voice notifications removed.","alerts.title":"Quota push alerts","alerts.subtitle":"threshold trips, daily summary, 5h/weekly reset reminders — push to WeChat Work bot or any webhook. Webhook is written to {path} only — {warn}","alerts.subtitleWarn":"never reaches GitHub","alerts.sectionChannels":"Push channels","alerts.sectionRules":"Trigger rules","alerts.addChannelWxwork":"+ WeChat Work","alerts.addChannelGeneric":"+ Generic webhook","alerts.addRuleThreshold":"+ Threshold","alerts.addRuleDaily":"+ Daily","alerts.addRuleReset":"+ Reset reminder","alerts.noChannels":"No channels yet.","alerts.noRules":"No rules yet.","alerts.testBtn":"Test","alerts.testing":"Testing…","alerts.sendNow":"Send summary now","alerts.sending":"Sending…","alerts.delete":"Delete","alerts.webhookLabel":"Webhook URL","alerts.webhookHintWxwork":"— qyapi.weixin.qq.com/cgi-bin/webhook/send?key=…","alerts.webhookPlaceholderEdit":"Paste the full webhook URL","alerts.webhookPlaceholderClick":"Click to edit","alerts.webhookStored":"Stored — editing replaces; leave alone to keep current.","alerts.editFirst":"Save first before testing","alerts.saveBtn":"Save","alerts.saving":"Saving…","alerts.runAllNow":"Evaluate all rules now","alerts.evaluating":"Evaluating…","alerts.savedHint":"Saved. Webhook is only written to ~/.vibemeter/alerts.json — never uploaded to GitHub.","alerts.testSuccess":"Test message delivered ({channel}, {attempts} attempt(s))","alerts.summarySuccess":"Today's summary delivered ({channel}, {attempts} attempt(s))","alerts.pushFail":"Push failed: {message}","alerts.evalDone":"Done — {fired} push(es) fired, {evaluated} enabled rule(s)","alerts.kindThreshold":"threshold","alerts.kindDaily":"daily","alerts.kindReset":"reset","alerts.enabled":"enabled","alerts.metric":"Metric","alerts.below":"Below","alerts.pushTime":"Push at","alerts.pushTimeHint":"(local time, at most one per day)","alerts.window":"Window","alerts.minutesBefore":"Lead","alerts.minutesBeforeHint":"min (60=1h, 1440=1d)","alerts.remainingAbove":"Remaining ≥","alerts.remainingAboveHint":"% (only nudges while quota is worth saving)","alerts.pushTo":"Push to","alerts.addChannelFirst":"Add a channel first","alerts.pushLocale":"Push language","alerts.pushLocaleHint":"Language used in pushed messages (independent of UI language)","alerts.pushLocaleZh":"中文","alerts.pushLocaleEn":"English","alerts.defaultLabelWxwork":"WeChat Work bot","alerts.defaultLabelGeneric":"Generic webhook","alerts.testMsgWord":"Test message","alerts.summaryWord":"Today's summary","alerts.pushFailUnknown":"unknown error","alerts.metric.claude_5h_remaining_pct":"Claude Code · 5h remaining","alerts.metric.claude_weekly_remaining_pct":"Claude Code · weekly remaining","alerts.metric.codex_5h_remaining_pct":"Codex · 5h remaining","alerts.metric.codex_weekly_remaining_pct":"Codex · weekly remaining","alerts.resetMetric.claude_5h":"Claude Code · 5h window","alerts.resetMetric.claude_weekly":"Claude Code · weekly window","alerts.resetMetric.codex_5h":"Codex · 5h window","alerts.resetMetric.codex_weekly":"Codex · weekly window","donate.title":"Tip the author","donate.subtitle":"Vibemeter is fully local and free. If it saves you time, a small tip keeps the project alive — no obligation.","donate.alipay":"Alipay","donate.zoomClose":"Close","donate.aside":"Scan and pay any amount. Drop a note about the dashboard view you use the most — that drives the next iteration.","donate.missing":"QR image not bundled yet — drop it at {path}.","float.unknownReset":"未知重置时间","float.snapshotExpired":"快照已过期","float.noSnapshot":"尚无快照","float.justNow":"刚刚","float.minAgo":"{n} 分钟前","float.hourAgo":"{n} 小时前","float.currentQuota":"当前额度","float.noQuota":"无额度","float.fiveHRemain":"5h 剩余","float.usedPct":"已用 {pct}","float.usedNo":"尚无数据","float.refresh":"刷新","float.refreshing":"刷新中","float.statToday":"今日","float.statTotal":"累计","float.statWeekly":"本周","float.noToday":"今天还没有会话","float.latest":"最近"}};a.s(["t",0,function(a,c,d){let e=(b[a]??b.zh)[c]??c;return d?e.replace(/\{(\w+)\}/g,(a,b)=>{let c=d[b];return null==c?`{${b}}`:String(c)}):e}],18391)}];
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=_0lfe3wr._.js.map
|