@hirra/vibemeter 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +7 -1
  3. package/.next/build-manifest.json +7 -8
  4. package/.next/fallback-build-manifest.json +3 -3
  5. package/.next/prerender-manifest.json +16 -12
  6. package/.next/required-server-files.js +5 -4
  7. package/.next/required-server-files.json +5 -4
  8. package/.next/routes-manifest.json +36 -0
  9. package/.next/server/app/_global-error/page/build-manifest.json +4 -5
  10. package/.next/server/app/_global-error/page.js +4 -4
  11. package/.next/server/app/_global-error/page.js.nft.json +1 -1
  12. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  13. package/.next/server/app/_global-error.html +1 -1
  14. package/.next/server/app/_global-error.rsc +1 -1
  15. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  16. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  17. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  18. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  19. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  20. package/.next/server/app/_not-found/page/build-manifest.json +4 -5
  21. package/.next/server/app/_not-found/page.js +5 -4
  22. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  23. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  24. package/.next/server/app/admin/page/build-manifest.json +4 -5
  25. package/.next/server/app/admin/page.js +7 -5
  26. package/.next/server/app/admin/page.js.nft.json +1 -1
  27. package/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  28. package/.next/server/app/api/codex-accounts/route.js +1 -1
  29. package/.next/server/app/api/codex-accounts/route.js.nft.json +1 -1
  30. package/.next/server/app/api/float/route/app-paths-manifest.json +3 -0
  31. package/.next/server/app/api/float/route/build-manifest.json +9 -0
  32. package/.next/server/app/api/float/route/server-reference-manifest.json +4 -0
  33. package/.next/server/app/api/float/route.js +8 -0
  34. package/.next/server/app/api/float/route.js.map +5 -0
  35. package/.next/server/app/api/float/route.js.nft.json +1 -0
  36. package/.next/server/app/api/float/route_client-reference-manifest.js +3 -0
  37. package/.next/server/app/api/import-sessions/route.js.nft.json +1 -1
  38. package/.next/server/app/api/sessions/[id]/tags/route.js +1 -1
  39. package/.next/server/app/api/sessions/[id]/tags/route.js.nft.json +1 -1
  40. package/.next/server/app/api/sessions/route.js +1 -1
  41. package/.next/server/app/api/sessions/route.js.nft.json +1 -1
  42. package/.next/server/app/api/settings/alerts/route/app-paths-manifest.json +3 -0
  43. package/.next/server/app/api/settings/alerts/route/build-manifest.json +9 -0
  44. package/.next/server/app/api/settings/alerts/route/server-reference-manifest.json +4 -0
  45. package/.next/server/app/api/settings/alerts/route.js +9 -0
  46. package/.next/server/app/api/settings/alerts/route.js.map +5 -0
  47. package/.next/server/app/api/settings/alerts/route.js.nft.json +1 -0
  48. package/.next/server/app/api/settings/alerts/route_client-reference-manifest.js +3 -0
  49. package/.next/server/app/api/settings/notify/route/app-paths-manifest.json +3 -0
  50. package/.next/server/app/api/settings/notify/route/build-manifest.json +9 -0
  51. package/.next/server/app/api/settings/notify/route/server-reference-manifest.json +4 -0
  52. package/.next/server/app/api/settings/notify/route.js +7 -0
  53. package/.next/server/app/api/settings/notify/route.js.map +5 -0
  54. package/.next/server/app/api/settings/notify/route.js.nft.json +1 -0
  55. package/.next/server/app/api/settings/notify/route_client-reference-manifest.js +3 -0
  56. package/.next/server/app/api/usage/route.js +1 -1
  57. package/.next/server/app/api/usage/route.js.nft.json +1 -1
  58. package/.next/server/app/float/page/app-paths-manifest.json +3 -0
  59. package/.next/server/app/float/page/build-manifest.json +16 -0
  60. package/.next/server/app/float/page/next-font-manifest.json +11 -0
  61. package/.next/server/app/float/page/react-loadable-manifest.json +1 -0
  62. package/.next/server/app/float/page/server-reference-manifest.json +4 -0
  63. package/.next/server/app/float/page.js +15 -0
  64. package/.next/server/app/float/page.js.map +5 -0
  65. package/.next/server/app/float/page.js.nft.json +1 -0
  66. package/.next/server/app/float/page_client-reference-manifest.js +3 -0
  67. package/.next/server/app/install.sh/route/app-paths-manifest.json +3 -0
  68. package/.next/server/app/install.sh/route/build-manifest.json +9 -0
  69. package/.next/server/app/install.sh/route/server-reference-manifest.json +4 -0
  70. package/.next/server/app/install.sh/route.js +6 -0
  71. package/.next/server/app/install.sh/route.js.map +5 -0
  72. package/.next/server/app/install.sh/route.js.nft.json +1 -0
  73. package/.next/server/app/install.sh/route_client-reference-manifest.js +3 -0
  74. package/.next/server/app/install.sh.body +108 -0
  75. package/.next/server/app/install.sh.meta +1 -0
  76. package/.next/server/app/page/build-manifest.json +4 -5
  77. package/.next/server/app/page.js +8 -5
  78. package/.next/server/app/page.js.nft.json +1 -1
  79. package/.next/server/app/page_client-reference-manifest.js +1 -1
  80. package/.next/server/app/settings/page/app-paths-manifest.json +3 -0
  81. package/.next/server/app/settings/page/build-manifest.json +16 -0
  82. package/.next/server/app/settings/page/next-font-manifest.json +11 -0
  83. package/.next/server/app/settings/page/react-loadable-manifest.json +1 -0
  84. package/.next/server/app/settings/page/server-reference-manifest.json +4 -0
  85. package/.next/server/app/settings/page.js +17 -0
  86. package/.next/server/app/settings/page.js.map +5 -0
  87. package/.next/server/app/settings/page.js.nft.json +1 -0
  88. package/.next/server/app/settings/page_client-reference-manifest.js +3 -0
  89. package/.next/server/app-paths-manifest.json +7 -1
  90. package/.next/server/chunks/[externals]__0_i~3ox._.js +3 -0
  91. package/.next/server/chunks/[externals]__0_i~3ox._.js.map +1 -0
  92. package/.next/server/chunks/[externals]__13p_1zh._.js +3 -0
  93. package/.next/server/chunks/[externals]__13p_1zh._.js.map +1 -0
  94. package/.next/server/chunks/[root-of-the-server]__01t2c3w._.js +38 -0
  95. package/.next/server/chunks/[root-of-the-server]__01t2c3w._.js.map +1 -0
  96. package/.next/server/chunks/{[root-of-the-server]__0g0u0lm._.js → [root-of-the-server]__024yzee._.js} +2 -2
  97. package/.next/server/chunks/{[root-of-the-server]__00q0o~z._.js → [root-of-the-server]__082iwfa._.js} +2 -2
  98. package/.next/server/chunks/[root-of-the-server]__0chedn~._.js +1 -1
  99. package/.next/server/chunks/[root-of-the-server]__0mwf0bn._.js +38 -0
  100. package/.next/server/chunks/[root-of-the-server]__0mwf0bn._.js.map +1 -0
  101. package/.next/server/chunks/{[root-of-the-server]__0-74syk._.js → [root-of-the-server]__0ru3_it._.js} +2 -2
  102. package/.next/server/chunks/[root-of-the-server]__0u6y_k1._.js +111 -0
  103. package/.next/server/chunks/[root-of-the-server]__0u6y_k1._.js.map +1 -0
  104. package/.next/server/chunks/{[root-of-the-server]__0866q87._.js → [root-of-the-server]__0xa4dzi._.js} +2 -2
  105. package/.next/server/chunks/[root-of-the-server]__13415c6._.js +96 -0
  106. package/.next/server/chunks/[root-of-the-server]__13415c6._.js.map +1 -0
  107. package/.next/server/chunks/[root-of-the-server]__13j_28o._.js +96 -0
  108. package/.next/server/chunks/[root-of-the-server]__13j_28o._.js.map +1 -0
  109. package/.next/server/chunks/_next-internal_server_app_api_float_route_actions_012j~jr.js +3 -0
  110. package/.next/server/chunks/_next-internal_server_app_api_float_route_actions_012j~jr.js.map +1 -0
  111. package/.next/server/chunks/_next-internal_server_app_api_settings_alerts_route_actions_0ydcyko.js +3 -0
  112. package/.next/server/chunks/_next-internal_server_app_api_settings_alerts_route_actions_0ydcyko.js.map +1 -0
  113. package/.next/server/chunks/_next-internal_server_app_api_settings_notify_route_actions_0-j35mb.js +3 -0
  114. package/.next/server/chunks/_next-internal_server_app_api_settings_notify_route_actions_0-j35mb.js.map +1 -0
  115. package/.next/server/chunks/_next-internal_server_app_install_sh_route_actions_0cj-6me.js +3 -0
  116. package/.next/server/chunks/_next-internal_server_app_install_sh_route_actions_0cj-6me.js.map +1 -0
  117. package/.next/server/chunks/node_modules_next_06f88ko._.js +19 -0
  118. package/.next/server/chunks/node_modules_next_06f88ko._.js.map +1 -0
  119. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_03jj5jj.js +18 -0
  120. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_03jj5jj.js.map +1 -0
  121. package/.next/server/chunks/src_12i1qk5._.js +3 -0
  122. package/.next/server/chunks/src_12i1qk5._.js.map +1 -0
  123. package/.next/server/chunks/src_lib_alerts_ticker_ts_0n6oy1d._.js +169 -0
  124. package/.next/server/chunks/src_lib_alerts_ticker_ts_0n6oy1d._.js.map +1 -0
  125. package/.next/server/chunks/ssr/[root-of-the-server]__03mt8o0._.js +3 -0
  126. package/.next/server/chunks/ssr/[root-of-the-server]__03mt8o0._.js.map +1 -0
  127. package/.next/server/chunks/ssr/{[root-of-the-server]__098zro9._.js → [root-of-the-server]__090jxzh._.js} +2 -2
  128. package/.next/server/chunks/ssr/[root-of-the-server]__090jxzh._.js.map +1 -0
  129. package/.next/server/chunks/ssr/{[root-of-the-server]__09hgk-7._.js → [root-of-the-server]__0c3j40u._.js} +2 -2
  130. package/.next/server/chunks/ssr/[root-of-the-server]__0c3j40u._.js.map +1 -0
  131. package/.next/server/chunks/ssr/[root-of-the-server]__0ot4nev._.js +3 -0
  132. package/.next/server/chunks/ssr/[root-of-the-server]__0ot4nev._.js.map +1 -0
  133. package/.next/server/chunks/ssr/[root-of-the-server]__0q_~l2m._.js +90 -0
  134. package/.next/server/chunks/ssr/[root-of-the-server]__0q_~l2m._.js.map +1 -0
  135. package/.next/server/chunks/ssr/{[root-of-the-server]__0cqes87._.js → [root-of-the-server]__0qt26ty._.js} +2 -2
  136. package/.next/server/chunks/ssr/[root-of-the-server]__0qt26ty._.js.map +1 -0
  137. package/.next/server/chunks/ssr/[root-of-the-server]__0s5.uhg._.js +55 -0
  138. package/.next/server/chunks/ssr/[root-of-the-server]__0s5.uhg._.js.map +1 -0
  139. package/.next/server/chunks/ssr/[root-of-the-server]__0x~-phx._.js +3 -0
  140. package/.next/server/chunks/ssr/[root-of-the-server]__0x~-phx._.js.map +1 -0
  141. package/.next/server/chunks/ssr/[root-of-the-server]__0y_zq8k._.js +3 -0
  142. package/.next/server/chunks/ssr/[root-of-the-server]__0y_zq8k._.js.map +1 -0
  143. package/.next/server/chunks/ssr/{[root-of-the-server]__08qr2ji._.js → [root-of-the-server]__0~953ob._.js} +2 -2
  144. package/.next/server/chunks/ssr/[root-of-the-server]__0~953ob._.js.map +1 -0
  145. package/.next/server/chunks/ssr/_0-9j34y._.js +70 -0
  146. package/.next/server/chunks/ssr/_0-9j34y._.js.map +1 -0
  147. package/.next/server/chunks/ssr/_0jxmm9h._.js +6 -0
  148. package/.next/server/chunks/ssr/_0jxmm9h._.js.map +1 -0
  149. package/.next/server/chunks/ssr/_0lfe3wr._.js +3 -0
  150. package/.next/server/chunks/ssr/_0lfe3wr._.js.map +1 -0
  151. package/.next/server/chunks/ssr/{node_modules_0i2xw~e._.js → _0nvprxh._.js} +5 -2
  152. package/.next/server/chunks/ssr/_0nvprxh._.js.map +1 -0
  153. package/.next/server/chunks/ssr/_0pugb10._.js +6 -0
  154. package/.next/server/chunks/ssr/_0pugb10._.js.map +1 -0
  155. package/.next/server/chunks/ssr/_next-internal_server_app_float_page_actions_0x6hm4p.js +3 -0
  156. package/.next/server/chunks/ssr/_next-internal_server_app_float_page_actions_0x6hm4p.js.map +1 -0
  157. package/.next/server/chunks/ssr/_next-internal_server_app_settings_page_actions_0mr68ai.js +3 -0
  158. package/.next/server/chunks/ssr/_next-internal_server_app_settings_page_actions_0mr68ai.js.map +1 -0
  159. package/.next/server/chunks/ssr/node_modules_@swc_helpers_cjs__interop_require_default_cjs_11~q6fv._.js +3 -0
  160. package/.next/server/chunks/ssr/node_modules_@swc_helpers_cjs__interop_require_default_cjs_11~q6fv._.js.map +1 -0
  161. package/.next/server/chunks/ssr/node_modules_next_dist_09jzzl8._.js +3 -0
  162. package/.next/server/chunks/ssr/node_modules_next_dist_09jzzl8._.js.map +1 -0
  163. package/.next/server/chunks/ssr/{node_modules_next_dist_0e1izl_._.js → node_modules_next_dist_0h9llsw._.js} +2 -2
  164. package/.next/server/chunks/ssr/node_modules_next_dist_0h9llsw._.js.map +1 -0
  165. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_06b_a87.js +4 -0
  166. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_06b_a87.js.map +1 -0
  167. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0p_u4px.js +4 -0
  168. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0p_u4px.js.map +1 -0
  169. package/.next/server/chunks/ssr/src_0urkups._.js +3 -0
  170. package/.next/server/chunks/ssr/src_0urkups._.js.map +1 -0
  171. package/.next/server/chunks/ssr/src_components_0ox9d~w._.js +3 -0
  172. package/.next/server/chunks/ssr/src_components_0ox9d~w._.js.map +1 -0
  173. package/.next/server/chunks/ssr/src_components_CodexAccountsPanel_tsx_0n9xjzi._.js +1 -1
  174. package/.next/server/chunks/ssr/src_components_CodexAccountsPanel_tsx_0n9xjzi._.js.map +1 -1
  175. package/.next/server/chunks/ssr/src_components_FloatingWidget_tsx_089.6oo._.js +3 -0
  176. package/.next/server/chunks/ssr/src_components_FloatingWidget_tsx_089.6oo._.js.map +1 -0
  177. package/.next/server/chunks/ssr/src_lib_i18n_client_tsx_07pysgz._.js +3 -0
  178. package/.next/server/chunks/ssr/src_lib_i18n_client_tsx_07pysgz._.js.map +1 -0
  179. package/.next/server/edge/chunks/_0-m5tdn._.js +3 -0
  180. package/.next/server/edge/chunks/_0-m5tdn._.js.map +1 -0
  181. package/.next/server/edge/chunks/node_modules_next_dist_esm_build_templates_edge-wrapper_0mz-5sp.js.map +1 -0
  182. package/.next/server/edge/chunks/turbopack-node_modules_next_dist_esm_build_templates_edge-wrapper_0mz-5sp.js +3 -0
  183. package/.next/server/functions-config-manifest.json +4 -1
  184. package/.next/server/instrumentation/middleware-manifest.json +12 -0
  185. package/.next/server/instrumentation.js +4 -0
  186. package/.next/server/instrumentation.js.map +5 -0
  187. package/.next/server/instrumentation.js.nft.json +1 -0
  188. package/.next/server/middleware-build-manifest.js +7 -8
  189. package/.next/server/next-font-manifest.js +1 -1
  190. package/.next/server/next-font-manifest.json +8 -0
  191. package/.next/server/pages/500.html +1 -1
  192. package/.next/server/pages-manifest.json +0 -1
  193. package/.next/server/server-reference-manifest.js +1 -1
  194. package/.next/server/server-reference-manifest.json +1 -1
  195. package/.next/static/chunks/0bymg5d-lqs0o.js +5 -0
  196. package/.next/static/chunks/0ebdqsutnp8y4.js +1 -0
  197. package/.next/static/chunks/0i3~mnai-l497.js +1 -0
  198. package/.next/static/chunks/0idj4tdmyr934.js +1 -0
  199. package/.next/static/chunks/10eoi4q2wk80z.js +1 -0
  200. package/.next/static/chunks/10refkmyp9rbl.css +3 -0
  201. package/.next/static/chunks/{07lhk_q6pmm3r.js → 10u3y4bw1ayzs.js} +1 -1
  202. package/.next/static/chunks/{00gq-v0e07i1q.js → 115dplafwys-z.js} +1 -1
  203. package/.next/static/chunks/12-9memveha-v.js +1 -0
  204. package/.next/static/chunks/163s8y.j70104.js +4 -0
  205. package/.next/static/chunks/turbopack-0k9twle9a8sh6.js +1 -0
  206. package/.next/types/routes.d.ts +8 -2
  207. package/.next/types/validator.ts +54 -0
  208. package/README.md +57 -17
  209. package/bin/vibemeter-float.swift +970 -0
  210. package/bin/vibemeter-notify.sh +172 -0
  211. package/bin/vibemeter.mjs +385 -7
  212. package/package.json +2 -1
  213. package/public/demo1.png +0 -0
  214. package/public/float-ball.png +0 -0
  215. package/public/float-collapsed.png +0 -0
  216. package/public/float-expanded.png +0 -0
  217. package/public/pay-alipay.jpg +0 -0
  218. package/.next/server/app/_not-found.html +0 -1
  219. package/.next/server/app/_not-found.meta +0 -16
  220. package/.next/server/app/_not-found.rsc +0 -16
  221. package/.next/server/app/_not-found.segments/_full.segment.rsc +0 -16
  222. package/.next/server/app/_not-found.segments/_head.segment.rsc +0 -6
  223. package/.next/server/app/_not-found.segments/_index.segment.rsc +0 -5
  224. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +0 -5
  225. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +0 -5
  226. package/.next/server/app/_not-found.segments/_tree.segment.rsc +0 -2
  227. package/.next/server/chunks/[root-of-the-server]__0y68a5d._.js +0 -96
  228. package/.next/server/chunks/[root-of-the-server]__0y68a5d._.js.map +0 -1
  229. package/.next/server/chunks/ssr/[root-of-the-server]__054lv8d._.js +0 -3
  230. package/.next/server/chunks/ssr/[root-of-the-server]__054lv8d._.js.map +0 -1
  231. package/.next/server/chunks/ssr/[root-of-the-server]__08qr2ji._.js.map +0 -1
  232. package/.next/server/chunks/ssr/[root-of-the-server]__098zro9._.js.map +0 -1
  233. package/.next/server/chunks/ssr/[root-of-the-server]__09hgk-7._.js.map +0 -1
  234. package/.next/server/chunks/ssr/[root-of-the-server]__0cqes87._.js.map +0 -1
  235. package/.next/server/chunks/ssr/[root-of-the-server]__0l.drdn._.js +0 -3
  236. package/.next/server/chunks/ssr/[root-of-the-server]__0l.drdn._.js.map +0 -1
  237. package/.next/server/chunks/ssr/[root-of-the-server]__0v1zqf~._.js +0 -120
  238. package/.next/server/chunks/ssr/[root-of-the-server]__0v1zqf~._.js.map +0 -1
  239. package/.next/server/chunks/ssr/[root-of-the-server]__0v73tbn._.js +0 -3
  240. package/.next/server/chunks/ssr/[root-of-the-server]__0v73tbn._.js.map +0 -1
  241. package/.next/server/chunks/ssr/_0ye~8el._.js +0 -7
  242. package/.next/server/chunks/ssr/_0ye~8el._.js.map +0 -1
  243. package/.next/server/chunks/ssr/node_modules_0ck2~9g._.js +0 -3
  244. package/.next/server/chunks/ssr/node_modules_0ck2~9g._.js.map +0 -1
  245. package/.next/server/chunks/ssr/node_modules_0i2xw~e._.js.map +0 -1
  246. package/.next/server/chunks/ssr/node_modules_next_dist_0e1izl_._.js.map +0 -1
  247. package/.next/server/chunks/ssr/node_modules_next_dist_0gsjr7_._.js +0 -3
  248. package/.next/server/chunks/ssr/node_modules_next_dist_0gsjr7_._.js.map +0 -1
  249. package/.next/server/pages/404.html +0 -1
  250. package/.next/static/chunks/002~6040mndie.css +0 -3
  251. package/.next/static/chunks/02g3221oh~3le.js +0 -2
  252. package/.next/static/chunks/0erq0bmub6w_z.js +0 -2
  253. package/.next/static/chunks/0ljfidstam_7k.js +0 -1
  254. package/.next/static/chunks/0pqt~8bl3ukh4.js +0 -4
  255. package/.next/static/chunks/turbopack-14vio.b1b9i4l.js +0 -1
  256. /package/.next/server/chunks/{[root-of-the-server]__0g0u0lm._.js.map → [root-of-the-server]__024yzee._.js.map} +0 -0
  257. /package/.next/server/chunks/{[root-of-the-server]__00q0o~z._.js.map → [root-of-the-server]__082iwfa._.js.map} +0 -0
  258. /package/.next/server/chunks/{[root-of-the-server]__0-74syk._.js.map → [root-of-the-server]__0ru3_it._.js.map} +0 -0
  259. /package/.next/server/chunks/{[root-of-the-server]__0866q87._.js.map → [root-of-the-server]__0xa4dzi._.js.map} +0 -0
  260. /package/.next/static/{Ong62ufsHaRU36s0QK5ZZ → _Y03MiN6NI16Ms86q6vCJ}/_buildManifest.js +0 -0
  261. /package/.next/static/{Ong62ufsHaRU36s0QK5ZZ → _Y03MiN6NI16Ms86q6vCJ}/_clientMiddlewareManifest.js +0 -0
  262. /package/.next/static/{Ong62ufsHaRU36s0QK5ZZ → _Y03MiN6NI16Ms86q6vCJ}/_ssgManifest.js +0 -0
