tokentracker-cli 0.88.4 → 0.88.5

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 (97) hide show
  1. package/dashboard/dist/assets/{AchievementBadge-Csic_vIr.js → AchievementBadge-BwA7jTi0.js} +1 -1
  2. package/dashboard/dist/assets/{AchievementsPage-Bj8-7V5r.js → AchievementsPage-DXxsvwVX.js} +2 -2
  3. package/dashboard/dist/assets/{AchievementsSection-BbLQ8ObS.js → AchievementsSection-BjtoMD0l.js} +1 -1
  4. package/dashboard/dist/assets/{BadgeDetailModal-CktuQUom.js → BadgeDetailModal-DLQ0vQsp.js} +1 -1
  5. package/dashboard/dist/assets/{Card-BsnJyykU.js → Card-DyzEgcah.js} +1 -1
  6. package/dashboard/dist/assets/{ClawdAnimated-GnYPAQFN.js → ClawdAnimated-CFqKYrQD.js} +1 -1
  7. package/dashboard/dist/assets/{CommandPalette-DrWnJlji.js → CommandPalette-C0hnaAiC.js} +1 -1
  8. package/dashboard/dist/assets/{CommunityStatsModal-mPp8Nj1_.js → CommunityStatsModal-CkT8e5A_.js} +1 -1
  9. package/dashboard/dist/assets/{ConfirmModal-CdiGbXgr.js → ConfirmModal-CNgB03kI.js} +1 -1
  10. package/dashboard/dist/assets/{Controls-D4-f2iHj.js → Controls-DbUsLnx1.js} +1 -1
  11. package/dashboard/dist/assets/{DashboardPage-CE_9OMmz.js → DashboardPage-CHk4QUs0.js} +1 -1
  12. package/dashboard/dist/assets/{DevicePage-DkpC0tYF.js → DevicePage-DutY0nCU.js} +1 -1
  13. package/dashboard/dist/assets/{DialogClose-DL5Ge3vy.js → DialogClose-CSLpyzHr.js} +1 -1
  14. package/dashboard/dist/assets/DialogDescription-DZliagFg.js +1 -0
  15. package/dashboard/dist/assets/{DialogTitle-a72XNy3h.js → DialogTitle-CU0DrIQb.js} +1 -1
  16. package/dashboard/dist/assets/{FadeIn-CXF6KnAl.js → FadeIn-Drk10vEk.js} +1 -1
  17. package/dashboard/dist/assets/{HeaderGithubStar-3fhsfDPh.js → HeaderGithubStar-6MBhnUjH.js} +1 -1
  18. package/dashboard/dist/assets/{HoverTooltip-CZynal8F.js → HoverTooltip-scdepNr_.js} +1 -1
  19. package/dashboard/dist/assets/{IpCheckPage-DQNGk8Iw.js → IpCheckPage-BpseXtk3.js} +1 -1
  20. package/dashboard/dist/assets/{LandingPage-tpbUiUVp.js → LandingPage-CoYVfYbz.js} +2 -2
  21. package/dashboard/dist/assets/{LeaderboardAvatar-BGhnxPC9.js → LeaderboardAvatar-EuvTK23U.js} +1 -1
  22. package/dashboard/dist/assets/{LeaderboardPage-CNrPikYA.js → LeaderboardPage-BhiuafFm.js} +2 -2
  23. package/dashboard/dist/assets/{LeaderboardProfileModal-Cm2RQVyR.js → LeaderboardProfileModal-DXFyF8kH.js} +3 -3
  24. package/dashboard/dist/assets/{LeaderboardProfilePage-C4Qq1ODW.js → LeaderboardProfilePage-BYNNp2uv.js} +1 -1
  25. package/dashboard/dist/assets/{LimitsPage-SAVDG9xp.js → LimitsPage-cZWHDYE8.js} +4 -4
  26. package/dashboard/dist/assets/{LocalOnlyNotice-UBbsxcyy.js → LocalOnlyNotice-BWpGvI0H.js} +1 -1
  27. package/dashboard/dist/assets/{LoginCard-DXThtBOR.js → LoginCard-DgY-avZX.js} +1 -1
  28. package/dashboard/dist/assets/{LoginModal-Bj18MQXk.js → LoginModal-CvCGCwNR.js} +1 -1
  29. package/dashboard/dist/assets/{LoginPage-CP7QGY9J.js → LoginPage-iniAaych.js} +1 -1
  30. package/dashboard/dist/assets/{PetPage-Buw8keHU.js → PetPage-vGfqy28a.js} +1 -1
  31. package/dashboard/dist/assets/{PopoverPopup-d6QSW6r8.js → PopoverPopup-8x9t9gD4.js} +1 -1
  32. package/dashboard/dist/assets/{ProviderIcon-C6TKxRjA.js → ProviderIcon-BWkcPxs4.js} +1 -1
  33. package/dashboard/dist/assets/{ResetPasswordPage-DaZ6msb-.js → ResetPasswordPage-N9l0zdxc.js} +1 -1
  34. package/dashboard/dist/assets/{SegmentedControl--As7fVZG.js → SegmentedControl-DrEbXe7M.js} +1 -1
  35. package/dashboard/dist/assets/{Select-gAHmbQVe.js → Select-8nxnFfns.js} +1 -1
  36. package/dashboard/dist/assets/{SelectItemText-D7o_b5jT.js → SelectItemText-D-pVcs50.js} +1 -1
  37. package/dashboard/dist/assets/{ServiceStatusPage-BWIKVm4j.js → ServiceStatusPage-Yfs-MN1n.js} +1 -1
  38. package/dashboard/dist/assets/{SessionsPage-WHHzFEuH.js → SessionsPage-CFLLOabH.js} +1 -1
  39. package/dashboard/dist/assets/{SettingsPage-BE3_VLR_.js → SettingsPage-CHSgqFdF.js} +1 -1
  40. package/dashboard/dist/assets/{SkillsPage-BsYIlkSY.js → SkillsPage-BD5RT5eb.js} +1 -1
  41. package/dashboard/dist/assets/{TokenGalaxy-BaNIstdH.js → TokenGalaxy-De4JZnzi.js} +1 -1
  42. package/dashboard/dist/assets/{ToolbarRootContext-BNJ2Z9HN.js → ToolbarRootContext-DM-WFqY6.js} +1 -1
  43. package/dashboard/dist/assets/{TrendMonitor-BSpIKlQL.js → TrendMonitor-DpSvoA86.js} +1 -1
  44. package/dashboard/dist/assets/{WidgetsPage-CyCRnjXL.js → WidgetsPage-D33E-kD4.js} +1 -1
  45. package/dashboard/dist/assets/{WrappedPage-LMvmYNjg.js → WrappedPage-CjqchIRC.js} +1 -1
  46. package/dashboard/dist/assets/{__vite-browser-external-DI5qs5FY.js → __vite-browser-external-CJKqcpDH.js} +2 -2
  47. package/dashboard/dist/assets/{agent-logos-B0O7qAHK.js → agent-logos-CEuH8m2p.js} +1 -1
  48. package/dashboard/dist/assets/{arrow-up-right-6MT52kJv.js → arrow-up-right-UeW7i2I9.js} +1 -1
  49. package/dashboard/dist/assets/{check-CTQhrFRB.js → check-BEWd6UpN.js} +1 -1
  50. package/dashboard/dist/assets/{chevron-right-LwZmdJ7a.js → chevron-right-WF-BGKcD.js} +1 -1
  51. package/dashboard/dist/assets/{copy-nZ-6jaE3.js → copy-BIsDzDWe.js} +1 -1
  52. package/dashboard/dist/assets/{download-c3uFmIK0.js → download-D5IMcY87.js} +1 -1
  53. package/dashboard/dist/assets/{external-link-CCJOfX3E.js → external-link-DlymDAT1.js} +1 -1
  54. package/dashboard/dist/assets/{flame-D7Ez_wqn.js → flame-Coo1IlXx.js} +1 -1
  55. package/dashboard/dist/assets/{format-tokens-DUBO4Quh.js → format-tokens-71YneamJ.js} +1 -1
  56. package/dashboard/dist/assets/{icons-DAf7jSIB.js → icons-C-KFwLuS.js} +1 -1
  57. package/dashboard/dist/assets/{index-Be_boVBV.js → index-DZLIheW-.js} +1 -1
  58. package/dashboard/dist/assets/{index-BEf7nkK6.js → index-Os1o_T4l.js} +1 -1
  59. package/dashboard/dist/assets/{index-vD2QNDMX.js → index-OwlsZ-D0.js} +1 -1
  60. package/dashboard/dist/assets/{info-BIvzEWn6.js → info-JYfDozdx.js} +1 -1
  61. package/dashboard/dist/assets/{limits-providers-BFZHEUL_.js → limits-providers-CRgPyf-x.js} +1 -1
  62. package/dashboard/dist/assets/{link-2-DpZ3uiWE.js → link-2-CdJhL0K2.js} +1 -1
  63. package/dashboard/dist/assets/{loader-circle-vJlwHgvB.js → loader-circle-cVisHw3G.js} +1 -1
  64. package/dashboard/dist/assets/{maximize-2-q695kaqF.js → maximize-2-GoRVXObs.js} +1 -1
  65. package/dashboard/dist/assets/{modifiers.esm-BkMtvHXh.js → modifiers.esm-ojj_Qc0M.js} +1 -1
  66. package/dashboard/dist/assets/{monitor-smartphone--Xl0796r.js → monitor-smartphone-3_sFTPdn.js} +1 -1
  67. package/dashboard/dist/assets/{provider-display-DRo2F9U_.js → provider-display-DTwJBj-L.js} +1 -1
  68. package/dashboard/dist/assets/{react-BAsgR4jK.js → react-BHsz7M69.js} +1 -1
  69. package/dashboard/dist/assets/{search-CNt7Qya4.js → search-DMRWVfdt.js} +1 -1
  70. package/dashboard/dist/assets/{skills-api-D8sn6UHC.js → skills-api-DXQbySbF.js} +1 -1
  71. package/dashboard/dist/assets/{sortable.esm-Dywv8f48.js → sortable.esm-D0uuKRuC.js} +1 -1
  72. package/dashboard/dist/assets/{store-DyEcgahO.js → store-peMgm1Ye.js} +1 -1
  73. package/dashboard/dist/assets/{terminal-BeIdaCjX.js → terminal-7OYQbwhF.js} +1 -1
  74. package/dashboard/dist/assets/{trash-2-BPDXx1_u.js → trash-2-C4iKjhsk.js} +1 -1
  75. package/dashboard/dist/assets/{use-community-stats-novDCOb_.js → use-community-stats-furP_fZV.js} +1 -1
  76. package/dashboard/dist/assets/{use-limits-display-prefs-CuwI8eqz.js → use-limits-display-prefs-BYFhDgc5.js} +1 -1
  77. package/dashboard/dist/assets/{use-ordered-list-BrIAsQBD.js → use-ordered-list-DX5hOerp.js} +1 -1
  78. package/dashboard/dist/assets/use-reduced-motion-TCgQmfAJ.js +1 -0
  79. package/dashboard/dist/assets/{use-session-efficiency-pref-B0F887Me.js → use-session-efficiency-pref-DfZjbzAF.js} +1 -1
  80. package/dashboard/dist/assets/{use-transform-DBrPvZ0r.js → use-transform-BRDsFC1X.js} +1 -1
  81. package/dashboard/dist/assets/use-usage-limits-CVWHqcA_.js +1 -0
  82. package/dashboard/dist/assets/{useCurrency-BQDWxg9L.js → useCurrency-BPhEg_fN.js} +1 -1
  83. package/dashboard/dist/assets/{useScrollLock-CiuoV-_x.js → useScrollLock-DXsFDMbK.js} +1 -1
  84. package/dashboard/dist/assets/{useTokenFormat-C7El4Ch8.js → useTokenFormat-DufvECQn.js} +1 -1
  85. package/dashboard/dist/assets/{zap-CIkFdzq5.js → zap-CZpfMecN.js} +1 -1
  86. package/dashboard/dist/brand-logos/qoder-cn.svg +1 -1
  87. package/dashboard/dist/index.html +1 -1
  88. package/dashboard/dist/ip-check.html +1 -1
  89. package/dashboard/dist/leaderboard.html +1 -1
  90. package/dashboard/dist/share.html +1 -1
  91. package/package.json +1 -1
  92. package/src/lib/pricing/matcher.js +5 -1
  93. package/src/lib/pricing/seed-snapshot.json +1 -1
  94. package/src/lib/usage-limits.js +17 -5
  95. package/dashboard/dist/assets/DialogDescription-BwXM9NYu.js +0 -1
  96. package/dashboard/dist/assets/use-reduced-motion-uAu4ee7b.js +0 -1
  97. package/dashboard/dist/assets/use-usage-limits-CS9CLXuQ.js +0 -1
@@ -83,13 +83,17 @@ function toFiniteNumberOrNull(value) {
83
83
  return Number.isFinite(n) ? n : null;
84
84
  }
85
85
 
86
- function buildWindow({ usedPercent, resetAt }) {
86
+ function buildWindow({ usedPercent, resetAt, windowSeconds = null }) {
87
87
  const pct = clampPercent(usedPercent);
88
88
  if (pct === null) return null;
89
- return {
89
+ const window = {
90
90
  used_percent: pct,
91
91
  reset_at: typeof resetAt === "string" && resetAt ? resetAt : null,
92
92
  };
93
+ if (Number.isFinite(windowSeconds) && windowSeconds > 0) {
94
+ window.limit_window_seconds = windowSeconds;
95
+ }
96
+ return window;
93
97
  }
94
98
 
95
99
  function decodeJwtPayload(token) {
@@ -578,7 +582,15 @@ function normalizeCursorUsageSummary(body) {
578
582
  const plan = body?.individualUsage?.plan || null;
579
583
  const indOnDemand = body?.individualUsage?.onDemand || null;
580
584
  const teamOnDemand = body?.teamUsage?.onDemand || null;
585
+ const billingCycleStart = typeof body?.billingCycleStart === "string" ? body.billingCycleStart : null;
581
586
  const billingCycleEnd = typeof body?.billingCycleEnd === "string" ? body.billingCycleEnd : null;
587
+ const billingCycleStartMs = Date.parse(billingCycleStart || "");
588
+ const billingCycleEndMs = Date.parse(billingCycleEnd || "");
589
+ const billingCycleSeconds = Number.isFinite(billingCycleStartMs)
590
+ && Number.isFinite(billingCycleEndMs)
591
+ && billingCycleEndMs > billingCycleStartMs
592
+ ? Math.round((billingCycleEndMs - billingCycleStartMs) / 1000)
593
+ : null;
582
594
  const autoPercent = clampPercent(plan?.autoPercentUsed);
583
595
  const apiPercent = clampPercent(plan?.apiPercentUsed);
584
596
 
@@ -631,9 +643,9 @@ function normalizeCursorUsageSummary(body) {
631
643
 
632
644
  return {
633
645
  membership_type: typeof body?.membershipType === "string" ? body.membershipType : null,
634
- primary_window: buildWindow({ usedPercent: planPercent, resetAt: billingCycleEnd }),
635
- secondary_window: buildWindow({ usedPercent: autoPercent, resetAt: billingCycleEnd }),
636
- tertiary_window: buildWindow({ usedPercent: apiPercent, resetAt: billingCycleEnd }),
646
+ primary_window: buildWindow({ usedPercent: planPercent, resetAt: billingCycleEnd, windowSeconds: billingCycleSeconds }),
647
+ secondary_window: buildWindow({ usedPercent: autoPercent, resetAt: billingCycleEnd, windowSeconds: billingCycleSeconds }),
648
+ tertiary_window: buildWindow({ usedPercent: apiPercent, resetAt: billingCycleEnd, windowSeconds: billingCycleSeconds }),
637
649
  };
638
650
  }
639
651
 
@@ -1 +0,0 @@
1
- import{r as n,z as a}from"./__vite-browser-external-DI5qs5FY.js";import{u as p}from"./DialogTitle-a72XNy3h.js";import{u as c}from"./useScrollLock-CiuoV-_x.js";const x=n.forwardRef(function(e,r){const{render:l,className:u,style:m,id:s,...t}=e,{store:i}=p(),o=c(s);return i.useSyncedValueWithCleanup("descriptionElementId",o),a("p",e,{ref:r,props:[{id:o},t]})});export{x as D};
@@ -1 +0,0 @@
1
- import{r as o}from"./__vite-browser-external-DI5qs5FY.js";import{h as r,i as t,p as s}from"./react-BAsgR4jK.js";function i(){!r.current&&t();const[e]=o.useState(s.current);return e}export{i as u};
@@ -1 +0,0 @@
1
- import{q as b,ag as v,r as w,c as g,ah as x,ai as F,aj as _}from"./__vite-browser-external-DI5qs5FY.js";import{l as M}from"./limits-providers-BFZHEUL_.js";const S="native:notificationPermission";let E=null;function N(){return typeof window<"u"&&!!window.chrome?.webview}function K(){return b()?E||"unknown":N()?"granted":typeof Notification>"u"?"unsupported":Notification.permission}function L(e){if(typeof window>"u")return()=>{};const i=t=>{const a=t?.detail?.status;typeof a=="string"&&(E=a),e(K())};return window.addEventListener(S,i),e(K()),b()&&v({type:"getNotificationStatus"}),()=>window.removeEventListener(S,i)}async function I(){if(b()){v({type:"requestNotificationPermission"});return}N()||typeof Notification<"u"&&Notification.permission==="default"&&await Notification.requestPermission().catch(()=>"denied")}const p="tt.limitAlerts.enabled";function O(){try{return window.localStorage.getItem(p)==="1"}catch{return!1}}function U(){const[e,i]=w.useState(O),[t,a]=w.useState("unknown");w.useEffect(()=>L(a),[]);const y=w.useCallback(async n=>{const l=!!n;l&&await I();try{window.localStorage.setItem(p,l?"1":"0")}catch{}i(l)},[]);return{enabled:e,setEnabled:y,permissionBlocked:t==="denied"}}function A(e,i){if(!(e>0))return null;const t=(e-i)/e;return Number.isFinite(t)?Math.min(Math.max(t,0),1):null}function z(e,i,t=.03){return e>i+t}function D(e){const i=Math.max(0,Math.floor(e)),t=Math.floor(i/3600);return t>24?`${Math.floor(t/24)}d`:t>0?`${t}h`:`${Math.floor(i/60)}m`}function j(e,i){if(typeof e.windowSeconds=="number")return e.windowSeconds;if(e.windowSecondsField&&i){const t=i[e.windowSecondsField];return typeof t=="number"&&t>0?t:null}return null}function q(e){return e==null?NaN:typeof e=="number"?e*1e3:Date.parse(e)}function C({usedPercent:e,windowSeconds:i,resetMs:t,mode:a,now:y=Date.now()}){const n=Math.min(Math.max(Number(e)||0,0),100)/100,l={pacePercent:null,paceOver:!1,expectedPercent:null,runsOutEta:null,projectedEnd:null};if(!(i>0)||!Number.isFinite(t))return l;const r=Math.max(0,(t-y)/1e3),s=A(i,r);if(s==null)return l;if(l.expectedPercent=Math.round(s*100),l.paceOver=z(n,s),n>=.05){const u=a==="remaining"?1-s:s;l.pacePercent=u*100}if(s>.02&&n>0){const u=i*s,c=n/u,m=n/s;m>=1&&c>0?l.runsOutEta=D((1-n)/c):l.projectedEnd=Math.round(Math.min(m,1)*100)}return l}const R={claude:{windows(e){const i=Array.isArray(e.weekly_scoped)?e.weekly_scoped.map(t=>({key:`scoped-${t.label}`,label:t.label,window:t,pctField:"utilization",resetField:"resets_at",windowSeconds:604800})):[];return[{key:"5h",labelKey:"limits.label.claude_5h",window:e.five_hour,pctField:"utilization",resetField:"resets_at",windowSeconds:5*3600},{key:"7d",labelKey:"limits.label.claude_7d",window:e.seven_day,pctField:"utilization",resetField:"resets_at",windowSeconds:7*86400},{key:"opus",labelKey:"limits.label.claude_opus",window:e.seven_day_opus,pctField:"utilization",resetField:"resets_at",windowSeconds:7*86400},...i]}},codex:{extra:"codex_meta",windows(e){return[{key:"5h",labelKey:"limits.label.codex_5h",window:e.primary_window,windowSecondsField:"limit_window_seconds"},{key:"7d",labelKey:"limits.label.codex_7d",window:e.secondary_window,windowSecondsField:"limit_window_seconds"},{key:"credits",labelKey:"limits.label.codex_credits",window:e.credit_window},{key:"spark-5h",labelKey:"limits.label.codex_spark_5h",window:e.spark_primary_window,windowSecondsField:"limit_window_seconds"},{key:"spark-7d",labelKey:"limits.label.codex_spark_7d",window:e.spark_secondary_window,windowSecondsField:"limit_window_seconds"}]}},cursor:{windows(e){return[{key:"plan",labelKey:"limits.label.cursor_plan",window:e.primary_window},{key:"auto",labelKey:"limits.label.cursor_auto",window:e.secondary_window},{key:"api",labelKey:"limits.label.cursor_api",window:e.tertiary_window}]}},gemini:{windows(e){return[{key:"pro",labelKey:"limits.label.gemini_pro",window:e.primary_window},{key:"flash",labelKey:"limits.label.gemini_flash",window:e.secondary_window},{key:"lite",labelKey:"limits.label.gemini_lite",window:e.tertiary_window}]}},kimi:{extra:"kimi_parallel",windows(e){return[{key:"weekly",labelKey:"limits.label.kimi_weekly",window:e.primary_window,windowSeconds:7*86400},{key:"5h",labelKey:"limits.label.kimi_5h",window:e.secondary_window,windowSeconds:5*3600},{key:"total",labelKey:"limits.label.kimi_total",window:e.tertiary_window}]}},kiro:{extra:"kiro_credits",windows(e){return[{key:"month",labelKey:"limits.label.kiro_month",window:e.primary_window},{key:"bonus",labelKey:"limits.label.kiro_bonus",window:e.secondary_window}]}},grok:{windows(e){const i=typeof e.period_type=="string"?e.period_type:null,t=i==="weekly"?"limits.label.grok_week":i==="daily"?"limits.label.grok_day":"limits.label.grok_month",a=i==="weekly"?7*86400:i==="daily"?86400:void 0;return[{key:i==="weekly"?"week":i==="daily"?"day":"month",labelKey:t,window:e.primary_window,windowSeconds:a},{key:"ondemand",labelKey:"limits.label.grok_ondemand",window:e.secondary_window}]}},antigravity:{windows(e){return[{key:"claude-weekly",labelKey:"limits.label.antigravity_claude_weekly",window:e.primary_window},{key:"claude-5h",labelKey:"limits.label.antigravity_claude_5h",window:e.secondary_window},{key:"gemini-weekly",labelKey:"limits.label.antigravity_gemini_weekly",window:e.tertiary_window},{key:"gemini-5h",labelKey:"limits.label.antigravity_gemini_5h",window:e.quaternary_window}]}},copilot:{extra:"copilot_otel",windows(e){return[{key:"premium",labelKey:"limits.label.copilot_premium",window:e.primary_window},{key:"chat",labelKey:"limits.label.copilot_chat",window:e.secondary_window}]}},zcode:{windows(e){return e.plan_kind==="coding-plan"?[{key:"5h",labelKey:"limits.label.zcode_5h",window:e.primary_window},{key:"weekly",labelKey:"limits.label.zcode_weekly",window:e.secondary_window},{key:"tools",labelKey:"limits.label.zcode_tools",window:e.tertiary_window}]:[{key:"glm52",labelKey:"limits.label.zcode_glm52",window:e.primary_window},{key:"glm5t",labelKey:"limits.label.zcode_glm5t",window:e.secondary_window}]}},opencodeGo:{windows(e){return[{key:"5h",labelKey:"limits.label.opencode_go_5h",window:e.primary_window},{key:"weekly",labelKey:"limits.label.opencode_go_weekly",window:e.secondary_window},{key:"monthly",labelKey:"limits.label.opencode_go_monthly",window:e.tertiary_window}]}},qoder:{windows(e){return[{key:"credits",labelKey:"limits.label.qoder_credits",window:e.primary_window},{key:"ultimate",labelKey:"limits.label.qoder_ultimate",window:e.secondary_window,timeKind:"expiry"}]}},qoderCn:{windows(e){return[{key:"credits",labelKey:"limits.label.qoder_cn_credits",window:e.primary_window},{key:"ultimate",labelKey:"limits.label.qoder_cn_ultimate",window:e.secondary_window,timeKind:"expiry"}]}}},P="tt.limitAlerts.cycles.v1";function T(){try{return JSON.parse(window.localStorage.getItem(P)||"{}")}catch{return{}}}function $(e){try{window.localStorage.setItem(P,JSON.stringify(e))}catch{}}function B(e,{now:i=Date.now()}={}){const t=[],a=R;for(const[y,n]of Object.entries(e||{})){const l=a[y];if(!(!n?.configured||n.error||!l))for(const r of l.windows(n)){if(!r.window)continue;const s=Number(r.pctField==="utilization"?r.window.utilization:r.window.used_percent),u=r.resetField==="resets_at"?r.window.resets_at:r.window.reset_at,c=q(u),m=C({usedPercent:s,windowSeconds:j(r,r.window),resetMs:c,mode:"used",now:i});!m.runsOutEta||!m.paceOver||s<20||!(c>i)||t.push({id:`${y}:${r.key}:${c}`,providerId:y,windowKey:r.key,resetMs:c,usedPercent:s,runsOutEta:m.runsOutEta})}}return t}function V(e){const i=T(),t=B(e);for(const n of t){if(i[n.id])continue;const l=M(n.providerId),r=g("limits.alert.title",{provider:l}),s=g("limits.alert.body",{eta:n.runsOutEta,percent:Math.round(n.usedPercent)});let u=x({title:r,body:s,id:n.id});!u&&typeof Notification<"u"&&Notification.permission==="granted"&&(new Notification(r,{body:s,tag:n.id}),u=!0),u&&(i[n.id]=Date.now())}const a=Date.now()-864e5,y=Object.fromEntries(Object.entries(i).filter(([n,l])=>{const r=Number(n.split(":").at(-1));return Number.isFinite(r)?r>=a:Number(l)>=a}).slice(-100));return $(y),t.length}function W(e){const i=!!e?.initialState,[t,a]=w.useState(()=>i?e?.initialState?.data??null:null),[y,n]=w.useState(()=>i?e?.initialState?.error??null:null),[l,r]=w.useState(!i),s=!!e?.initialRefresh,u=!!e?.publishToPreloadCache;w.useEffect(()=>{if(!(!t||typeof window>"u"))try{window.localStorage.getItem(p)==="1"&&V(t)}catch{}},[t]);const c=w.useCallback((o,d)=>{!u||!o||typeof o!="object"||F(o,{source:d})},[u]),m=w.useCallback(async()=>{try{const o=await _({refresh:!0}),d=o&&typeof o=="object"?o:null;a(d),n(null),c(d,"manual-refresh")}catch(o){n(o?.message||String(o))}},[c]),k=w.useCallback(async()=>{try{const o=await _(),d=o&&typeof o=="object"?o:null;a(d),n(null),c(d,"page-load")}catch(o){n(o?.message||String(o))}},[c]);return w.useEffect(()=>{if(typeof window>"u"||typeof document>"u")return;const o=15e3;let d=Date.now();const f=()=>{if(document.visibilityState!=="visible")return;const h=Date.now();h-d<o||(d=h,k())};return window.addEventListener("focus",f),document.addEventListener("visibilitychange",f),()=>{window.removeEventListener("focus",f),document.removeEventListener("visibilitychange",f)}},[k]),w.useEffect(()=>{if(i&&!s)return;let o=!1;return(async()=>{try{const d=await _();if(o)return;const f=d&&typeof d=="object"?d:null;a(f),n(null),c(f,"page-load")}catch(d){if(o)return;n(d?.message||String(d))}finally{o||r(!1)}})(),()=>{o=!0}},[i,s,c]),{data:t,error:y,isLoading:l,refresh:m}}export{R as P,j as a,U as b,C as c,q as r,V as s,W as u};