@@ -1,16 +0,0 @@
1
- {
2
- "status": 404,
3
- "headers": {
4
- "x-nextjs-stale-time": "300",
5
- "x-nextjs-prerender": "1",
6
- "x-next-cache-tags": "_N_T_/layout,_N_T_/_not-found/layout,_N_T_/_not-found/page,_N_T_/_not-found"
7
- },
8
- "segmentPaths": [
9
- "/_tree",
10
- "/_full",
11
- "/_not-found/__PAGE__",
12
- "/_not-found",
13
- "/_index",
14
- "/_head"
15
- ]
16
- }
@@ -1,16 +0,0 @@
1
- 1:"$Sreact.fragment"
2
- 2:I[39756,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"]
3
- 3:I[37457,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"]
4
- 4:I[97367,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"OutletBoundary"]
5
- 5:"$Sreact.suspense"
6
- 8:I[97367,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"ViewportBoundary"]
7
- a:I[97367,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"MetadataBoundary"]
8
- c:I[68027,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default",1]
9
- :HL["/_next/static/chunks/002~6040mndie.css","style"]
10
- 0:{"P":null,"c":["","_not-found"],"q":"","i":false,"f":[[["",{"children":["/_not-found",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/002~6040mndie.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/01xlw8hd842-c.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col","children":["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:notFound:0:1:props:style","children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]]}]}]],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,null]},null,false,"$@7"]},null,false,null],["$","$1","h",{"children":[["$","meta",null,{"name":"robots","content":"noindex"}],["$","$L8",null,{"children":"$L9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$Lb"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$c",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/002~6040mndie.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"Ong62ufsHaRU36s0QK5ZZ"}
11
- d:[]
12
- 7:"$Wd"
13
- 9:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
14
- e:I[27201,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"IconMark"]
15
- 6:null
16
- b:[["$","title","0",{"children":"Vibemeter"}],["$","meta","1",{"name":"description","content":"Measure your AI coding vibe — local-first dashboard for Claude Code, Codex, and Cursor"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?favicon.0x3dzn~oxb6tn.ico","sizes":"256x256","type":"image/x-icon"}],["$","$Le","3",{}]]
@@ -1,16 +0,0 @@
1
- 1:"$Sreact.fragment"
2
- 2:I[39756,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"]
3
- 3:I[37457,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"]
4
- 4:I[97367,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"OutletBoundary"]
5
- 5:"$Sreact.suspense"
6
- 8:I[97367,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"ViewportBoundary"]
7
- a:I[97367,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"MetadataBoundary"]
8
- c:I[68027,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default",1]
9
- :HL["/_next/static/chunks/002~6040mndie.css","style"]
10
- 0:{"P":null,"c":["","_not-found"],"q":"","i":false,"f":[[["",{"children":["/_not-found",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/002~6040mndie.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/01xlw8hd842-c.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col","children":["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:notFound:0:1:props:style","children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]]}]}]],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,null]},null,false,"$@7"]},null,false,null],["$","$1","h",{"children":[["$","meta",null,{"name":"robots","content":"noindex"}],["$","$L8",null,{"children":"$L9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$Lb"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$c",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/002~6040mndie.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"Ong62ufsHaRU36s0QK5ZZ"}
11
- d:[]
12
- 7:"$Wd"
13
- 9:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
14
- e:I[27201,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"IconMark"]
15
- 6:null
16
- b:[["$","title","0",{"children":"Vibemeter"}],["$","meta","1",{"name":"description","content":"Measure your AI coding vibe — local-first dashboard for Claude Code, Codex, and Cursor"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?favicon.0x3dzn~oxb6tn.ico","sizes":"256x256","type":"image/x-icon"}],["$","$Le","3",{}]]
@@ -1,6 +0,0 @@
1
- 1:"$Sreact.fragment"
2
- 2:I[97367,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"ViewportBoundary"]
3
- 3:I[97367,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"MetadataBoundary"]
4
- 4:"$Sreact.suspense"
5
- 5:I[27201,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"IconMark"]
6
- 0:{"rsc":["$","$1","h",{"children":[["$","meta",null,{"name":"robots","content":"noindex"}],["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"Vibemeter"}],["$","meta","1",{"name":"description","content":"Measure your AI coding vibe — local-first dashboard for Claude Code, Codex, and Cursor"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?favicon.0x3dzn~oxb6tn.ico","sizes":"256x256","type":"image/x-icon"}],["$","$L5","3",{}]]}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"Ong62ufsHaRU36s0QK5ZZ"}
@@ -1,5 +0,0 @@
1
- 1:"$Sreact.fragment"
2
- 2:I[39756,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"]
3
- 3:I[37457,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"]
4
- :HL["/_next/static/chunks/002~6040mndie.css","style"]
5
- 0:{"rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/002~6040mndie.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/01xlw8hd842-c.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true}]],["$","html",null,{"lang":"en","className":"geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col","children":["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"Ong62ufsHaRU36s0QK5ZZ"}
@@ -1,5 +0,0 @@
1
- 1:"$Sreact.fragment"
2
- 2:I[97367,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"OutletBoundary"]
3
- 3:"$Sreact.suspense"
4
- 0:{"rsc":["$","$1","c",{"children":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],null,["$","$L2",null,{"children":["$","$3",null,{"name":"Next.MetadataOutlet","children":"$@4"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"Ong62ufsHaRU36s0QK5ZZ"}
5
- 4:null
@@ -1,5 +0,0 @@
1
- 1:"$Sreact.fragment"
2
- 2:I[39756,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"]
3
- 3:I[37457,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"]
4
- 4:[]
5
- 0:{"rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"isPartial":false,"staleTime":300,"varyParams":"$W4","buildId":"Ong62ufsHaRU36s0QK5ZZ"}
@@ -1,2 +0,0 @@
1
- :HL["/_next/static/chunks/002~6040mndie.css","style"]
2
- 0:{"tree":{"name":"","param":null,"prefetchHints":16,"slots":{"children":{"name":"/_not-found","param":null,"prefetchHints":0,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":0,"slots":null}}}}},"staleTime":300,"buildId":"Ong62ufsHaRU36s0QK5ZZ"}
@@ -1,96 +0,0 @@
1
- module.exports=[14747,(e,t,n)=>{t.exports=e.x("path",()=>require("path"))},12714,(e,t,n)=>{t.exports=e.x("node:fs/promises",()=>require("node:fs/promises"))},2157,(e,t,n)=>{t.exports=e.x("node:fs",()=>require("node:fs"))},60526,(e,t,n)=>{t.exports=e.x("node:os",()=>require("node:os"))},50227,(e,t,n)=>{t.exports=e.x("node:path",()=>require("node:path"))},22734,(e,t,n)=>{t.exports=e.x("fs",()=>require("fs"))},85148,(e,t,n)=>{t.exports=e.x("better-sqlite3-90e2652d1716b047",()=>require("better-sqlite3-90e2652d1716b047"))},43793,77930,e=>{"use strict";var t=e.i(85148),n=e.i(14747),s=e.i(22734);function a(){return process.env.VIBEMETER_DATA_DIR??n.default.join(process.cwd(),".data")}e.s(["dataDir",0,a],77930);let i=null;e.s(["getDb",0,function(){var e;let r;if(i)return i;let o=a();return s.default.mkdirSync(o,{recursive:!0}),(i=new t.default(n.default.join(o,"continuity.sqlite"))).pragma("journal_mode = WAL"),(e=i).exec(`
2
- CREATE TABLE IF NOT EXISTS sessions (
3
- id TEXT PRIMARY KEY,
4
- tool TEXT NOT NULL,
5
- started_at INTEGER NOT NULL,
6
- ended_at INTEGER,
7
- exit_code INTEGER,
8
- cwd TEXT,
9
- cli_args TEXT,
10
- summary TEXT,
11
- confidence TEXT NOT NULL DEFAULT 'medium'
12
- );
13
-
14
- CREATE TABLE IF NOT EXISTS usage_snapshots (
15
- id INTEGER PRIMARY KEY AUTOINCREMENT,
16
- captured_at INTEGER NOT NULL,
17
- source TEXT NOT NULL,
18
- account_id TEXT,
19
- window_5h_used_pct REAL,
20
- window_weekly_used_pct REAL,
21
- reset_at_5h INTEGER,
22
- reset_at_weekly INTEGER,
23
- raw_output TEXT,
24
- confidence TEXT NOT NULL
25
- );
26
-
27
- CREATE TABLE IF NOT EXISTS file_changes (
28
- id INTEGER PRIMARY KEY AUTOINCREMENT,
29
- session_id TEXT NOT NULL,
30
- path TEXT NOT NULL,
31
- change_type TEXT NOT NULL,
32
- detected_at INTEGER NOT NULL,
33
- FOREIGN KEY (session_id) REFERENCES sessions(id)
34
- );
35
- `),(r=(t,n,s)=>{try{e.exec(`ALTER TABLE ${t} ADD COLUMN ${n} ${s}`)}catch{}})("sessions","ai_title","TEXT"),r("sessions","tags",'TEXT DEFAULT "[]"'),r("sessions","codex_category","TEXT"),r("sessions","tokens_used","INTEGER"),r("usage_snapshots","account_id","TEXT"),e.exec(`
36
- CREATE INDEX IF NOT EXISTS idx_sessions_started ON sessions(started_at DESC);
37
- CREATE INDEX IF NOT EXISTS idx_usage_captured ON usage_snapshots(captured_at DESC);
38
- CREATE INDEX IF NOT EXISTS idx_usage_source_account_captured ON usage_snapshots(source, account_id, captured_at DESC);
39
- `),i}],43793)},81149,e=>{"use strict";e.s(["getLatestUsageSnapshot",0,function(e,t,n){return(null!=n?e.prepare(`
40
- SELECT id, captured_at, source, account_id, window_5h_used_pct, window_weekly_used_pct,
41
- reset_at_5h, reset_at_weekly, raw_output, confidence
42
- FROM usage_snapshots
43
- WHERE source = ? AND account_id = ?
44
- ORDER BY captured_at DESC
45
- LIMIT 1
46
- `).get(t,n):e.prepare(`
47
- SELECT id, captured_at, source, account_id, window_5h_used_pct, window_weekly_used_pct,
48
- reset_at_5h, reset_at_weekly, raw_output, confidence
49
- FROM usage_snapshots
50
- WHERE source = ?
51
- ORDER BY captured_at DESC
52
- LIMIT 1
53
- `).get(t))??null},"insertUsageSnapshot",0,function(e,t){e.prepare(`
54
- INSERT INTO usage_snapshots
55
- (captured_at, source, account_id, window_5h_used_pct, window_weekly_used_pct,
56
- reset_at_5h, reset_at_weekly, raw_output, confidence)
57
- VALUES
58
- (@captured_at, @source, @account_id, @window_5h_used_pct, @window_weekly_used_pct,
59
- @reset_at_5h, @reset_at_weekly, @raw_output, @confidence)
60
- `).run({captured_at:t.capturedAt,source:t.source,account_id:t.accountId,window_5h_used_pct:t.window5hUsedPct,window_weekly_used_pct:t.windowWeeklyUsedPct,reset_at_5h:t.resetAt5h,reset_at_weekly:t.resetAtWeekly,raw_output:t.rawOutput,confidence:t.confidence})}])},46023,e=>{"use strict";var t=e.i(12714),n=e.i(2157),s=e.i(60526),a=e.i(50227);let i="https://api.openai.com/auth";function r(e={}){return{authPath:e.authPath??a.default.join((0,s.homedir)(),".codex","auth.json"),storeDir:e.storeDir??a.default.join((0,s.homedir)(),".codex","auth-accounts")}}function o(e,t){return a.default.join(t,`${e.replace(/[^a-zA-Z0-9_-]/g,"_")}.json`)}async function d(e){let n=JSON.parse(await (0,t.readFile)(e,"utf8"));if(!n.tokens||"string"!=typeof n.tokens.account_id)throw Error("Codex auth file is missing tokens.account_id");return n}async function l(e,n){await (0,t.mkdir)(a.default.dirname(e),{recursive:!0});let s=`${e}.${process.pid}.${Date.now()}.tmp`;await (0,t.writeFile)(s,`${JSON.stringify(n,null,2)}
61
- `,{encoding:"utf8",mode:384}),await (0,t.rename)(s,e)}function c(e){if("string"!=typeof e)return null;let[,t]=e.split(".");if(!t)return null;try{return JSON.parse(Buffer.from(t,"base64url").toString("utf8"))}catch{return null}}function u(e){return"string"==typeof e&&e.length>0?e:null}function _(e){return"number"==typeof e?new Date(1e3*e).toISOString():null}function p(e,t,n){let s=u(e.tokens?.account_id);if(!s)throw Error("Codex auth file is missing tokens.account_id");let a=c(e.tokens?.id_token),r=c(e.tokens?.access_token),o=a?.[i],d=r?.[i],l=u(a?.email),p=u(a?.name),f=u(o?.chatgpt_plan_type)??u(d?.chatgpt_plan_type),w=u(o?.user_id)??u(d?.user_id),E=l??p??`${s.slice(0,8)}...${s.slice(-4)}`;return{accountId:s,label:E,email:l,name:p,planType:f,userId:w,lastRefresh:u(e.last_refresh),idTokenExpiresAt:_(a?.exp),accessTokenExpiresAt:_(r?.exp),storedAt:t,isCurrent:s===n}}async function f(e={}){let{authPath:n,storeDir:s}=r(e),i=null,o=null;try{o=await d(n),i=u(o.tokens?.account_id)}catch{o=null}let l=new Map;try{for(let e of(await (0,t.readdir)(s))){if(!e.endsWith(".json"))continue;let n=a.default.join(s,e);try{let e=await d(n),s=await (0,t.stat)(n),a=p(e,s.mtime.toISOString(),i);l.set(a.accountId,a)}catch{}}}catch{}return o&&i&&!l.has(i)&&l.set(i,p(o,null,i)),[...l.values()].sort((e,t)=>e.isCurrent!==t.isCurrent?e.isCurrent?-1:1:e.label.localeCompare(t.label))}async function w(e={}){let{authPath:n,storeDir:s}=r(e),a=await d(n),i=a.tokens?.account_id,c=o(i,s);return await l(c,a),p(a,(await (0,t.stat)(c)).mtime.toISOString(),i)}async function E(e,n={}){let{authPath:s,storeDir:a}=r(n),i=o(e,a),c=await d(i);if(c.tokens?.account_id!==e)throw Error("Stored account id does not match requested account");let u=null;try{let e=await (0,t.readFile)(s,"utf8");u=`${s}.${new Date().toISOString().replace(/[:.]/g,"-")}.bak`,await (0,t.writeFile)(u,e,{encoding:"utf8",mode:384})}catch{u=null}return await l(s,c),{...p(c,null,e),backupPath:u}}async function h(e,n={}){let{authPath:s,storeDir:a}=r(n),i=await d(s).catch(()=>null);if(i?.tokens?.account_id===e)throw Error("Cannot delete the currently active Codex account");await (0,t.unlink)(o(e,a))}e.s(["deleteCodexAccount",0,h,"getCodexAccounts",0,f,"getCurrentCodexAccount",0,function(e={}){let{authPath:t}=r(e);try{let e=JSON.parse((0,n.readFileSync)(t,"utf8")),s=u(e.tokens?.account_id);if(!s)return null;return{accountId:s,authMtimeMs:(0,n.statSync)(t).mtimeMs}}catch{return null}},"importCurrentCodexAuth",0,w,"switchCodexAccount",0,E])},46786,(e,t,n)=>{t.exports=e.x("os",()=>require("os"))},80909,e=>{"use strict";var t=e.i(22734),n=e.i(14747),s=e.i(46786),a=e.i(43793),i=e.i(69719);let r=i.z.object({timestamp:i.z.string().optional(),sessionId:i.z.string().optional(),cwd:i.z.string().optional(),gitBranch:i.z.string().optional(),version:i.z.string().optional(),type:i.z.string()}).passthrough(),o=i.z.object({type:i.z.literal("ai-title"),aiTitle:i.z.string(),sessionId:i.z.string()});var d=e.i(77930);let l=n.default.join((0,d.dataDir)(),"statusline-latest.json"),c=i.z.object({session_id:i.z.string().optional(),session_name:i.z.string().optional(),transcript_path:i.z.string().optional(),cwd:i.z.string().optional(),model:i.z.object({id:i.z.string(),display_name:i.z.string()}).optional(),cost:i.z.object({total_cost_usd:i.z.number()}).optional(),context_window:i.z.object({total_input_tokens:i.z.number(),total_output_tokens:i.z.number(),used_percentage:i.z.number()}).optional(),rate_limits:i.z.object({five_hour:i.z.object({used_percentage:i.z.number(),resets_at:i.z.number().optional()}).optional(),seven_day:i.z.object({used_percentage:i.z.number(),resets_at:i.z.number().optional()}).optional()}).optional()}).passthrough(),u=n.default.join(s.default.homedir(),".codex","sessions"),_=n.default.join(s.default.homedir(),".codex"),p=n.default.join(_,"state_5.sqlite"),f=n.default.join(_,"history.jsonl"),w=n.default.join(s.default.homedir(),"Library/Application Support/Cursor/User"),E=n.default.join(w,"workspaceStorage"),h=n.default.join(w,"globalStorage/state.vscdb");var T=e.i(46023),m=e.i(81149);let y=n.default.join(s.default.homedir(),".claude"),S=n.default.join(y,"projects"),g=n.default.join(y,"sessions");e.s(["importSessions",0,function(){let s=(0,a.getDb)(),i=function(){let e=new Set;try{for(let s of t.default.readdirSync(g))if(s.endsWith(".json"))try{let a=t.default.readFileSync(n.default.join(g,s),"utf8"),i=JSON.parse(a);i.sessionId&&e.add(i.sessionId)}catch{}}catch{}return e}(),d=function(){let e=[];try{for(let s of t.default.readdirSync(S)){let a=n.default.join(S,s);try{if(!t.default.statSync(a).isDirectory())continue;for(let s of t.default.readdirSync(a))s.endsWith(".jsonl")&&e.push(n.default.join(a,s))}catch{}}}catch{}return e}(),_=s.prepare(`
62
- INSERT INTO sessions (id, tool, started_at, ended_at, exit_code, cwd, cli_args, summary, ai_title, confidence)
63
- VALUES (@id, @tool, @started_at, @ended_at, @exit_code, @cwd, @cli_args, @summary, @ai_title, @confidence)
64
- ON CONFLICT(id) DO UPDATE SET
65
- ended_at = excluded.ended_at,
66
- exit_code = excluded.exit_code,
67
- ai_title = COALESCE(sessions.ai_title, excluded.ai_title),
68
- confidence = excluded.confidence
69
- `),w=0,y=0;s.transaction(()=>{for(let e of d){let n=function(e){let n;try{n=t.default.readFileSync(e,"utf8")}catch{return null}let s=n.split("\n").filter(Boolean);if(0===s.length)return null;let a=e.split("/").pop()?.replace(".jsonl","")??null;if(!a)return null;let i=null,d=null,l=null,c=null,u=null,_=null;for(let e of s){let t;try{t=JSON.parse(e)}catch{continue}let n=r.safeParse(t);if(!n.success)continue;let s=n.data;if(s.timestamp){let e=new Date(s.timestamp).getTime();!Number.isNaN(e)&&((null===c||e<c)&&(c=e),(null===u||e>u)&&(u=e))}if(!i&&s.cwd&&(i=s.cwd),!d&&s.gitBranch&&(d=s.gitBranch),!l&&s.version&&(l=s.version),"ai-title"===s.type){let e=o.safeParse(t);e.success&&(_=e.data.aiTitle)}}return{sessionId:a,cwd:i,gitBranch:d,version:l,startedAt:c,lastSeenAt:u,aiTitle:_}}(e);if(!n||!n.startedAt){y++;continue}let s=i.has(n.sessionId);_.run({id:n.sessionId,tool:"claude-code",started_at:n.startedAt,ended_at:s?null:n.lastSeenAt,exit_code:null,cwd:n.cwd,cli_args:null,summary:null,ai_title:n.aiTitle,confidence:"high"}),w++}})(),!function(){if(!t.default.existsSync(p))return!1;try{let t=new(e.r(85148))(p,{readonly:!0}),n=t.prepare(`
70
- SELECT id, created_at_ms, updated_at_ms, cwd, title, first_user_message,
71
- tokens_used, git_branch, model, archived
72
- FROM threads
73
- ORDER BY created_at_ms ASC
74
- `).all(),s=(0,a.getDb)(),i=s.prepare(`
75
- INSERT INTO sessions (id, tool, started_at, ended_at, cwd, ai_title, tokens_used, confidence)
76
- VALUES (@id, 'codex', @started_at, @ended_at, @cwd, @ai_title, @tokens_used, 'high')
77
- ON CONFLICT(id) DO UPDATE SET
78
- ended_at = excluded.ended_at,
79
- cwd = COALESCE(sessions.cwd, excluded.cwd),
80
- ai_title = COALESCE(sessions.ai_title, excluded.ai_title),
81
- tokens_used = excluded.tokens_used,
82
- confidence = 'high'
83
- `);return s.transaction(()=>{for(let e of n)i.run({id:e.id,started_at:e.created_at_ms,ended_at:e.updated_at_ms,cwd:e.cwd,ai_title:e.title??e.first_user_message?.slice(0,120)??null,tokens_used:e.tokens_used})})(),t.close(),!0}catch{return!1}}()&&function(){if(!t.default.existsSync(f))return;let e=new Map;try{for(let n of t.default.readFileSync(f,"utf8").split("\n").filter(Boolean))try{let t=JSON.parse(n);if(!t.session_id||!t.ts)continue;let s=e.get(t.session_id);s?(t.ts<s.minTs&&(s.minTs=t.ts),t.ts>s.maxTs&&(s.maxTs=t.ts)):e.set(t.session_id,{minTs:t.ts,maxTs:t.ts})}catch{}}catch{return}let n=(0,a.getDb)(),s=n.prepare(`
84
- INSERT INTO sessions (id, tool, started_at, ended_at, confidence)
85
- VALUES (@id, 'codex', @started_at, @ended_at, 'medium')
86
- ON CONFLICT(id) DO NOTHING
87
- `);n.transaction(()=>{for(let[t,{minTs:n,maxTs:a}]of e)s.run({id:t,started_at:1e3*n,ended_at:1e3*a})})()}(),function(){let s;if(!t.default.existsSync(E))return;let i=e.r(85148),r=(0,a.getDb)(),o=r.prepare(`
88
- INSERT INTO sessions (id, tool, started_at, ended_at, cwd, ai_title, confidence)
89
- VALUES (@id, 'cursor', @started_at, @ended_at, @cwd, @ai_title, 'high')
90
- ON CONFLICT(id) DO UPDATE SET
91
- ended_at = excluded.ended_at,
92
- cwd = COALESCE(sessions.cwd, excluded.cwd),
93
- ai_title = COALESCE(sessions.ai_title, excluded.ai_title)
94
- `);try{s=t.default.readdirSync(E)}catch{return}if(r.transaction(()=>{for(let e of s){let s=n.default.join(E,e,"state.vscdb"),a=n.default.join(E,e,"workspace.json");if(!t.default.existsSync(s))continue;let r=null;try{let e=JSON.parse(t.default.readFileSync(a,"utf8"));r=e.folder?.replace("file://","")??null}catch{}try{let e=new i(s,{readonly:!0}),t=e.prepare("SELECT value FROM ItemTable WHERE key = 'composer.composerData'").get();if(e.close(),!t)continue;for(let e of JSON.parse(t.value).allComposers??[])e.composerId&&e.createdAt&&o.run({id:e.composerId,started_at:e.createdAt,ended_at:e.createdAt,cwd:r,ai_title:e.name??null})}catch{}}})(),t.default.existsSync(h))try{let e=new i(h,{readonly:!0});if(e.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='cursorDiskKV'").get()){let t=e.prepare("SELECT key, value FROM cursorDiskKV WHERE key LIKE 'composerData:%'").all();r.transaction(()=>{for(let e of t){let t,n=e.key.slice(13);try{t=JSON.parse("string"==typeof e.value?e.value:e.value.toString("utf8"))}catch{continue}let s=t.composerId||n,a=t.createdAt;if(!s||!a)continue;let i=t.lastUpdatedAt??a,r=t.name||(t.text?t.text.slice(0,120):null);o.run({id:s,started_at:a,ended_at:i,cwd:null,ai_title:r})}})()}e.close()}catch{}}();let N=function(){let e;try{e=t.default.readFileSync(l,"utf8")}catch{return null}let n=c.safeParse(JSON.parse(e));if(!n.success)return null;let s=n.data,a=s.rate_limits;return{window_5h_used_pct:a?.five_hour?.used_percentage??null,window_weekly_used_pct:a?.seven_day?.used_percentage??null,reset_at_5h:a?.five_hour?.resets_at!=null?1e3*a.five_hour.resets_at:null,reset_at_weekly:a?.seven_day?.resets_at!=null?1e3*a.seven_day.resets_at:null,raw_output:e.slice(0,2e3),confidence:"high",session_id:s.session_id??null,session_name:s.session_name??null,cwd:s.cwd??null}}();N&&(0,m.insertUsageSnapshot)(s,{capturedAt:Date.now(),source:"statusline",accountId:null,window5hUsedPct:N.window_5h_used_pct,windowWeeklyUsedPct:N.window_weekly_used_pct,resetAt5h:N.reset_at_5h,resetAtWeekly:N.reset_at_weekly,rawOutput:N.raw_output,confidence:"high"});let O=(0,T.getCurrentCodexAccount)(),x=function(e={}){let s=e.sessionsDir??u,a=e.minMtimeMs??0;try{let e=null;if(!t.default.existsSync(s)||(!function s(i){for(let r of t.default.readdirSync(i)){let o=n.default.join(i,r);try{let n=t.default.statSync(o);if(n.isDirectory()){s(o);continue}r.endsWith(".jsonl")&&n.mtimeMs>=a&&n.mtimeMs>(e?.mtime??0)&&(e={path:o,mtime:n.mtimeMs})}catch{}}}(s),!e))return null;for(let n of t.default.readFileSync(e.path,"utf8").split("\n").filter(Boolean).reverse())try{let t=JSON.parse(n),s=t?.payload?.rate_limits;if(!s?.primary||!s?.secondary)continue;return{window_5h_used_pct:s.primary.used_percent,window_weekly_used_pct:s.secondary.used_percent,reset_at_5h:1e3*s.primary.resets_at,reset_at_weekly:1e3*s.secondary.resets_at,source_mtime_ms:e.mtime}}catch{}return null}catch{return null}}({minMtimeMs:O?.authMtimeMs});return x&&(0,m.insertUsageSnapshot)(s,{capturedAt:Date.now(),source:"codex",accountId:O?.accountId??null,window5hUsedPct:x.window_5h_used_pct,windowWeeklyUsedPct:x.window_weekly_used_pct,resetAt5h:x.reset_at_5h,resetAtWeekly:x.reset_at_weekly,rawOutput:null,confidence:"high"}),{scanned:d.length,inserted:w,skipped:y}}],80909)}];
95
-
96
- //# sourceMappingURL=%5Broot-of-the-server%5D__0y68a5d._.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/lib/db.ts","../../../src/lib/data-dir.ts","../../../src/lib/db-bootstrap.ts","../../../src/lib/usage-snapshots.ts","../../../src/lib/codex-auth.ts","../../../src/lib/collectors/session-importer.ts","../../../src/lib/parsers/session-log.ts","../../../src/lib/parsers/statusline-json.ts","../../../src/lib/parsers/codex-ratelimit.ts","../../../src/lib/collectors/codex-importer.ts","../../../src/lib/collectors/cursor-importer.ts"],"sourcesContent":["import Database from 'better-sqlite3';\nimport path from 'path';\nimport fs from 'fs';\nimport { dataDir } from './data-dir';\nimport { bootstrap } from './db-bootstrap';\n\nlet _db: Database.Database | null = null;\n\nexport function getDb(): Database.Database {\n if (_db) return _db;\n const dir = dataDir();\n fs.mkdirSync(dir, { recursive: true });\n _db = new Database(path.join(dir, 'continuity.sqlite'));\n _db.pragma('journal_mode = WAL');\n bootstrap(_db);\n return _db;\n}\n","import path from 'path';\n\n/**\n * Where Vibemeter stores its SQLite DB and statusline snapshot.\n *\n * - When installed via `npx @hirra/vibemeter`: the bin script sets\n * VIBEMETER_DATA_DIR to `~/.vibemeter` for a stable user-data location.\n * - In local development from a checkout: defaults to `<cwd>/.data`.\n */\nexport function dataDir(): string {\n return process.env.VIBEMETER_DATA_DIR ?? path.join(process.cwd(), '.data');\n}\n","import type Database from 'better-sqlite3';\n\nexport function bootstrap(db: Database.Database): void {\n db.exec(`\n CREATE TABLE IF NOT EXISTS sessions (\n id TEXT PRIMARY KEY,\n tool TEXT NOT NULL,\n started_at INTEGER NOT NULL,\n ended_at INTEGER,\n exit_code INTEGER,\n cwd TEXT,\n cli_args TEXT,\n summary TEXT,\n confidence TEXT NOT NULL DEFAULT 'medium'\n );\n\n CREATE TABLE IF NOT EXISTS usage_snapshots (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n captured_at INTEGER NOT NULL,\n source TEXT NOT NULL,\n account_id TEXT,\n window_5h_used_pct REAL,\n window_weekly_used_pct REAL,\n reset_at_5h INTEGER,\n reset_at_weekly INTEGER,\n raw_output TEXT,\n confidence TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS file_changes (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n session_id TEXT NOT NULL,\n path TEXT NOT NULL,\n change_type TEXT NOT NULL,\n detected_at INTEGER NOT NULL,\n FOREIGN KEY (session_id) REFERENCES sessions(id)\n );\n `);\n\n // Idempotent column additions (SQLite has no ADD COLUMN IF NOT EXISTS)\n const addCol = (table: string, col: string, def: string) => {\n try { db.exec(`ALTER TABLE ${table} ADD COLUMN ${col} ${def}`); } catch { /* already exists */ }\n };\n addCol('sessions', 'ai_title', 'TEXT');\n addCol('sessions', 'tags', 'TEXT DEFAULT \"[]\"');\n addCol('sessions', 'codex_category', 'TEXT');\n addCol('sessions', 'tokens_used', 'INTEGER');\n addCol('usage_snapshots', 'account_id', 'TEXT');\n\n db.exec(`\n CREATE INDEX IF NOT EXISTS idx_sessions_started ON sessions(started_at DESC);\n CREATE INDEX IF NOT EXISTS idx_usage_captured ON usage_snapshots(captured_at DESC);\n CREATE INDEX IF NOT EXISTS idx_usage_source_account_captured ON usage_snapshots(source, account_id, captured_at DESC);\n `);\n}\n","import type Database from 'better-sqlite3';\n\nexport type UsageSource = 'claude_usage_cmd' | 'statusline' | 'manual' | 'codex';\nexport type UsageConfidence = 'high' | 'medium' | 'low';\n\nexport interface UsageSnapshotInput {\n capturedAt: number;\n source: UsageSource;\n accountId: string | null;\n window5hUsedPct: number | null;\n windowWeeklyUsedPct: number | null;\n resetAt5h: number | null;\n resetAtWeekly: number | null;\n rawOutput: string | null;\n confidence: UsageConfidence;\n}\n\nexport interface UsageSnapshotRecord {\n id: number;\n captured_at: number;\n source: UsageSource;\n account_id: string | null;\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 raw_output: string | null;\n confidence: UsageConfidence;\n}\n\nexport function insertUsageSnapshot(db: Database.Database, input: UsageSnapshotInput): void {\n db.prepare(`\n INSERT INTO usage_snapshots\n (captured_at, source, account_id, window_5h_used_pct, window_weekly_used_pct,\n reset_at_5h, reset_at_weekly, raw_output, confidence)\n VALUES\n (@captured_at, @source, @account_id, @window_5h_used_pct, @window_weekly_used_pct,\n @reset_at_5h, @reset_at_weekly, @raw_output, @confidence)\n `).run({\n captured_at: input.capturedAt,\n source: input.source,\n account_id: input.accountId,\n window_5h_used_pct: input.window5hUsedPct,\n window_weekly_used_pct: input.windowWeeklyUsedPct,\n reset_at_5h: input.resetAt5h,\n reset_at_weekly: input.resetAtWeekly,\n raw_output: input.rawOutput,\n confidence: input.confidence,\n });\n}\n\nexport function getLatestUsageSnapshot(\n db: Database.Database,\n source: UsageSource,\n accountId?: string | null,\n): UsageSnapshotRecord | null {\n const row = accountId != null\n ? db.prepare(`\n SELECT id, captured_at, source, account_id, window_5h_used_pct, window_weekly_used_pct,\n reset_at_5h, reset_at_weekly, raw_output, confidence\n FROM usage_snapshots\n WHERE source = ? AND account_id = ?\n ORDER BY captured_at DESC\n LIMIT 1\n `).get(source, accountId)\n : db.prepare(`\n SELECT id, captured_at, source, account_id, window_5h_used_pct, window_weekly_used_pct,\n reset_at_5h, reset_at_weekly, raw_output, confidence\n FROM usage_snapshots\n WHERE source = ?\n ORDER BY captured_at DESC\n LIMIT 1\n `).get(source);\n\n return (row as UsageSnapshotRecord | undefined) ?? null;\n}\n","import { mkdir, readFile, rename, readdir, stat, unlink, writeFile } from 'node:fs/promises';\nimport { readFileSync, statSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport path from 'node:path';\n\ninterface CodexAuthFile {\n auth_mode?: unknown;\n OPENAI_API_KEY?: unknown;\n tokens?: {\n id_token?: unknown;\n access_token?: unknown;\n refresh_token?: unknown;\n account_id?: unknown;\n };\n last_refresh?: unknown;\n}\n\nexport interface CodexAccountSummary {\n accountId: string;\n label: string;\n email: string | null;\n name: string | null;\n planType: string | null;\n userId: string | null;\n lastRefresh: string | null;\n idTokenExpiresAt: string | null;\n accessTokenExpiresAt: string | null;\n storedAt: string | null;\n isCurrent: boolean;\n}\n\nexport interface CodexAuthPaths {\n authPath?: string;\n storeDir?: string;\n}\n\nexport interface CurrentCodexAccount {\n accountId: string;\n authMtimeMs: number;\n}\n\nconst AUTH_CLAIMS_KEY = 'https://api.openai.com/auth';\n\nfunction defaultAuthPath() {\n return path.join(/* turbopackIgnore: true */ homedir(), '.codex', 'auth.json');\n}\n\nfunction defaultStoreDir() {\n return path.join(/* turbopackIgnore: true */ homedir(), '.codex', 'auth-accounts');\n}\n\nfunction resolvePaths(paths: CodexAuthPaths = {}) {\n return {\n authPath: paths.authPath ?? defaultAuthPath(),\n storeDir: paths.storeDir ?? defaultStoreDir(),\n };\n}\n\nfunction accountPath(accountId: string, storeDir: string) {\n return path.join(/* turbopackIgnore: true */ storeDir, `${accountId.replace(/[^a-zA-Z0-9_-]/g, '_')}.json`);\n}\n\nasync function readAuthFile(filePath: string): Promise<CodexAuthFile> {\n const raw = await readFile(filePath, 'utf8');\n const parsed = JSON.parse(raw) as CodexAuthFile;\n if (!parsed.tokens || typeof parsed.tokens.account_id !== 'string') {\n throw new Error('Codex auth file is missing tokens.account_id');\n }\n return parsed;\n}\n\nasync function writeJsonAtomic(filePath: string, data: unknown) {\n await mkdir(path.dirname(filePath), { recursive: true });\n const tmp = `${filePath}.${process.pid}.${Date.now()}.tmp`;\n await writeFile(tmp, `${JSON.stringify(data, null, 2)}\\n`, { encoding: 'utf8', mode: 0o600 });\n await rename(tmp, filePath);\n}\n\nfunction decodeJwtPayload(token: unknown): Record<string, unknown> | null {\n if (typeof token !== 'string') return null;\n const [, payload] = token.split('.');\n if (!payload) return null;\n\n try {\n return JSON.parse(Buffer.from(payload, 'base64url').toString('utf8')) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nfunction stringClaim(value: unknown): string | null {\n return typeof value === 'string' && value.length > 0 ? value : null;\n}\n\nfunction expiryClaim(value: unknown): string | null {\n return typeof value === 'number' ? new Date(value * 1000).toISOString() : null;\n}\n\nfunction summarizeAuth(auth: CodexAuthFile, storedAt: string | null, currentAccountId: string | null): CodexAccountSummary {\n const accountId = stringClaim(auth.tokens?.account_id);\n if (!accountId) throw new Error('Codex auth file is missing tokens.account_id');\n\n const idPayload = decodeJwtPayload(auth.tokens?.id_token);\n const accessPayload = decodeJwtPayload(auth.tokens?.access_token);\n const idAuthClaims = idPayload?.[AUTH_CLAIMS_KEY] as Record<string, unknown> | undefined;\n const accessAuthClaims = accessPayload?.[AUTH_CLAIMS_KEY] as Record<string, unknown> | undefined;\n\n const email = stringClaim(idPayload?.email);\n const name = stringClaim(idPayload?.name);\n const planType = stringClaim(idAuthClaims?.chatgpt_plan_type) ?? stringClaim(accessAuthClaims?.chatgpt_plan_type);\n const userId = stringClaim(idAuthClaims?.user_id) ?? stringClaim(accessAuthClaims?.user_id);\n const label = email ?? name ?? `${accountId.slice(0, 8)}...${accountId.slice(-4)}`;\n\n return {\n accountId,\n label,\n email,\n name,\n planType,\n userId,\n lastRefresh: stringClaim(auth.last_refresh),\n idTokenExpiresAt: expiryClaim(idPayload?.exp),\n accessTokenExpiresAt: expiryClaim(accessPayload?.exp),\n storedAt,\n isCurrent: accountId === currentAccountId,\n };\n}\n\nexport async function getCodexAccounts(paths: CodexAuthPaths = {}): Promise<CodexAccountSummary[]> {\n const { authPath, storeDir } = resolvePaths(paths);\n let currentAccountId: string | null = null;\n let currentAuth: CodexAuthFile | null = null;\n\n try {\n currentAuth = await readAuthFile(authPath);\n currentAccountId = stringClaim(currentAuth.tokens?.account_id);\n } catch {\n currentAuth = null;\n }\n\n const accounts = new Map<string, CodexAccountSummary>();\n\n try {\n const entries = await readdir(storeDir);\n for (const entry of entries) {\n if (!entry.endsWith('.json')) continue;\n const filePath = path.join(storeDir, entry);\n try {\n const storedAuth = await readAuthFile(filePath);\n const storedStat = await stat(filePath);\n const summary = summarizeAuth(storedAuth, storedStat.mtime.toISOString(), currentAccountId);\n accounts.set(summary.accountId, summary);\n } catch {\n // Ignore malformed account snapshots so one bad file does not break the admin page.\n }\n }\n } catch {\n // Missing store just means no saved accounts yet.\n }\n\n if (currentAuth && currentAccountId && !accounts.has(currentAccountId)) {\n accounts.set(currentAccountId, summarizeAuth(currentAuth, null, currentAccountId));\n }\n\n return [...accounts.values()].sort((a, b) => {\n if (a.isCurrent !== b.isCurrent) return a.isCurrent ? -1 : 1;\n return a.label.localeCompare(b.label);\n });\n}\n\nexport function getCurrentCodexAccount(paths: CodexAuthPaths = {}): CurrentCodexAccount | null {\n const { authPath } = resolvePaths(paths);\n try {\n const auth = JSON.parse(readFileSync(authPath, 'utf8')) as CodexAuthFile;\n const accountId = stringClaim(auth.tokens?.account_id);\n if (!accountId) return null;\n return {\n accountId,\n authMtimeMs: statSync(authPath).mtimeMs,\n };\n } catch {\n return null;\n }\n}\n\nexport async function importCurrentCodexAuth(paths: CodexAuthPaths = {}): Promise<CodexAccountSummary> {\n const { authPath, storeDir } = resolvePaths(paths);\n const auth = await readAuthFile(authPath);\n const accountId = auth.tokens?.account_id as string;\n const destination = accountPath(accountId, storeDir);\n await writeJsonAtomic(destination, auth);\n const storedStat = await stat(destination);\n return summarizeAuth(auth, storedStat.mtime.toISOString(), accountId);\n}\n\nexport async function switchCodexAccount(accountId: string, paths: CodexAuthPaths = {}) {\n const { authPath, storeDir } = resolvePaths(paths);\n const source = accountPath(accountId, storeDir);\n const auth = await readAuthFile(source);\n const sourceAccountId = auth.tokens?.account_id;\n if (sourceAccountId !== accountId) {\n throw new Error('Stored account id does not match requested account');\n }\n\n let backupPath: string | null = null;\n try {\n const current = await readFile(authPath, 'utf8');\n backupPath = `${authPath}.${new Date().toISOString().replace(/[:.]/g, '-')}.bak`;\n await writeFile(backupPath, current, { encoding: 'utf8', mode: 0o600 });\n } catch {\n backupPath = null;\n }\n\n await writeJsonAtomic(authPath, auth);\n return {\n ...summarizeAuth(auth, null, accountId),\n backupPath,\n };\n}\n\nexport async function deleteCodexAccount(accountId: string, paths: CodexAuthPaths = {}) {\n const { authPath, storeDir } = resolvePaths(paths);\n const auth = await readAuthFile(authPath).catch(() => null);\n if (auth?.tokens?.account_id === accountId) {\n throw new Error('Cannot delete the currently active Codex account');\n }\n await unlink(accountPath(accountId, storeDir));\n}\n","/**\n * Scans ~/.claude/projects/ for session JSONL files and upserts them into SQLite.\n * Active sessions (present in ~/.claude/sessions/) get ended_at = null.\n *\n * This is the primary data source — no claude CLI alias needed.\n * confidence='high' because data comes directly from Claude Code's own files.\n */\n\nimport fs from 'fs';\nimport path from 'path';\nimport os from 'os';\nimport { getDb } from '../db';\nimport { parseSessionLog } from '../parsers/session-log';\nimport { parseStatuslineJson } from '../parsers/statusline-json';\nimport { parseCodexRateLimit } from '../parsers/codex-ratelimit';\nimport { importCodexSessions } from './codex-importer';\nimport { importCursorSessions } from './cursor-importer';\nimport { getCurrentCodexAccount } from '../codex-auth';\nimport { insertUsageSnapshot } from '../usage-snapshots';\n\nconst CLAUDE_DIR = path.join(os.homedir(), '.claude');\nconst PROJECTS_DIR = path.join(CLAUDE_DIR, 'projects');\nconst SESSIONS_DIR = path.join(CLAUDE_DIR, 'sessions');\n\n/** Returns the set of sessionIds currently active (file present in ~/.claude/sessions/). */\nfunction getActiveSessionIds(): Set<string> {\n const active = new Set<string>();\n try {\n const files = fs.readdirSync(SESSIONS_DIR);\n for (const f of files) {\n if (!f.endsWith('.json')) continue;\n try {\n const raw = fs.readFileSync(path.join(SESSIONS_DIR, f), 'utf8');\n const data = JSON.parse(raw) as { sessionId?: string };\n if (data.sessionId) active.add(data.sessionId);\n } catch { /* corrupt file, skip */ }\n }\n } catch { /* SESSIONS_DIR doesn't exist */ }\n return active;\n}\n\n/** Returns all .jsonl paths under ~/.claude/projects/. */\nfunction collectJsonlPaths(): string[] {\n const result: string[] = [];\n try {\n const projectDirs = fs.readdirSync(PROJECTS_DIR);\n for (const dir of projectDirs) {\n const full = path.join(PROJECTS_DIR, dir);\n try {\n const stat = fs.statSync(full);\n if (!stat.isDirectory()) continue;\n const files = fs.readdirSync(full);\n for (const f of files) {\n if (f.endsWith('.jsonl')) result.push(path.join(full, f));\n }\n } catch { /* skip */ }\n }\n } catch { /* PROJECTS_DIR doesn't exist */ }\n return result;\n}\n\nexport interface ImportResult {\n scanned: number;\n inserted: number;\n skipped: number;\n}\n\nexport function importSessions(): ImportResult {\n const db = getDb();\n const activeIds = getActiveSessionIds();\n const jsonlPaths = collectJsonlPaths();\n\n const upsert = db.prepare(`\n INSERT INTO sessions (id, tool, started_at, ended_at, exit_code, cwd, cli_args, summary, ai_title, confidence)\n VALUES (@id, @tool, @started_at, @ended_at, @exit_code, @cwd, @cli_args, @summary, @ai_title, @confidence)\n ON CONFLICT(id) DO UPDATE SET\n ended_at = excluded.ended_at,\n exit_code = excluded.exit_code,\n ai_title = COALESCE(sessions.ai_title, excluded.ai_title),\n confidence = excluded.confidence\n `);\n\n let inserted = 0;\n let skipped = 0;\n\n const importAll = db.transaction(() => {\n for (const jsonlPath of jsonlPaths) {\n const meta = parseSessionLog(jsonlPath);\n if (!meta || !meta.startedAt) { skipped++; continue; }\n\n const isActive = activeIds.has(meta.sessionId);\n\n upsert.run({\n id: meta.sessionId,\n tool: 'claude-code',\n started_at: meta.startedAt,\n ended_at: isActive ? null : meta.lastSeenAt,\n exit_code: null,\n cwd: meta.cwd,\n cli_args: null,\n summary: null,\n ai_title: meta.aiTitle,\n confidence: 'high',\n });\n inserted++;\n }\n });\n\n importAll();\n importCodexSessions();\n importCursorSessions();\n\n // Claude Code: from statusline-latest.json written by statusline-command.sh\n const usage = parseStatuslineJson();\n if (usage) {\n insertUsageSnapshot(db, {\n capturedAt: Date.now(),\n source: 'statusline',\n accountId: null,\n window5hUsedPct: usage.window_5h_used_pct,\n windowWeeklyUsedPct: usage.window_weekly_used_pct,\n resetAt5h: usage.reset_at_5h,\n resetAtWeekly: usage.reset_at_weekly,\n rawOutput: usage.raw_output,\n confidence: 'high',\n });\n }\n\n // Codex: from most recent ~/.codex/sessions/*/rollout-*.jsonl rate_limits event\n const currentCodexAccount = getCurrentCodexAccount();\n const codexUsage = parseCodexRateLimit({\n minMtimeMs: currentCodexAccount?.authMtimeMs,\n });\n if (codexUsage) {\n insertUsageSnapshot(db, {\n capturedAt: Date.now(),\n source: 'codex',\n accountId: currentCodexAccount?.accountId ?? null,\n window5hUsedPct: codexUsage.window_5h_used_pct,\n windowWeeklyUsedPct: codexUsage.window_weekly_used_pct,\n resetAt5h: codexUsage.reset_at_5h,\n resetAtWeekly: codexUsage.reset_at_weekly,\n rawOutput: null,\n confidence: 'high',\n });\n }\n\n return { scanned: jsonlPaths.length, inserted, skipped };\n}\n","import fs from 'fs';\nimport { z } from 'zod';\n\n// Minimal shapes we care about — extra fields are ignored via .passthrough()\nconst LineWithTimestamp = z.object({\n timestamp: z.string().optional(),\n sessionId: z.string().optional(),\n cwd: z.string().optional(),\n gitBranch: z.string().optional(),\n version: z.string().optional(),\n type: z.string(),\n}).passthrough();\n\nconst AiTitleLine = z.object({\n type: z.literal('ai-title'),\n aiTitle: z.string(),\n sessionId: z.string(),\n});\n\nexport interface SessionLogMeta {\n sessionId: string;\n cwd: string | null;\n gitBranch: string | null;\n version: string | null;\n /** Unix ms of first timestamped line */\n startedAt: number | null;\n /** Unix ms of last timestamped line */\n lastSeenAt: number | null;\n /**\n * Claude-generated session title from the ai-title event.\n * Safe to store (not user prompt content).\n * TODO Day 2: use as seed for continuation prompt generation.\n */\n aiTitle: string | null;\n}\n\nexport function parseSessionLog(jsonlPath: string): SessionLogMeta | null {\n let raw: string;\n try {\n raw = fs.readFileSync(jsonlPath, 'utf8');\n } catch {\n return null;\n }\n\n const lines = raw.split('\\n').filter(Boolean);\n if (lines.length === 0) return null;\n\n // sessionId comes from the filename (uuid before .jsonl)\n const sessionId = jsonlPath.split('/').pop()?.replace('.jsonl', '') ?? null;\n if (!sessionId) return null;\n\n let cwd: string | null = null;\n let gitBranch: string | null = null;\n let version: string | null = null;\n let startedAt: number | null = null;\n let lastSeenAt: number | null = null;\n let aiTitle: string | null = null;\n\n for (const line of lines) {\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(line) as Record<string, unknown>;\n } catch {\n continue;\n }\n\n const base = LineWithTimestamp.safeParse(parsed);\n if (!base.success) continue;\n\n const data = base.data;\n\n if (data.timestamp) {\n const ms = new Date(data.timestamp).getTime();\n if (!Number.isNaN(ms)) {\n if (startedAt === null || ms < startedAt) startedAt = ms;\n if (lastSeenAt === null || ms > lastSeenAt) lastSeenAt = ms;\n }\n }\n\n if (!cwd && data.cwd) cwd = data.cwd;\n if (!gitBranch && data.gitBranch) gitBranch = data.gitBranch;\n if (!version && data.version) version = data.version;\n\n if (data.type === 'ai-title') {\n const titleParsed = AiTitleLine.safeParse(parsed);\n if (titleParsed.success) aiTitle = titleParsed.data.aiTitle;\n }\n }\n\n return { sessionId, cwd, gitBranch, version, startedAt, lastSeenAt, aiTitle };\n}\n\nexport interface ConversationTurn {\n role: 'user' | 'assistant';\n text: string;\n toolNames?: string[];\n}\n\nexport function readConversationTurns(jsonlPath: string, limit = 12): ConversationTurn[] {\n let raw: string;\n try {\n raw = fs.readFileSync(jsonlPath, 'utf8');\n } catch {\n return [];\n }\n\n const turns: ConversationTurn[] = [];\n\n for (const line of raw.split('\\n').filter(Boolean)) {\n let parsed: Record<string, unknown>;\n try { parsed = JSON.parse(line) as Record<string, unknown>; } catch { continue; }\n\n const type = parsed.type as string | undefined;\n const msg = parsed.message as Record<string, unknown> | undefined;\n if (!msg || (type !== 'user' && type !== 'assistant')) continue;\n\n const role = msg.role as string;\n const content = msg.content;\n\n if (role === 'user' && typeof content === 'string' && content.trim()) {\n turns.push({ role: 'user', text: content.trim().slice(0, 800) });\n } else if (role === 'assistant' && Array.isArray(content)) {\n const textParts: string[] = [];\n const toolNames: string[] = [];\n for (const part of content as Record<string, unknown>[]) {\n if (part.type === 'text' && typeof part.text === 'string') {\n textParts.push((part.text as string).slice(0, 600));\n } else if (part.type === 'tool_use' && typeof part.name === 'string') {\n toolNames.push(part.name as string);\n }\n }\n if (textParts.length > 0 || toolNames.length > 0) {\n turns.push({ role: 'assistant', text: textParts.join(' ').trim(), toolNames });\n }\n }\n }\n\n return turns.slice(-limit);\n}\n","/**\n * Parses ~/.data/statusline-latest.json written by the patched statusline-command.sh.\n * Claude Code writes this file on every status line render with current session context.\n * All fields come directly from Claude Code internals — confidence='high'.\n */\n\nimport fs from 'fs';\nimport path from 'path';\nimport { z } from 'zod';\nimport { dataDir } from '../data-dir';\n\nexport const STATUSLINE_PATH = path.join(dataDir(), 'statusline-latest.json');\n\nconst StatuslineSchema = z.object({\n session_id: z.string().optional(),\n session_name: z.string().optional(),\n transcript_path: z.string().optional(),\n cwd: z.string().optional(),\n model: z.object({ id: z.string(), display_name: z.string() }).optional(),\n cost: z.object({ total_cost_usd: z.number() }).optional(),\n context_window: z.object({\n total_input_tokens: z.number(),\n total_output_tokens: z.number(),\n used_percentage: z.number(),\n }).optional(),\n rate_limits: z.object({\n five_hour: z.object({\n used_percentage: z.number(),\n resets_at: z.number().optional(), // unix seconds\n }).optional(),\n seven_day: z.object({\n used_percentage: z.number(),\n resets_at: z.number().optional(),\n }).optional(),\n }).optional(),\n}).passthrough();\n\nexport type StatuslineData = z.infer<typeof StatuslineSchema>;\n\nexport interface StatuslineUsage {\n window_5h_used_pct: number | null;\n window_weekly_used_pct: number | null;\n reset_at_5h: number | null; // unix ms\n reset_at_weekly: number | null; // unix ms\n raw_output: string;\n confidence: 'high';\n /** Also returned for session upsert */\n session_id: string | null;\n session_name: string | null;\n cwd: string | null;\n}\n\nexport function parseStatuslineJson(): StatuslineUsage | null {\n let raw: string;\n try {\n raw = fs.readFileSync(STATUSLINE_PATH, 'utf8');\n } catch {\n return null;\n }\n\n const parsed = StatuslineSchema.safeParse(JSON.parse(raw));\n if (!parsed.success) return null;\n\n const d = parsed.data;\n const rl = d.rate_limits;\n\n return {\n window_5h_used_pct: rl?.five_hour?.used_percentage ?? null,\n window_weekly_used_pct: rl?.seven_day?.used_percentage ?? null,\n // resets_at from Claude Code is unix seconds — convert to ms\n reset_at_5h: rl?.five_hour?.resets_at != null ? rl.five_hour.resets_at * 1000 : null,\n reset_at_weekly: rl?.seven_day?.resets_at != null ? rl.seven_day.resets_at * 1000 : null,\n raw_output: raw.slice(0, 2000),\n confidence: 'high',\n session_id: d.session_id ?? null,\n session_name: d.session_name ?? null,\n cwd: d.cwd ?? null,\n };\n}\n","/**\n * Scans the most recent ~/.codex/sessions/YYYY/MM/DD/rollout-*.jsonl and extracts\n * the last rate_limits event (type=token_count with payload.rate_limits).\n * primary = 5-hour window (300 min)\n * secondary = 7-day window (10080 min)\n */\n\nimport fs from 'fs';\nimport path from 'path';\nimport os from 'os';\n\nconst SESSIONS_DIR = path.join(os.homedir(), '.codex', 'sessions');\n\ninterface RateLimitWindow {\n used_percent: number;\n window_minutes: number;\n resets_at: number; // unix seconds\n}\n\ninterface RateLimits {\n primary: RateLimitWindow;\n secondary: RateLimitWindow;\n}\n\nexport interface CodexUsage {\n window_5h_used_pct: number;\n window_weekly_used_pct: number;\n reset_at_5h: number; // unix ms\n reset_at_weekly: number; // unix ms\n source_mtime_ms: number;\n}\n\nexport interface CodexRateLimitParseOptions {\n sessionsDir?: string;\n minMtimeMs?: number;\n}\n\nexport function parseCodexRateLimit(options: CodexRateLimitParseOptions = {}): CodexUsage | null {\n // Find the most recently modified jsonl across all session dirs\n const sessionsDir = options.sessionsDir ?? SESSIONS_DIR;\n const minMtimeMs = options.minMtimeMs ?? 0;\n try {\n let bestFile: { path: string; mtime: number } | null = null as { path: string; mtime: number } | null;\n function walk(dir: string) {\n for (const entry of fs.readdirSync(dir)) {\n const full = path.join(dir, entry);\n try {\n const stat = fs.statSync(full);\n if (stat.isDirectory()) { walk(full); continue; }\n if (entry.endsWith('.jsonl') && stat.mtimeMs >= minMtimeMs && stat.mtimeMs > (bestFile?.mtime ?? 0)) {\n bestFile = { path: full, mtime: stat.mtimeMs };\n }\n } catch { /* skip */ }\n }\n }\n if (!fs.existsSync(sessionsDir)) return null;\n walk(sessionsDir);\n if (!bestFile) return null;\n\n // Read from the end — last rate_limits event wins\n const lines = fs.readFileSync(bestFile.path, 'utf8').split('\\n').filter(Boolean).reverse();\n for (const line of lines) {\n try {\n const obj = JSON.parse(line) as { payload?: { rate_limits?: RateLimits } };\n const rl = obj?.payload?.rate_limits;\n if (!rl?.primary || !rl?.secondary) continue;\n return {\n window_5h_used_pct: rl.primary.used_percent,\n window_weekly_used_pct: rl.secondary.used_percent,\n reset_at_5h: rl.primary.resets_at * 1000,\n reset_at_weekly: rl.secondary.resets_at * 1000,\n source_mtime_ms: bestFile.mtime,\n };\n } catch { /* skip */ }\n }\n return null;\n } catch {\n return null;\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport os from 'os';\nimport { getDb } from '../db';\n\nconst CODEX_DIR = path.join(os.homedir(), '.codex');\nconst STATE_DB = path.join(CODEX_DIR, 'state_5.sqlite');\nconst HISTORY_PATH = path.join(CODEX_DIR, 'history.jsonl');\n\ninterface ThreadRow {\n id: string;\n created_at_ms: number;\n updated_at_ms: number;\n cwd: string | null;\n title: string | null;\n first_user_message: string | null;\n tokens_used: number | null;\n git_branch: string | null;\n model: string | null;\n archived: number;\n}\n\nfunction importFromStateDb(): boolean {\n if (!fs.existsSync(STATE_DB)) return false;\n try {\n // Use better-sqlite3 to read Codex's own SQLite\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const BetterSqlite = require('better-sqlite3') as typeof import('better-sqlite3');\n const codexDb = new BetterSqlite(STATE_DB, { readonly: true });\n\n const threads = codexDb.prepare(`\n SELECT id, created_at_ms, updated_at_ms, cwd, title, first_user_message,\n tokens_used, git_branch, model, archived\n FROM threads\n ORDER BY created_at_ms ASC\n `).all() as ThreadRow[];\n\n const db = getDb();\n const upsert = db.prepare(`\n INSERT INTO sessions (id, tool, started_at, ended_at, cwd, ai_title, tokens_used, confidence)\n VALUES (@id, 'codex', @started_at, @ended_at, @cwd, @ai_title, @tokens_used, 'high')\n ON CONFLICT(id) DO UPDATE SET\n ended_at = excluded.ended_at,\n cwd = COALESCE(sessions.cwd, excluded.cwd),\n ai_title = COALESCE(sessions.ai_title, excluded.ai_title),\n tokens_used = excluded.tokens_used,\n confidence = 'high'\n `);\n\n const importAll = db.transaction(() => {\n for (const t of threads) {\n upsert.run({\n id: t.id,\n started_at: t.created_at_ms,\n ended_at: t.updated_at_ms,\n cwd: t.cwd,\n ai_title: t.title ?? t.first_user_message?.slice(0, 120) ?? null,\n tokens_used: t.tokens_used,\n });\n }\n });\n importAll();\n codexDb.close();\n return true;\n } catch {\n return false;\n }\n}\n\nfunction importFromHistoryJsonl(): void {\n if (!fs.existsSync(HISTORY_PATH)) return;\n interface Entry { session_id: string; ts: number; }\n const bySession = new Map<string, { minTs: number; maxTs: number }>();\n try {\n for (const line of fs.readFileSync(HISTORY_PATH, 'utf8').split('\\n').filter(Boolean)) {\n try {\n const e = JSON.parse(line) as Entry;\n if (!e.session_id || !e.ts) continue;\n const cur = bySession.get(e.session_id);\n if (!cur) { bySession.set(e.session_id, { minTs: e.ts, maxTs: e.ts }); }\n else { if (e.ts < cur.minTs) cur.minTs = e.ts; if (e.ts > cur.maxTs) cur.maxTs = e.ts; }\n } catch { /* skip */ }\n }\n } catch { return; }\n\n const db = getDb();\n const upsert = db.prepare(`\n INSERT INTO sessions (id, tool, started_at, ended_at, confidence)\n VALUES (@id, 'codex', @started_at, @ended_at, 'medium')\n ON CONFLICT(id) DO NOTHING\n `);\n const importAll = db.transaction(() => {\n for (const [id, { minTs, maxTs }] of bySession) {\n upsert.run({ id, started_at: minTs * 1000, ended_at: maxTs * 1000 });\n }\n });\n importAll();\n}\n\nexport function importCodexSessions(): void {\n const usedStateDb = importFromStateDb();\n if (!usedStateDb) importFromHistoryJsonl(); // fallback\n}\n","import fs from 'fs';\nimport path from 'path';\nimport os from 'os';\nimport { getDb } from '../db';\n\nconst CURSOR_BASE = path.join(\n os.homedir(),\n 'Library/Application Support/Cursor/User'\n);\nconst CURSOR_WS = path.join(CURSOR_BASE, 'workspaceStorage');\nconst CURSOR_GLOBAL_DB = path.join(CURSOR_BASE, 'globalStorage/state.vscdb');\n\ninterface ComposerEntry {\n composerId: string;\n createdAt: number;\n name?: string;\n unifiedMode?: string;\n totalLinesAdded?: number;\n totalLinesRemoved?: number;\n isArchived?: boolean;\n}\n\ninterface ComposerData {\n allComposers?: ComposerEntry[];\n}\n\nexport function importCursorSessions(): void {\n if (!fs.existsSync(CURSOR_WS)) return;\n\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const BetterSqlite = require('better-sqlite3') as typeof import('better-sqlite3');\n\n const db = getDb();\n const upsert = db.prepare(`\n INSERT INTO sessions (id, tool, started_at, ended_at, cwd, ai_title, confidence)\n VALUES (@id, 'cursor', @started_at, @ended_at, @cwd, @ai_title, 'high')\n ON CONFLICT(id) DO UPDATE SET\n ended_at = excluded.ended_at,\n cwd = COALESCE(sessions.cwd, excluded.cwd),\n ai_title = COALESCE(sessions.ai_title, excluded.ai_title)\n `);\n\n let dirs: string[];\n try { dirs = fs.readdirSync(CURSOR_WS); } catch { return; }\n\n const importAll = db.transaction(() => {\n for (const dir of dirs) {\n const vscdb = path.join(CURSOR_WS, dir, 'state.vscdb');\n const wsJson = path.join(CURSOR_WS, dir, 'workspace.json');\n if (!fs.existsSync(vscdb)) continue;\n\n let folder: string | null = null;\n try {\n const ws = JSON.parse(fs.readFileSync(wsJson, 'utf8')) as { folder?: string };\n folder = ws.folder?.replace('file://', '') ?? null;\n } catch { /* ok */ }\n\n try {\n const cdb = new BetterSqlite(vscdb, { readonly: true });\n const row = cdb.prepare(\n `SELECT value FROM ItemTable WHERE key = 'composer.composerData'`\n ).get() as { value: string } | undefined;\n cdb.close();\n if (!row) continue;\n\n const data = JSON.parse(row.value) as ComposerData;\n const composers = data.allComposers ?? [];\n\n for (const c of composers) {\n if (!c.composerId || !c.createdAt) continue;\n upsert.run({\n id: c.composerId,\n started_at: c.createdAt,\n ended_at: c.createdAt, // Cursor doesn't record end time\n cwd: folder,\n ai_title: c.name ?? null,\n });\n }\n } catch { /* corrupt db, skip */ }\n }\n });\n\n importAll();\n\n // 2026 onwards: Cursor migrated composers to a single global `cursorDiskKV`\n // table inside ~/Library/Application Support/Cursor/User/globalStorage/state.vscdb.\n // Per-workspace storage above only covers pre-migration data; we read the new\n // table here too. Upsert dedupes on composerId.\n if (fs.existsSync(CURSOR_GLOBAL_DB)) {\n try {\n const gdb = new BetterSqlite(CURSOR_GLOBAL_DB, { readonly: true });\n // Check the table exists before querying (older Cursor versions won't have it).\n const hasTable = gdb.prepare(\n `SELECT name FROM sqlite_master WHERE type='table' AND name='cursorDiskKV'`,\n ).get();\n if (hasTable) {\n const rows = gdb.prepare(\n `SELECT key, value FROM cursorDiskKV WHERE key LIKE 'composerData:%'`,\n ).all() as { key: string; value: Buffer | string }[];\n\n const importGlobal = db.transaction(() => {\n for (const r of rows) {\n const id = r.key.slice('composerData:'.length);\n let data: { composerId?: string; createdAt?: number; lastUpdatedAt?: number; name?: string; text?: string };\n try {\n data = JSON.parse(typeof r.value === 'string' ? r.value : r.value.toString('utf8'));\n } catch { continue; }\n const composerId = data.composerId || id;\n const createdAt = data.createdAt;\n if (!composerId || !createdAt) continue;\n const endedAt = data.lastUpdatedAt ?? createdAt;\n const aiTitle = data.name || (data.text ? data.text.slice(0, 120) : null);\n upsert.run({\n id: composerId,\n started_at: createdAt,\n ended_at: endedAt,\n cwd: null,\n ai_title: aiTitle,\n });\n }\n });\n importGlobal();\n }\n gdb.close();\n } catch { /* skip — corrupt or locked */ }\n }\n}\n"],"names":["dataDir","process","env","VIBEMETER_DATA_DIR","join","cwd","insertUsageSnapshot","db","input","prepare","run","captured_at","capturedAt","source","account_id","accountId","window_5h_used_pct","window5hUsedPct","window_weekly_used_pct","windowWeeklyUsedPct","reset_at_5h","resetAt5h","reset_at_weekly","resetAtWeekly","raw_output","rawOutput","confidence","getLatestUsageSnapshot","row","get","AUTH_CLAIMS_KEY","defaultAuthPath","defaultStoreDir","resolvePaths","paths","authPath","storeDir","accountPath","replace","readAuthFile","filePath","raw","parsed","JSON","parse","tokens","Error","writeJsonAtomic","data","dirname","recursive","tmp","pid","Date","now","stringify","encoding","mode","decodeJwtPayload","token","payload","split","Buffer","from","toString","stringClaim","value","length","expiryClaim","toISOString","summarizeAuth","auth","storedAt","currentAccountId","idPayload","id_token","accessPayload","access_token","idAuthClaims","accessAuthClaims","email","name","planType","chatgpt_plan_type","userId","user_id","label","slice","lastRefresh","last_refresh","idTokenExpiresAt","exp","accessTokenExpiresAt","isCurrent","getCodexAccounts","currentAuth","accounts","Map","entries","entry","endsWith","storedAuth","storedStat","summary","mtime","set","has","values","sort","a","b","localeCompare","getCurrentCodexAccount","authMtimeMs","mtimeMs","importCurrentCodexAuth","destination","switchCodexAccount","sourceAccountId","backupPath","current","deleteCodexAccount","catch","AiTitleLine","LineWithTimestamp","object","timestamp","string","optional","sessionId","gitBranch","version","type","passthrough","literal","aiTitle","parseSessionLog","jsonlPath","readFileSync","lines","filter","Boolean","pop","startedAt","lastSeenAt","line","base","safeParse","success","ms","getTime","Number","isNaN","titleParsed","readConversationTurns","limit","turns","msg","message","role","content","trim","push","text","Array","isArray","textParts","toolNames","part"],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- module.exports=[93695,(a,b,c)=>{b.exports=a.x("next/dist/shared/lib/no-fallback-error.external.js",()=>require("next/dist/shared/lib/no-fallback-error.external.js"))},64240,(a,b,c)=>{"use strict";function d(a){if("function"!=typeof WeakMap)return null;var b=new WeakMap,c=new WeakMap;return(d=function(a){return a?c:b})(a)}c._=function(a,b){if(!b&&a&&a.__esModule)return a;if(null===a||"object"!=typeof a&&"function"!=typeof a)return{default:a};var c=d(b);if(c&&c.has(a))return c.get(a);var e={__proto__:null},f=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var g in a)if("default"!==g&&Object.prototype.hasOwnProperty.call(a,g)){var h=f?Object.getOwnPropertyDescriptor(a,g):null;h&&(h.get||h.set)?Object.defineProperty(e,g,h):e[g]=a[g]}return e.default=a,c&&c.set(a,e),e}},12714,(a,b,c)=>{b.exports=a.x("node:fs/promises",()=>require("node:fs/promises"))},2157,(a,b,c)=>{b.exports=a.x("node:fs",()=>require("node:fs"))},60526,(a,b,c)=>{b.exports=a.x("node:os",()=>require("node:os"))},50227,(a,b,c)=>{b.exports=a.x("node:path",()=>require("node:path"))},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)},1737,a=>{"use strict";var b=a.i(12714);a.i(2157);var c=a.i(60526),d=a.i(50227);let e="https://api.openai.com/auth";async function f(a){let c=JSON.parse(await (0,b.readFile)(a,"utf8"));if(!c.tokens||"string"!=typeof c.tokens.account_id)throw Error("Codex auth file is missing tokens.account_id");return c}function g(a){if("string"!=typeof a)return null;let[,b]=a.split(".");if(!b)return null;try{return JSON.parse(Buffer.from(b,"base64url").toString("utf8"))}catch{return null}}function h(a){return"string"==typeof a&&a.length>0?a:null}function i(a){return"number"==typeof a?new Date(1e3*a).toISOString():null}function j(a,b,c){let d=h(a.tokens?.account_id);if(!d)throw Error("Codex auth file is missing tokens.account_id");let f=g(a.tokens?.id_token),j=g(a.tokens?.access_token),k=f?.[e],l=j?.[e],m=h(f?.email),n=h(f?.name),o=h(k?.chatgpt_plan_type)??h(l?.chatgpt_plan_type),p=h(k?.user_id)??h(l?.user_id),q=m??n??`${d.slice(0,8)}...${d.slice(-4)}`;return{accountId:d,label:q,email:m,name:n,planType:o,userId:p,lastRefresh:h(a.last_refresh),idTokenExpiresAt:i(f?.exp),accessTokenExpiresAt:i(j?.exp),storedAt:b,isCurrent:d===c}}async function k(a={}){let{authPath:e,storeDir:g}=function(a={}){return{authPath:a.authPath??d.default.join((0,c.homedir)(),".codex","auth.json"),storeDir:a.storeDir??d.default.join((0,c.homedir)(),".codex","auth-accounts")}}(a),i=null,l=null;try{l=await f(e),i=h(l.tokens?.account_id)}catch{l=null}let m=new Map;try{for(let a of(await (0,b.readdir)(g))){if(!a.endsWith(".json"))continue;let c=d.default.join(g,a);try{let a=await f(c),d=await (0,b.stat)(c),e=j(a,d.mtime.toISOString(),i);m.set(e.accountId,e)}catch{}}}catch{}return l&&i&&!m.has(i)&&m.set(i,j(l,null,i)),[...m.values()].sort((a,b)=>a.isCurrent!==b.isCurrent?a.isCurrent?-1:1:a.label.localeCompare(b.label))}a.s(["getCodexAccounts",0,k])},10585,a=>{a.v("/_next/static/media/favicon.0x3dzn~oxb6tn.ico"+(globalThis.NEXT_CLIENT_ASSET_SUFFIX||""))},68611,a=>{"use strict";let b={src:a.i(10585).default,width:256,height:256};a.s(["default",0,b])},79887,a=>{"use strict";a.s(["CodexAccountsPanel",()=>b]);let b=(0,a.i(11857).registerClientReference)(function(){throw Error("Attempted to call CodexAccountsPanel() from the server but CodexAccountsPanel is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/src/components/CodexAccountsPanel.tsx <module evaluation>","CodexAccountsPanel")},14929,a=>{"use strict";a.s(["CodexAccountsPanel",()=>b]);let b=(0,a.i(11857).registerClientReference)(function(){throw Error("Attempted to call CodexAccountsPanel() from the server but CodexAccountsPanel is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/src/components/CodexAccountsPanel.tsx","CodexAccountsPanel")},32787,a=>{"use strict";a.i(79887);var b=a.i(14929);a.n(b)},25657,a=>{"use strict";var b=a.i(7997),c=a.i(95936),d=a.i(32787),e=a.i(1737);async function f(){let a=await (0,e.getCodexAccounts)();return(0,b.jsx)("div",{className:"min-h-screen bg-zinc-950 text-zinc-100 font-mono",children:(0,b.jsxs)("div",{className:"max-w-6xl mx-auto px-6 py-8",children:[(0,b.jsxs)("div",{className:"mb-6 flex items-start justify-between gap-4",children:[(0,b.jsxs)("div",{children:[(0,b.jsxs)("h1",{className:"text-xl font-semibold tracking-tight text-zinc-100",children:[(0,b.jsx)("span",{className:"text-violet-400",children:"Vibe"}),"meter Admin"]}),(0,b.jsx)("p",{className:"text-zinc-600 text-xs mt-1",children:"local Codex account switching · tokens stay on this machine"})]}),(0,b.jsx)(c.default,{href:"/",className:"rounded-md border border-zinc-800 px-3 py-2 text-xs text-zinc-400 transition-colors hover:border-zinc-600 hover:text-zinc-100",children:"Dashboard"})]}),(0,b.jsx)(d.CodexAccountsPanel,{initialAccounts:a})]})})}a.s(["default",0,f,"dynamic",0,"force-dynamic"])},50427,a=>{a.n(a.i(25657))}];
2
-
3
- //# sourceMappingURL=%5Broot-of-the-server%5D__054lv8d._.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../node_modules/%40swc/helpers/cjs/_interop_require_wildcard.cjs","../../../../node_modules/next/dist/client/app-dir/link.js/__nextjs-internal-proxy.cjs","../../../../node_modules/next/src/client/app-dir/link.tsx","../../../../node_modules/next/src/client/app-dir/link.react-server.tsx","../../../../src/lib/codex-auth.ts","../../../../src/app/favicon.ico.mjs%20%28structured%20image%20object%29","../../../../src/components/CodexAccountsPanel.tsx/__nextjs-internal-proxy.mjs","../../../../src/app/admin/page.tsx"],"sourcesContent":["\"use strict\";\n\nfunction _getRequireWildcardCache(nodeInterop) {\n if (typeof WeakMap !== \"function\") return null;\n\n var cacheBabelInterop = new WeakMap();\n var cacheNodeInterop = new WeakMap();\n\n return (_getRequireWildcardCache = function(nodeInterop) {\n return nodeInterop ? cacheNodeInterop : cacheBabelInterop;\n })(nodeInterop);\n}\nfunction _interop_require_wildcard(obj, nodeInterop) {\n if (!nodeInterop && obj && obj.__esModule) return obj;\n if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") return { default: obj };\n\n var cache = _getRequireWildcardCache(nodeInterop);\n\n if (cache && cache.has(obj)) return cache.get(obj);\n\n var newObj = { __proto__: null };\n var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var key in obj) {\n if (key !== \"default\" && Object.prototype.hasOwnProperty.call(obj, key)) {\n var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;\n if (desc && (desc.get || desc.set)) Object.defineProperty(newObj, key, desc);\n else newObj[key] = obj[key];\n }\n }\n\n newObj.default = obj;\n\n if (cache) cache.set(obj, newObj);\n\n return newObj;\n}\nexports._ = _interop_require_wildcard;\n","// This file is generated by next-core EcmascriptClientReferenceModule.\nconst { createClientModuleProxy } = require(\"react-server-dom-turbopack/server\");\n\n__turbopack_context__.n(createClientModuleProxy(\"[project]/node_modules/next/dist/client/app-dir/link.js\"));\n","'use client'\n\nimport React, { createContext, useContext, useOptimistic, useRef } from 'react'\nimport type { UrlObject } from 'url'\nimport { formatUrl } from '../../shared/lib/router/utils/format-url'\nimport { AppRouterContext } from '../../shared/lib/app-router-context.shared-runtime'\nimport { useMergedRef } from '../use-merged-ref'\nimport { isAbsoluteUrl } from '../../shared/lib/utils'\nimport { addBasePath } from '../add-base-path'\nimport { warnOnce } from '../../shared/lib/utils/warn-once'\nimport { ScrollBehavior } from '../components/router-reducer/router-reducer-types'\nimport type { PENDING_LINK_STATUS } from '../components/links'\nimport {\n IDLE_LINK_STATUS,\n mountLinkInstance,\n onNavigationIntent,\n unmountLinkForCurrentNavigation,\n unmountPrefetchableInstance,\n type LinkInstance,\n} from '../components/links'\nimport { isLocalURL } from '../../shared/lib/router/utils/is-local-url'\nimport {\n FetchStrategy,\n type PrefetchTaskFetchStrategy,\n} from '../components/segment-cache/types'\nimport { errorOnce } from '../../shared/lib/utils/error-once'\n\ntype Url = string | UrlObject\ntype RequiredKeys<T> = {\n [K in keyof T]-?: {} extends Pick<T, K> ? never : K\n}[keyof T]\ntype OptionalKeys<T> = {\n [K in keyof T]-?: {} extends Pick<T, K> ? K : never\n}[keyof T]\n\ntype OnNavigateEventHandler = (event: { preventDefault: () => void }) => void\n\ntype InternalLinkProps = {\n /**\n * **Required**. The path or URL to navigate to. It can also be an object (similar to `URL`).\n *\n * @example\n * ```tsx\n * // Navigate to /dashboard:\n * <Link href=\"/dashboard\">Dashboard</Link>\n *\n * // Navigate to /about?name=test:\n * <Link href={{ pathname: '/about', query: { name: 'test' } }}>\n * About\n * </Link>\n * ```\n *\n * @remarks\n * - For external URLs, use a fully qualified URL such as `https://...`.\n * - In the App Router, dynamic routes must not include bracketed segments in `href`.\n */\n href: Url\n\n /**\n * @deprecated v10.0.0: `href` props pointing to a dynamic route are\n * automatically resolved and no longer require the `as` prop.\n */\n as?: Url\n\n /**\n * Replace the current `history` state instead of adding a new URL into the stack.\n *\n * @defaultValue `false`\n *\n * @example\n * ```tsx\n * <Link href=\"/about\" replace>\n * About (replaces the history state)\n * </Link>\n * ```\n */\n replace?: boolean\n\n /**\n * Whether to override the default scroll behavior. If `true`, Next.js attempts to maintain\n * the scroll position if the newly navigated page is still visible. If not, it scrolls to the top.\n *\n * If `false`, Next.js will not modify the scroll behavior at all.\n *\n * @defaultValue `true`\n *\n * @example\n * ```tsx\n * <Link href=\"/dashboard\" scroll={false}>\n * No auto scroll\n * </Link>\n * ```\n */\n scroll?: boolean\n\n /**\n * Update the path of the current page without rerunning data fetching methods\n * like `getStaticProps`, `getServerSideProps`, or `getInitialProps`.\n *\n * @remarks\n * `shallow` only applies to the Pages Router. For the App Router, see the\n * [following documentation](https://nextjs.org/docs/app/building-your-application/routing/linking-and-navigating#using-the-native-history-api).\n *\n * @defaultValue `false`\n *\n * @example\n * ```tsx\n * <Link href=\"/blog\" shallow>\n * Shallow navigation\n * </Link>\n * ```\n */\n shallow?: boolean\n\n /**\n * Forces `Link` to pass its `href` to the child component. Useful if the child is a custom\n * component that wraps an `<a>` tag, or if you're using certain styling libraries.\n *\n * @defaultValue `false`\n *\n * @example\n * ```tsx\n * <Link href=\"/dashboard\" passHref legacyBehavior>\n * <MyStyledAnchor>Dashboard</MyStyledAnchor>\n * </Link>\n * ```\n */\n passHref?: boolean\n\n /**\n * Prefetch the page in the background.\n * Any `<Link />` that is in the viewport (initially or through scroll) will be prefetched.\n * Prefetch can be disabled by passing `prefetch={false}`.\n *\n * @remarks\n * Prefetching is only enabled in production.\n *\n * - In the **App Router**:\n * - `\"auto\"`, `null`, `undefined` (default): Prefetch behavior depends on static vs dynamic routes:\n * - Static routes: fully prefetched\n * - Dynamic routes: partial prefetch to the nearest segment with a `loading.js`\n * - `true`: Always prefetch the full route and data.\n * - `false`: Disable prefetching on both viewport and hover.\n * - In the **Pages Router**:\n * - `true` (default): Prefetches the route and data in the background on viewport or hover.\n * - `false`: Prefetch only on hover, not on viewport.\n *\n * @defaultValue `true` (Pages Router) or `null` (App Router)\n *\n * @example\n * ```tsx\n * <Link href=\"/dashboard\" prefetch={false}>\n * Dashboard\n * </Link>\n * ```\n */\n prefetch?: boolean | 'auto' | null\n\n /**\n * (unstable) Switch to a full prefetch on hover. Effectively the same as\n * updating the prefetch prop to `true` in a mouse event.\n */\n unstable_dynamicOnHover?: boolean\n\n /**\n * The active locale is automatically prepended in the Pages Router. `locale` allows for providing\n * a different locale, or can be set to `false` to opt out of automatic locale behavior.\n *\n * @remarks\n * Note: locale only applies in the Pages Router and is ignored in the App Router.\n *\n * @example\n * ```tsx\n * // Use the 'fr' locale:\n * <Link href=\"/about\" locale=\"fr\">\n * About (French)\n * </Link>\n *\n * // Disable locale prefix:\n * <Link href=\"/about\" locale={false}>\n * About (no locale prefix)\n * </Link>\n * ```\n */\n locale?: string | false\n\n /**\n * Enable legacy link behavior.\n *\n * @deprecated This will be removed in a future version\n * @defaultValue `false`\n * @see https://github.com/vercel/next.js/commit/489e65ed98544e69b0afd7e0cfc3f9f6c2b803b7\n */\n legacyBehavior?: boolean\n\n /**\n * Optional event handler for when the mouse pointer is moved onto the `<Link>`.\n */\n onMouseEnter?: React.MouseEventHandler<HTMLAnchorElement>\n\n /**\n * Optional event handler for when the `<Link>` is touched.\n */\n onTouchStart?: React.TouchEventHandler<HTMLAnchorElement>\n\n /**\n * Optional event handler for when the `<Link>` is clicked.\n */\n onClick?: React.MouseEventHandler<HTMLAnchorElement>\n\n /**\n * Optional event handler for when the `<Link>` is navigated.\n */\n onNavigate?: OnNavigateEventHandler\n\n /**\n * Transition types to apply when navigating. These types are passed to\n * [`React.addTransitionType`](https://react.dev/reference/react/addTransitionType)\n * inside the navigation transition, enabling\n * [`<ViewTransition>`](https://react.dev/reference/react/ViewTransition) components\n * to apply different animations based on the type of navigation.\n *\n * @example\n * ```tsx\n * <Link href=\"/about\" transitionTypes={['slide-in']}>About</Link>\n * ```\n */\n transitionTypes?: string[]\n}\n\n// TODO-APP: Include the full set of Anchor props\n// adding this to the publicly exported type currently breaks existing apps\n\n// `RouteInferType` is a stub here to avoid breaking `typedRoutes` when the type\n// isn't generated yet. It will be replaced when type generation runs.\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport type LinkProps<RouteInferType = any> = InternalLinkProps\ntype LinkPropsRequired = RequiredKeys<LinkProps>\ntype LinkPropsOptional = OptionalKeys<Omit<InternalLinkProps, 'locale'>>\n\nfunction isModifiedEvent(event: React.MouseEvent): boolean {\n const eventTarget = event.currentTarget as HTMLAnchorElement | SVGAElement\n const target = eventTarget.getAttribute('target')\n return (\n (target && target !== '_self') ||\n event.metaKey ||\n event.ctrlKey ||\n event.shiftKey ||\n event.altKey || // triggers resource download\n (event.nativeEvent && event.nativeEvent.which === 2)\n )\n}\n\nfunction linkClicked(\n e: React.MouseEvent,\n href: string,\n linkInstanceRef: React.RefObject<LinkInstance | null>,\n replace?: boolean,\n scroll?: boolean,\n onNavigate?: OnNavigateEventHandler,\n transitionTypes?: string[]\n): void {\n if (typeof window !== 'undefined') {\n const { nodeName } = e.currentTarget\n\n // anchors inside an svg have a lowercase nodeName\n const isAnchorNodeName = nodeName.toUpperCase() === 'A'\n if (\n (isAnchorNodeName && isModifiedEvent(e)) ||\n e.currentTarget.hasAttribute('download')\n ) {\n // ignore click for browser’s default behavior\n return\n }\n\n if (!isLocalURL(href)) {\n if (replace) {\n // browser default behavior does not replace the history state\n // so we need to do it manually\n e.preventDefault()\n location.replace(href)\n }\n\n // ignore click for browser’s default behavior\n return\n }\n\n e.preventDefault()\n\n if (onNavigate) {\n let isDefaultPrevented = false\n\n onNavigate({\n preventDefault: () => {\n isDefaultPrevented = true\n },\n })\n\n if (isDefaultPrevented) {\n return\n }\n }\n\n const { dispatchNavigateAction } =\n require('../components/app-router-instance') as typeof import('../components/app-router-instance')\n\n React.startTransition(() => {\n dispatchNavigateAction(\n href,\n replace ? 'replace' : 'push',\n scroll === false ? ScrollBehavior.NoScroll : ScrollBehavior.Default,\n linkInstanceRef.current,\n transitionTypes\n )\n })\n }\n}\n\nfunction formatStringOrUrl(urlObjOrString: UrlObject | string): string {\n if (typeof urlObjOrString === 'string') {\n return urlObjOrString\n }\n\n return formatUrl(urlObjOrString)\n}\n\n/**\n * A React component that extends the HTML `<a>` element to provide\n * [prefetching](https://nextjs.org/docs/app/building-your-application/routing/linking-and-navigating#2-prefetching)\n * and client-side navigation. This is the primary way to navigate between routes in Next.js.\n *\n * @remarks\n * - Prefetching is only enabled in production.\n *\n * @see https://nextjs.org/docs/app/api-reference/components/link\n */\nexport default function LinkComponent(\n props: LinkProps & {\n children: React.ReactNode\n ref: React.Ref<HTMLAnchorElement>\n }\n) {\n const [linkStatus, setOptimisticLinkStatus] = useOptimistic(IDLE_LINK_STATUS)\n\n let children: React.ReactNode\n\n const linkInstanceRef = useRef<LinkInstance | null>(null)\n\n const {\n href: hrefProp,\n as: asProp,\n children: childrenProp,\n prefetch: prefetchProp = null,\n passHref,\n replace,\n shallow,\n scroll,\n onClick,\n onMouseEnter: onMouseEnterProp,\n onTouchStart: onTouchStartProp,\n legacyBehavior = false,\n onNavigate,\n transitionTypes,\n ref: forwardedRef,\n unstable_dynamicOnHover,\n ...restProps\n } = props\n\n children = childrenProp\n\n if (\n legacyBehavior &&\n (typeof children === 'string' || typeof children === 'number')\n ) {\n children = <a>{children}</a>\n }\n\n const router = React.useContext(AppRouterContext)\n\n const prefetchEnabled = prefetchProp !== false\n\n const fetchStrategy =\n prefetchProp !== false\n ? getFetchStrategyFromPrefetchProp(prefetchProp)\n : // TODO: it makes no sense to assign a fetchStrategy when prefetching is disabled.\n FetchStrategy.PPR\n\n if (process.env.NODE_ENV !== 'production') {\n function createPropError(args: {\n key: string\n expected: string\n actual: string\n }) {\n return new Error(\n `Failed prop type: The prop \\`${args.key}\\` expects a ${args.expected} in \\`<Link>\\`, but got \\`${args.actual}\\` instead.` +\n (typeof window !== 'undefined'\n ? \"\\nOpen your browser's console to view the Component stack trace.\"\n : '')\n )\n }\n\n // TypeScript trick for type-guarding:\n const requiredPropsGuard: Record<LinkPropsRequired, true> = {\n href: true,\n } as const\n const requiredProps: LinkPropsRequired[] = Object.keys(\n requiredPropsGuard\n ) as LinkPropsRequired[]\n requiredProps.forEach((key: LinkPropsRequired) => {\n if (key === 'href') {\n if (\n props[key] == null ||\n (typeof props[key] !== 'string' && typeof props[key] !== 'object')\n ) {\n throw createPropError({\n key,\n expected: '`string` or `object`',\n actual: props[key] === null ? 'null' : typeof props[key],\n })\n }\n } else {\n // TypeScript trick for type-guarding:\n const _: never = key\n }\n })\n\n // TypeScript trick for type-guarding:\n const optionalPropsGuard: Record<LinkPropsOptional, true> = {\n as: true,\n replace: true,\n scroll: true,\n shallow: true,\n passHref: true,\n prefetch: true,\n unstable_dynamicOnHover: true,\n onClick: true,\n onMouseEnter: true,\n onTouchStart: true,\n legacyBehavior: true,\n onNavigate: true,\n transitionTypes: true,\n } as const\n const optionalProps: LinkPropsOptional[] = Object.keys(\n optionalPropsGuard\n ) as LinkPropsOptional[]\n optionalProps.forEach((key: LinkPropsOptional) => {\n const valType = typeof props[key]\n\n if (key === 'as') {\n if (props[key] && valType !== 'string' && valType !== 'object') {\n throw createPropError({\n key,\n expected: '`string` or `object`',\n actual: valType,\n })\n }\n } else if (\n key === 'onClick' ||\n key === 'onMouseEnter' ||\n key === 'onTouchStart' ||\n key === 'onNavigate'\n ) {\n if (props[key] && valType !== 'function') {\n throw createPropError({\n key,\n expected: '`function`',\n actual: valType,\n })\n }\n } else if (\n key === 'replace' ||\n key === 'scroll' ||\n key === 'shallow' ||\n key === 'passHref' ||\n key === 'legacyBehavior' ||\n key === 'unstable_dynamicOnHover'\n ) {\n if (props[key] != null && valType !== 'boolean') {\n throw createPropError({\n key,\n expected: '`boolean`',\n actual: valType,\n })\n }\n } else if (key === 'prefetch') {\n if (\n props[key] != null &&\n valType !== 'boolean' &&\n props[key] !== 'auto'\n ) {\n throw createPropError({\n key,\n expected: '`boolean | \"auto\"`',\n actual: valType,\n })\n }\n } else if (key === 'transitionTypes') {\n if (props[key] != null && !Array.isArray(props[key])) {\n throw createPropError({\n key,\n expected: '`string[]`',\n actual: valType,\n })\n }\n } else {\n // TypeScript trick for type-guarding:\n const _: never = key\n }\n })\n }\n\n const resolvedHref = asProp || hrefProp\n const formattedHref = formatStringOrUrl(resolvedHref)\n\n if (process.env.NODE_ENV !== 'production') {\n if (props.locale) {\n warnOnce(\n 'The `locale` prop is not supported in `next/link` while using the `app` router. Read more about app router internalization: https://nextjs.org/docs/app/building-your-application/routing/internationalization'\n )\n }\n if (!asProp) {\n let href: string | undefined\n if (typeof resolvedHref === 'string') {\n href = resolvedHref\n } else if (\n typeof resolvedHref === 'object' &&\n typeof resolvedHref.pathname === 'string'\n ) {\n href = resolvedHref.pathname\n }\n\n if (href) {\n const hasDynamicSegment = href\n .split('/')\n .some((segment) => segment.startsWith('[') && segment.endsWith(']'))\n\n if (hasDynamicSegment) {\n throw new Error(\n `Dynamic href \\`${href}\\` found in <Link> while using the \\`/app\\` router, this is not supported. Read more: https://nextjs.org/docs/messages/app-dir-dynamic-href`\n )\n }\n }\n }\n }\n\n // This will return the first child, if multiple are provided it will throw an error\n let child: any\n if (legacyBehavior) {\n if ((children as any)?.$$typeof === Symbol.for('react.lazy')) {\n throw new Error(\n `\\`<Link legacyBehavior>\\` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's \\`<a>\\` tag.`\n )\n }\n\n if (process.env.NODE_ENV === 'development') {\n if (onClick) {\n console.warn(\n `\"onClick\" was passed to <Link> with \\`href\\` of \\`${formattedHref}\\` but \"legacyBehavior\" was set. The legacy behavior requires onClick be set on the child of next/link`\n )\n }\n if (onMouseEnterProp) {\n console.warn(\n `\"onMouseEnter\" was passed to <Link> with \\`href\\` of \\`${formattedHref}\\` but \"legacyBehavior\" was set. The legacy behavior requires onMouseEnter be set on the child of next/link`\n )\n }\n try {\n child = React.Children.only(children)\n } catch (err) {\n if (!children) {\n throw new Error(\n `No children were passed to <Link> with \\`href\\` of \\`${formattedHref}\\` but one child is required https://nextjs.org/docs/messages/link-no-children`\n )\n }\n throw new Error(\n `Multiple children were passed to <Link> with \\`href\\` of \\`${formattedHref}\\` but only one child is supported https://nextjs.org/docs/messages/link-multiple-children` +\n (typeof window !== 'undefined'\n ? \" \\nOpen your browser's console to view the Component stack trace.\"\n : '')\n )\n }\n } else {\n child = React.Children.only(children)\n }\n } else {\n if (process.env.NODE_ENV === 'development') {\n if ((children as any)?.type === 'a') {\n throw new Error(\n 'Invalid <Link> with <a> child. Please remove <a> or use <Link legacyBehavior>.\\nLearn more: https://nextjs.org/docs/messages/invalid-new-link-with-extra-anchor'\n )\n }\n }\n }\n\n const childRef: any = legacyBehavior\n ? child && typeof child === 'object' && child.ref\n : forwardedRef\n\n // Use a callback ref to attach an IntersectionObserver to the anchor tag on\n // mount. In the future we will also use this to keep track of all the\n // currently mounted <Link> instances, e.g. so we can re-prefetch them after\n // a revalidation or refresh.\n const observeLinkVisibilityOnMount = React.useCallback(\n (element: HTMLAnchorElement | SVGAElement) => {\n if (router !== null) {\n linkInstanceRef.current = mountLinkInstance(\n element,\n formattedHref,\n router,\n fetchStrategy,\n prefetchEnabled,\n setOptimisticLinkStatus\n )\n }\n\n return () => {\n if (linkInstanceRef.current) {\n unmountLinkForCurrentNavigation(linkInstanceRef.current)\n linkInstanceRef.current = null\n }\n unmountPrefetchableInstance(element)\n }\n },\n [\n prefetchEnabled,\n formattedHref,\n router,\n fetchStrategy,\n setOptimisticLinkStatus,\n ]\n )\n\n const mergedRef = useMergedRef(observeLinkVisibilityOnMount, childRef)\n\n const childProps: {\n onTouchStart?: React.TouchEventHandler<HTMLAnchorElement>\n onMouseEnter: React.MouseEventHandler<HTMLAnchorElement>\n onClick: React.MouseEventHandler<HTMLAnchorElement>\n href?: string\n ref?: any\n } = {\n ref: mergedRef,\n onClick(e) {\n if (process.env.NODE_ENV !== 'production') {\n if (!e) {\n throw new Error(\n `Component rendered inside next/link has to pass click event to \"onClick\" prop.`\n )\n }\n }\n\n if (!legacyBehavior && typeof onClick === 'function') {\n onClick(e)\n }\n\n if (\n legacyBehavior &&\n child.props &&\n typeof child.props.onClick === 'function'\n ) {\n child.props.onClick(e)\n }\n\n if (!router) {\n return\n }\n if (e.defaultPrevented) {\n return\n }\n linkClicked(\n e,\n formattedHref,\n linkInstanceRef,\n replace,\n scroll,\n onNavigate,\n transitionTypes\n )\n },\n onMouseEnter(e) {\n if (!legacyBehavior && typeof onMouseEnterProp === 'function') {\n onMouseEnterProp(e)\n }\n\n if (\n legacyBehavior &&\n child.props &&\n typeof child.props.onMouseEnter === 'function'\n ) {\n child.props.onMouseEnter(e)\n }\n\n if (!router) {\n return\n }\n if (!prefetchEnabled || process.env.NODE_ENV === 'development') {\n return\n }\n\n const upgradeToDynamicPrefetch = unstable_dynamicOnHover === true\n onNavigationIntent(\n e.currentTarget as HTMLAnchorElement | SVGAElement,\n upgradeToDynamicPrefetch\n )\n },\n onTouchStart: process.env.__NEXT_LINK_NO_TOUCH_START\n ? undefined\n : function onTouchStart(e) {\n if (!legacyBehavior && typeof onTouchStartProp === 'function') {\n onTouchStartProp(e)\n }\n\n if (\n legacyBehavior &&\n child.props &&\n typeof child.props.onTouchStart === 'function'\n ) {\n child.props.onTouchStart(e)\n }\n\n if (!router) {\n return\n }\n if (!prefetchEnabled) {\n return\n }\n\n const upgradeToDynamicPrefetch = unstable_dynamicOnHover === true\n onNavigationIntent(\n e.currentTarget as HTMLAnchorElement | SVGAElement,\n upgradeToDynamicPrefetch\n )\n },\n }\n\n // If the url is absolute, we can bypass the logic to prepend the basePath.\n if (isAbsoluteUrl(formattedHref)) {\n childProps.href = formattedHref\n } else if (\n !legacyBehavior ||\n passHref ||\n (child.type === 'a' && !('href' in child.props))\n ) {\n childProps.href = addBasePath(formattedHref)\n }\n\n let link: React.ReactNode\n\n if (legacyBehavior) {\n if (process.env.NODE_ENV === 'development') {\n errorOnce(\n '`legacyBehavior` is deprecated and will be removed in a future ' +\n 'release. A codemod is available to upgrade your components:\\n\\n' +\n 'npx @next/codemod@latest new-link .\\n\\n' +\n 'Learn more: https://nextjs.org/docs/app/building-your-application/upgrading/codemods#remove-a-tags-from-link-components'\n )\n }\n link = React.cloneElement(child, childProps)\n } else {\n link = (\n <a {...restProps} {...childProps}>\n {children}\n </a>\n )\n }\n\n return (\n <LinkStatusContext.Provider value={linkStatus}>\n {link}\n </LinkStatusContext.Provider>\n )\n}\n\nconst LinkStatusContext = createContext<\n typeof PENDING_LINK_STATUS | typeof IDLE_LINK_STATUS\n>(IDLE_LINK_STATUS)\n\nexport const useLinkStatus = () => {\n return useContext(LinkStatusContext)\n}\n\nfunction getFetchStrategyFromPrefetchProp(\n prefetchProp: Exclude<LinkProps['prefetch'], undefined | false>\n): PrefetchTaskFetchStrategy {\n if (process.env.__NEXT_CACHE_COMPONENTS) {\n if (prefetchProp === true) {\n return FetchStrategy.Full\n }\n\n // `null` or `\"auto\"`: this is the default \"auto\" mode, where we will prefetch partially if the link is in the viewport.\n // This will also include invalid prop values that don't match the types specified here.\n // (although those should've been filtered out by prop validation in dev)\n prefetchProp satisfies null | 'auto'\n return FetchStrategy.PPR\n } else {\n return prefetchProp === null || prefetchProp === 'auto'\n ? // We default to PPR, and we'll discover whether or not the route supports it with the initial prefetch.\n FetchStrategy.PPR\n : // In the old implementation without runtime prefetches, `prefetch={true}` forces all dynamic data to be prefetched.\n // To preserve backwards-compatibility, anything other than `false`, `null`, or `\"auto\"` results in a full prefetch.\n // (although invalid values should've been filtered out by prop validation in dev)\n FetchStrategy.Full\n }\n}\n","import type { ComponentProps } from 'react'\nimport ClientLinkComponent, { type LinkProps, useLinkStatus } from './link'\n\nexport default function LinkComponent(\n props: ComponentProps<typeof ClientLinkComponent>\n) {\n const isLegacyBehavior = props.legacyBehavior\n const childIsHostComponent =\n typeof props.children === 'string' ||\n typeof props.children === 'number' ||\n typeof (props.children as any)?.type === 'string'\n const childIsClientComponent =\n (props.children as any)?.type?.$$typeof ===\n Symbol.for('react.client.reference')\n\n if (isLegacyBehavior && !childIsHostComponent && !childIsClientComponent) {\n if ((props.children as any)?.type?.$$typeof === Symbol.for('react.lazy')) {\n console.error(\n `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.`\n )\n } else {\n console.error(\n `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.`\n )\n }\n }\n\n return <ClientLinkComponent {...props} />\n}\n\nexport { type LinkProps, useLinkStatus }\n","import { mkdir, readFile, rename, readdir, stat, unlink, writeFile } from 'node:fs/promises';\nimport { readFileSync, statSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport path from 'node:path';\n\ninterface CodexAuthFile {\n auth_mode?: unknown;\n OPENAI_API_KEY?: unknown;\n tokens?: {\n id_token?: unknown;\n access_token?: unknown;\n refresh_token?: unknown;\n account_id?: unknown;\n };\n last_refresh?: unknown;\n}\n\nexport interface CodexAccountSummary {\n accountId: string;\n label: string;\n email: string | null;\n name: string | null;\n planType: string | null;\n userId: string | null;\n lastRefresh: string | null;\n idTokenExpiresAt: string | null;\n accessTokenExpiresAt: string | null;\n storedAt: string | null;\n isCurrent: boolean;\n}\n\nexport interface CodexAuthPaths {\n authPath?: string;\n storeDir?: string;\n}\n\nexport interface CurrentCodexAccount {\n accountId: string;\n authMtimeMs: number;\n}\n\nconst AUTH_CLAIMS_KEY = 'https://api.openai.com/auth';\n\nfunction defaultAuthPath() {\n return path.join(/* turbopackIgnore: true */ homedir(), '.codex', 'auth.json');\n}\n\nfunction defaultStoreDir() {\n return path.join(/* turbopackIgnore: true */ homedir(), '.codex', 'auth-accounts');\n}\n\nfunction resolvePaths(paths: CodexAuthPaths = {}) {\n return {\n authPath: paths.authPath ?? defaultAuthPath(),\n storeDir: paths.storeDir ?? defaultStoreDir(),\n };\n}\n\nfunction accountPath(accountId: string, storeDir: string) {\n return path.join(/* turbopackIgnore: true */ storeDir, `${accountId.replace(/[^a-zA-Z0-9_-]/g, '_')}.json`);\n}\n\nasync function readAuthFile(filePath: string): Promise<CodexAuthFile> {\n const raw = await readFile(filePath, 'utf8');\n const parsed = JSON.parse(raw) as CodexAuthFile;\n if (!parsed.tokens || typeof parsed.tokens.account_id !== 'string') {\n throw new Error('Codex auth file is missing tokens.account_id');\n }\n return parsed;\n}\n\nasync function writeJsonAtomic(filePath: string, data: unknown) {\n await mkdir(path.dirname(filePath), { recursive: true });\n const tmp = `${filePath}.${process.pid}.${Date.now()}.tmp`;\n await writeFile(tmp, `${JSON.stringify(data, null, 2)}\\n`, { encoding: 'utf8', mode: 0o600 });\n await rename(tmp, filePath);\n}\n\nfunction decodeJwtPayload(token: unknown): Record<string, unknown> | null {\n if (typeof token !== 'string') return null;\n const [, payload] = token.split('.');\n if (!payload) return null;\n\n try {\n return JSON.parse(Buffer.from(payload, 'base64url').toString('utf8')) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nfunction stringClaim(value: unknown): string | null {\n return typeof value === 'string' && value.length > 0 ? value : null;\n}\n\nfunction expiryClaim(value: unknown): string | null {\n return typeof value === 'number' ? new Date(value * 1000).toISOString() : null;\n}\n\nfunction summarizeAuth(auth: CodexAuthFile, storedAt: string | null, currentAccountId: string | null): CodexAccountSummary {\n const accountId = stringClaim(auth.tokens?.account_id);\n if (!accountId) throw new Error('Codex auth file is missing tokens.account_id');\n\n const idPayload = decodeJwtPayload(auth.tokens?.id_token);\n const accessPayload = decodeJwtPayload(auth.tokens?.access_token);\n const idAuthClaims = idPayload?.[AUTH_CLAIMS_KEY] as Record<string, unknown> | undefined;\n const accessAuthClaims = accessPayload?.[AUTH_CLAIMS_KEY] as Record<string, unknown> | undefined;\n\n const email = stringClaim(idPayload?.email);\n const name = stringClaim(idPayload?.name);\n const planType = stringClaim(idAuthClaims?.chatgpt_plan_type) ?? stringClaim(accessAuthClaims?.chatgpt_plan_type);\n const userId = stringClaim(idAuthClaims?.user_id) ?? stringClaim(accessAuthClaims?.user_id);\n const label = email ?? name ?? `${accountId.slice(0, 8)}...${accountId.slice(-4)}`;\n\n return {\n accountId,\n label,\n email,\n name,\n planType,\n userId,\n lastRefresh: stringClaim(auth.last_refresh),\n idTokenExpiresAt: expiryClaim(idPayload?.exp),\n accessTokenExpiresAt: expiryClaim(accessPayload?.exp),\n storedAt,\n isCurrent: accountId === currentAccountId,\n };\n}\n\nexport async function getCodexAccounts(paths: CodexAuthPaths = {}): Promise<CodexAccountSummary[]> {\n const { authPath, storeDir } = resolvePaths(paths);\n let currentAccountId: string | null = null;\n let currentAuth: CodexAuthFile | null = null;\n\n try {\n currentAuth = await readAuthFile(authPath);\n currentAccountId = stringClaim(currentAuth.tokens?.account_id);\n } catch {\n currentAuth = null;\n }\n\n const accounts = new Map<string, CodexAccountSummary>();\n\n try {\n const entries = await readdir(storeDir);\n for (const entry of entries) {\n if (!entry.endsWith('.json')) continue;\n const filePath = path.join(storeDir, entry);\n try {\n const storedAuth = await readAuthFile(filePath);\n const storedStat = await stat(filePath);\n const summary = summarizeAuth(storedAuth, storedStat.mtime.toISOString(), currentAccountId);\n accounts.set(summary.accountId, summary);\n } catch {\n // Ignore malformed account snapshots so one bad file does not break the admin page.\n }\n }\n } catch {\n // Missing store just means no saved accounts yet.\n }\n\n if (currentAuth && currentAccountId && !accounts.has(currentAccountId)) {\n accounts.set(currentAccountId, summarizeAuth(currentAuth, null, currentAccountId));\n }\n\n return [...accounts.values()].sort((a, b) => {\n if (a.isCurrent !== b.isCurrent) return a.isCurrent ? -1 : 1;\n return a.label.localeCompare(b.label);\n });\n}\n\nexport function getCurrentCodexAccount(paths: CodexAuthPaths = {}): CurrentCodexAccount | null {\n const { authPath } = resolvePaths(paths);\n try {\n const auth = JSON.parse(readFileSync(authPath, 'utf8')) as CodexAuthFile;\n const accountId = stringClaim(auth.tokens?.account_id);\n if (!accountId) return null;\n return {\n accountId,\n authMtimeMs: statSync(authPath).mtimeMs,\n };\n } catch {\n return null;\n }\n}\n\nexport async function importCurrentCodexAuth(paths: CodexAuthPaths = {}): Promise<CodexAccountSummary> {\n const { authPath, storeDir } = resolvePaths(paths);\n const auth = await readAuthFile(authPath);\n const accountId = auth.tokens?.account_id as string;\n const destination = accountPath(accountId, storeDir);\n await writeJsonAtomic(destination, auth);\n const storedStat = await stat(destination);\n return summarizeAuth(auth, storedStat.mtime.toISOString(), accountId);\n}\n\nexport async function switchCodexAccount(accountId: string, paths: CodexAuthPaths = {}) {\n const { authPath, storeDir } = resolvePaths(paths);\n const source = accountPath(accountId, storeDir);\n const auth = await readAuthFile(source);\n const sourceAccountId = auth.tokens?.account_id;\n if (sourceAccountId !== accountId) {\n throw new Error('Stored account id does not match requested account');\n }\n\n let backupPath: string | null = null;\n try {\n const current = await readFile(authPath, 'utf8');\n backupPath = `${authPath}.${new Date().toISOString().replace(/[:.]/g, '-')}.bak`;\n await writeFile(backupPath, current, { encoding: 'utf8', mode: 0o600 });\n } catch {\n backupPath = null;\n }\n\n await writeJsonAtomic(authPath, auth);\n return {\n ...summarizeAuth(auth, null, accountId),\n backupPath,\n };\n}\n\nexport async function deleteCodexAccount(accountId: string, paths: CodexAuthPaths = {}) {\n const { authPath, storeDir } = resolvePaths(paths);\n const auth = await readAuthFile(authPath).catch(() => null);\n if (auth?.tokens?.account_id === accountId) {\n throw new Error('Cannot delete the currently active Codex account');\n }\n await unlink(accountPath(accountId, storeDir));\n}\n","import src from \"IMAGE\";\nexport default { src, width: 256, height: 256 }\n","// This file is generated by next-core EcmascriptClientReferenceModule.\nimport { registerClientReference } from \"react-server-dom-turbopack/server\";\nexport const CodexAccountsPanel = registerClientReference(\n function() { throw new Error(\"Attempted to call CodexAccountsPanel() from the server but CodexAccountsPanel is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.\"); },\n \"[project]/src/components/CodexAccountsPanel.tsx\",\n \"CodexAccountsPanel\",\n);\n","export const dynamic = 'force-dynamic';\n\nimport Link from 'next/link';\nimport { CodexAccountsPanel } from '@/components/CodexAccountsPanel';\nimport { getCodexAccounts } from '@/lib/codex-auth';\n\nexport default async function AdminPage() {\n const accounts = await getCodexAccounts();\n\n return (\n <div className=\"min-h-screen bg-zinc-950 text-zinc-100 font-mono\">\n <div className=\"max-w-6xl mx-auto px-6 py-8\">\n <div className=\"mb-6 flex items-start justify-between gap-4\">\n <div>\n <h1 className=\"text-xl font-semibold tracking-tight text-zinc-100\">\n <span className=\"text-violet-400\">Vibe</span>meter Admin\n </h1>\n <p className=\"text-zinc-600 text-xs mt-1\">local Codex account switching · tokens stay on this machine</p>\n </div>\n <Link\n href=\"/\"\n className=\"rounded-md border border-zinc-800 px-3 py-2 text-xs text-zinc-400 transition-colors hover:border-zinc-600 hover:text-zinc-100\"\n >\n Dashboard\n </Link>\n </div>\n\n <CodexAccountsPanel initialAccounts={accounts} />\n </div>\n </div>\n );\n}\n"],"names":["_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","_interop_require_wildcard","obj","__esModule","default","cache","has","get","newObj","__proto__","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","exports","_","createClientModuleProxy","__turbopack_context__","n","LinkComponent","useLinkStatus","isModifiedEvent","event","eventTarget","currentTarget","target","getAttribute","metaKey","ctrlKey","shiftKey","altKey","nativeEvent","which","linkClicked","e","href","linkInstanceRef","replace","scroll","onNavigate","transitionTypes","window","nodeName","isAnchorNodeName","toUpperCase","hasAttribute","isLocalURL","preventDefault","location","isDefaultPrevented","dispatchNavigateAction","require","React","startTransition","ScrollBehavior","NoScroll","Default","current","formatStringOrUrl","urlObjOrString","formatUrl","props","linkStatus","setOptimisticLinkStatus","useOptimistic","IDLE_LINK_STATUS","children","useRef","hrefProp","as","asProp","childrenProp","prefetch","prefetchProp","passHref","shallow","onClick","onMouseEnter","onMouseEnterProp","onTouchStart","onTouchStartProp","legacyBehavior","ref","forwardedRef","unstable_dynamicOnHover","restProps","a","router","useContext","AppRouterContext","prefetchEnabled","fetchStrategy","getFetchStrategyFromPrefetchProp","FetchStrategy","PPR","process","env","NODE_ENV","createPropError","args","Error","expected","actual","requiredPropsGuard","requiredProps","keys","forEach","optionalPropsGuard","optionalProps","valType","Array","isArray","resolvedHref","formattedHref","locale","warnOnce","pathname","hasDynamicSegment","split","some","segment","startsWith","endsWith","child","$$typeof","Symbol","for","console","warn","Children","only","err","type","childRef","observeLinkVisibilityOnMount","useCallback","element","mountLinkInstance","unmountLinkForCurrentNavigation","unmountPrefetchableInstance","mergedRef","useMergedRef","childProps","defaultPrevented","upgradeToDynamicPrefetch","onNavigationIntent","__NEXT_LINK_NO_TOUCH_START","undefined","isAbsoluteUrl","addBasePath","link","errorOnce","cloneElement","LinkStatusContext","Provider","value","createContext","__NEXT_CACHE_COMPONENTS","Full","isLegacyBehavior","childIsHostComponent","childIsClientComponent","error","ClientLinkComponent","AUTH_CLAIMS_KEY","defaultAuthPath","join","defaultStoreDir","resolvePaths","paths","authPath","storeDir","accountPath","accountId","readAuthFile","filePath","raw","parsed","JSON","parse","tokens","account_id","writeJsonAtomic","data","dirname","recursive","tmp","pid","Date","now","stringify","encoding","mode","decodeJwtPayload","token","payload","Buffer","from","toString","stringClaim","length","expiryClaim","toISOString","summarizeAuth","auth","storedAt","currentAccountId","idPayload","id_token","accessPayload","access_token","idAuthClaims","accessAuthClaims","email","name","planType","chatgpt_plan_type","userId","user_id","label","slice","lastRefresh","last_refresh","idTokenExpiresAt","exp","accessTokenExpiresAt","isCurrent","getCodexAccounts","currentAuth","accounts","Map","entries","entry","storedAuth","storedStat","summary","mtime","values","sort","b","localeCompare","getCurrentCodexAccount","authMtimeMs","mtimeMs","importCurrentCodexAuth","destination","switchCodexAccount","source","sourceAccountId","backupPath","deleteCodexAccount","catch","src","width","height","CodexAccountsPanel","dynamic","AdminPage","className","initialAccounts"],"mappings":"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","ignoreList":[0,1,3,6]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../node_modules/next/src/server/route-modules/app-page/module.compiled.js","../../../../node_modules/next/src/server/route-modules/app-page/vendored/ssr/react-jsx-runtime.ts","../../../../node_modules/next/src/server/route-modules/app-page/vendored/ssr/react.ts","../../../../node_modules/next/src/server/route-modules/app-page/vendored/contexts/app-router-context.ts","../../../../node_modules/next/src/server/route-modules/app-page/vendored/ssr/react-server-dom-turbopack-client.ts","../../../../node_modules/next/src/server/route-modules/app-page/vendored/contexts/hooks-client-context.ts","../../../../node_modules/next/src/server/route-modules/app-page/vendored/contexts/server-inserted-html.ts","../../../../node_modules/%40swc/helpers/cjs/_interop_require_default.cjs","../../../../node_modules/next/src/client/components/handle-isr-error.tsx","../../../../node_modules/next/src/client/components/builtin/error-styles.tsx","../../../../node_modules/next/src/client/components/builtin/global-error.tsx"],"sourcesContent":["if (process.env.NEXT_RUNTIME === 'edge') {\n module.exports = require('next/dist/server/route-modules/app-page/module.js')\n} else {\n if (process.env.__NEXT_EXPERIMENTAL_REACT) {\n if (process.env.NODE_ENV === 'development') {\n if (process.env.TURBOPACK) {\n module.exports = require('next/dist/compiled/next-server/app-page-turbo-experimental.runtime.dev.js')\n } else {\n module.exports = require('next/dist/compiled/next-server/app-page-experimental.runtime.dev.js')\n }\n } else {\n if (process.env.TURBOPACK) {\n module.exports = require('next/dist/compiled/next-server/app-page-turbo-experimental.runtime.prod.js')\n } else {\n module.exports = require('next/dist/compiled/next-server/app-page-experimental.runtime.prod.js')\n }\n }\n } else {\n if (process.env.NODE_ENV === 'development') {\n if (process.env.TURBOPACK) {\n module.exports = require('next/dist/compiled/next-server/app-page-turbo.runtime.dev.js')\n } else {\n module.exports = require('next/dist/compiled/next-server/app-page.runtime.dev.js')\n }\n } else {\n if (process.env.TURBOPACK) {\n module.exports = require('next/dist/compiled/next-server/app-page-turbo.runtime.prod.js')\n } else {\n module.exports = require('next/dist/compiled/next-server/app-page.runtime.prod.js')\n }\n }\n }\n}\n","module.exports = (\n require('../../module.compiled') as typeof import('../../module.compiled')\n).vendored['react-ssr']!.ReactJsxRuntime\n","module.exports = (\n require('../../module.compiled') as typeof import('../../module.compiled')\n).vendored['react-ssr']!.React\n","module.exports = (\n require('../../module.compiled') as typeof import('../../module.compiled')\n).vendored['contexts'].AppRouterContext\n","module.exports = (\n require('../../module.compiled') as typeof import('../../module.compiled')\n).vendored['react-ssr']!.ReactServerDOMTurbopackClient\n","module.exports = (\n require('../../module.compiled') as typeof import('../../module.compiled')\n).vendored['contexts'].HooksClientContext\n","module.exports = (\n require('../../module.compiled') as typeof import('../../module.compiled')\n).vendored['contexts'].ServerInsertedHtml\n","\"use strict\";\n\nfunction _interop_require_default(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n}\nexports._ = _interop_require_default;\n","const workAsyncStorage =\n typeof window === 'undefined'\n ? (\n require('../../server/app-render/work-async-storage.external') as typeof import('../../server/app-render/work-async-storage.external')\n ).workAsyncStorage\n : undefined\n\n// if we are revalidating we want to re-throw the error so the\n// function crashes so we can maintain our previous cache\n// instead of caching the error page\nexport function handleISRError({ error }: { error: any }) {\n if (workAsyncStorage) {\n const store = workAsyncStorage.getStore()\n if (store?.isStaticGeneration) {\n if (error) {\n console.error(error)\n }\n throw error\n }\n }\n}\n","import React from 'react'\n\nexport const errorStyles = {\n container: {\n fontFamily:\n 'system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"',\n height: '100vh',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n card: {\n marginTop: '-32px',\n maxWidth: '325px',\n padding: '32px 28px',\n textAlign: 'left' as const,\n },\n icon: {\n marginBottom: '24px',\n },\n title: {\n fontSize: '24px',\n fontWeight: 500,\n letterSpacing: '-0.02em',\n lineHeight: '32px',\n margin: '0 0 12px 0',\n color: 'var(--next-error-title)',\n },\n message: {\n fontSize: '14px',\n fontWeight: 400,\n lineHeight: '21px',\n margin: '0 0 20px 0',\n color: 'var(--next-error-message)',\n },\n form: {\n margin: 0,\n },\n buttonGroup: {\n display: 'flex',\n gap: '8px',\n alignItems: 'center',\n },\n button: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '32px',\n padding: '0 12px',\n fontSize: '14px',\n fontWeight: 500,\n lineHeight: '20px',\n borderRadius: '6px',\n cursor: 'pointer',\n color: 'var(--next-error-btn-text)',\n background: 'var(--next-error-btn-bg)',\n border: 'var(--next-error-btn-border)',\n },\n buttonSecondary: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '32px',\n padding: '0 12px',\n fontSize: '14px',\n fontWeight: 500,\n lineHeight: '20px',\n borderRadius: '6px',\n cursor: 'pointer',\n color: 'var(--next-error-btn-secondary-text)',\n background: 'var(--next-error-btn-secondary-bg)',\n border: 'var(--next-error-btn-secondary-border)',\n },\n digestFooter: {\n position: 'fixed' as const,\n bottom: '32px',\n left: '0',\n right: '0',\n textAlign: 'center' as const,\n fontFamily:\n 'ui-monospace,SFMono-Regular,\"SF Mono\",Menlo,Consolas,monospace',\n fontSize: '12px',\n lineHeight: '18px',\n fontWeight: 400,\n margin: '0',\n color: 'var(--next-error-digest)',\n },\n} as const\n\nexport const errorThemeCss = `\n:root {\n --next-error-bg: #fff;\n --next-error-text: #171717;\n --next-error-title: #171717;\n --next-error-message: #171717;\n --next-error-digest: #666666;\n --next-error-btn-text: #fff;\n --next-error-btn-bg: #171717;\n --next-error-btn-border: none;\n --next-error-btn-secondary-text: #171717;\n --next-error-btn-secondary-bg: transparent;\n --next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);\n}\n@media (prefers-color-scheme: dark) {\n :root {\n --next-error-bg: #0a0a0a;\n --next-error-text: #ededed;\n --next-error-title: #ededed;\n --next-error-message: #ededed;\n --next-error-digest: #a0a0a0;\n --next-error-btn-text: #0a0a0a;\n --next-error-btn-bg: #ededed;\n --next-error-btn-border: none;\n --next-error-btn-secondary-text: #ededed;\n --next-error-btn-secondary-bg: transparent;\n --next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);\n }\n}\nbody { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\n`.replace(/\\n\\s*/g, '')\n\nexport function WarningIcon() {\n return (\n <svg\n width=\"32\"\n height=\"32\"\n viewBox=\"-0.2 -1.5 32 32\"\n fill=\"none\"\n style={errorStyles.icon}\n >\n <path\n d=\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\"\n fill=\"var(--next-error-title)\"\n />\n </svg>\n )\n}\n","'use client'\n\nimport React from 'react'\nimport { handleISRError } from '../handle-isr-error'\nimport { errorStyles, errorThemeCss, WarningIcon } from './error-styles'\n\nexport type GlobalErrorComponent = React.ComponentType<{\n error: any\n reset: () => void\n unstable_retry: () => void\n}>\n\nfunction DefaultGlobalError({ error }: { error: any }) {\n const digest: string | undefined = error?.digest\n const isServerError = !!digest\n\n const message = isServerError\n ? 'A server error occurred. Reload to try again.'\n : 'Reload to try again, or go back.'\n\n handleISRError({ error })\n\n return (\n <html id=\"__next_error__\">\n <head>\n <style dangerouslySetInnerHTML={{ __html: errorThemeCss }} />\n </head>\n <body>\n <div style={errorStyles.container}>\n <div style={errorStyles.card}>\n <WarningIcon />\n <h1 style={errorStyles.title}>This page couldn&#x2019;t load</h1>\n <p style={errorStyles.message}>{message}</p>\n <div style={errorStyles.buttonGroup}>\n <form style={errorStyles.form}>\n <button type=\"submit\" style={errorStyles.button}>\n Reload\n </button>\n </form>\n {!isServerError && (\n <button\n type=\"button\"\n style={errorStyles.buttonSecondary}\n onClick={() => {\n if (window.history.length > 1) {\n window.history.back()\n } else {\n window.location.href = '/'\n }\n }}\n >\n Back\n </button>\n )}\n </div>\n </div>\n </div>\n {digest && <p style={errorStyles.digestFooter}>ERROR {digest}</p>}\n </body>\n </html>\n )\n}\n\n// Exported so that the import signature in the loaders can be identical to user\n// supplied custom global error signatures.\nexport default DefaultGlobalError\n"],"names":["process","env","NEXT_RUNTIME","module","exports","require","__NEXT_EXPERIMENTAL_REACT","NODE_ENV","TURBOPACK","vendored","ReactJsxRuntime","React","AppRouterContext","ReactServerDOMTurbopackClient","HooksClientContext","ServerInsertedHtml","_interop_require_default","obj","__esModule","default","_","handleISRError","workAsyncStorage","window","undefined","error","store","getStore","isStaticGeneration","console","WarningIcon","errorStyles","errorThemeCss","container","fontFamily","height","display","alignItems","justifyContent","card","marginTop","maxWidth","padding","textAlign","icon","marginBottom","title","fontSize","fontWeight","letterSpacing","lineHeight","margin","color","message","form","buttonGroup","gap","button","borderRadius","cursor","background","border","buttonSecondary","digestFooter","position","bottom","left","right","replace","svg","width","viewBox","fill","style","path","d","DefaultGlobalError","digest","isServerError","html","id","head","dangerouslySetInnerHTML","__html","body","div","h1","p","type","onClick","history","length","back","location","href"],"mappings":"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","ignoreList":[0,1,2,3,4,5,6,7,8,9,10]}