tokentracker-cli 0.40.0 → 0.42.0

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 (118) hide show
  1. package/README.ja.md +2 -1
  2. package/README.ko.md +2 -1
  3. package/README.md +1 -0
  4. package/README.zh-CN.md +2 -1
  5. package/dashboard/dist/assets/{ActivityHeatmap-D0gkN1RW.js → ActivityHeatmap-CImSj13A.js} +1 -1
  6. package/dashboard/dist/assets/{Card-DgaNailB.js → Card-DpjFlMHF.js} +1 -1
  7. package/dashboard/dist/assets/DashboardPage-CZkSRYE8.js +19 -0
  8. package/dashboard/dist/assets/{DevicePage-WxD3UOS4.js → DevicePage-BIBlmBPl.js} +1 -1
  9. package/dashboard/dist/assets/DialogTitle-BMKzpys0.js +1 -0
  10. package/dashboard/dist/assets/{FadeIn-CIowr92k.js → FadeIn-B5-cy4YN.js} +1 -1
  11. package/dashboard/dist/assets/{HeaderGithubStar-BG7mHinn.js → HeaderGithubStar-BM-sbvJG.js} +1 -1
  12. package/dashboard/dist/assets/{IpCheckPage-BEf8N-sD.js → IpCheckPage-C7-NXbFK.js} +4 -4
  13. package/dashboard/dist/assets/LandingPage-ouOFlABY.js +4411 -0
  14. package/dashboard/dist/assets/{LeaderboardAvatar-tq8LphKG.js → LeaderboardAvatar-DMXPtCkx.js} +1 -1
  15. package/dashboard/dist/assets/{LeaderboardPage-DeeyHMbP.js → LeaderboardPage-CC4CFYAe.js} +3 -3
  16. package/dashboard/dist/assets/{LeaderboardProfileModal-Dj5nnKZq.js → LeaderboardProfileModal-D-ncIr24.js} +2 -2
  17. package/dashboard/dist/assets/LeaderboardProfilePage-DtDMfVuQ.js +421 -0
  18. package/dashboard/dist/assets/LimitsPage-qaD7Reti.js +2 -0
  19. package/dashboard/dist/assets/{LocalOnlyNotice-DDvq44QO.js → LocalOnlyNotice-BCy18fW4.js} +1 -1
  20. package/dashboard/dist/assets/{LoginPage-BaOQo7cY.js → LoginPage-BLPY2ZI-.js} +1 -1
  21. package/dashboard/dist/assets/PopoverPopup-CpIlpO0j.js +1 -0
  22. package/dashboard/dist/assets/Select-BOxMknxo.js +1 -0
  23. package/dashboard/dist/assets/SelectItemText-B0SL3Wb5.js +1 -0
  24. package/dashboard/dist/assets/SettingsPage-De7GbtPf.js +1 -0
  25. package/dashboard/dist/assets/SkillsPage-jpoYzUBQ.js +1 -0
  26. package/dashboard/dist/assets/WidgetsPage-BaEYiZZH.js +1 -0
  27. package/dashboard/dist/assets/{WrappedPage-DHiRPuq6.js → WrappedPage-BYhKuiTb.js} +1 -1
  28. package/dashboard/dist/assets/agent-logos-DSQgCNll.js +1 -0
  29. package/dashboard/dist/assets/{arrow-up-right-CEarB9tV.js → arrow-up-right-Brwh94cN.js} +1 -1
  30. package/dashboard/dist/assets/{download-Bh0gjfze.js → download-kFiot71R.js} +1 -1
  31. package/dashboard/dist/assets/geist-mono-cyrillic-400-normal-CeA7eGSt.woff +0 -0
  32. package/dashboard/dist/assets/geist-mono-cyrillic-400-normal-DoshcOXv.woff2 +0 -0
  33. package/dashboard/dist/assets/geist-mono-cyrillic-500-normal-BgLpzsdg.woff +0 -0
  34. package/dashboard/dist/assets/geist-mono-cyrillic-500-normal-BkE2O7RC.woff2 +0 -0
  35. package/dashboard/dist/assets/geist-mono-cyrillic-700-normal-4t7P5rT3.woff2 +0 -0
  36. package/dashboard/dist/assets/geist-mono-cyrillic-700-normal-DpJKySxv.woff +0 -0
  37. package/dashboard/dist/assets/geist-mono-cyrillic-900-normal-CVPizhN4.woff2 +0 -0
  38. package/dashboard/dist/assets/geist-mono-cyrillic-900-normal-DDpyx8f0.woff +0 -0
  39. package/dashboard/dist/assets/geist-mono-latin-400-normal-BXAprPdR.woff +0 -0
  40. package/dashboard/dist/assets/geist-mono-latin-400-normal-DKaoCDn5.woff2 +0 -0
  41. package/dashboard/dist/assets/geist-mono-latin-500-normal-C3sF8Y1B.woff2 +0 -0
  42. package/dashboard/dist/assets/geist-mono-latin-500-normal-YfPbDI_o.woff +0 -0
  43. package/dashboard/dist/assets/geist-mono-latin-700-normal-CzSaXH83.woff +0 -0
  44. package/dashboard/dist/assets/geist-mono-latin-700-normal-DMoeyBRY.woff2 +0 -0
  45. package/dashboard/dist/assets/geist-mono-latin-900-normal-DAGlevET.woff +0 -0
  46. package/dashboard/dist/assets/geist-mono-latin-900-normal-DVg4HgZN.woff2 +0 -0
  47. package/dashboard/dist/assets/geist-mono-latin-ext-400-normal-C1xxG8eb.woff2 +0 -0
  48. package/dashboard/dist/assets/geist-mono-latin-ext-400-normal-a1APXIwD.woff +0 -0
  49. package/dashboard/dist/assets/geist-mono-latin-ext-500-normal-CDyCFkgU.woff2 +0 -0
  50. package/dashboard/dist/assets/geist-mono-latin-ext-500-normal-CzSM7th5.woff +0 -0
  51. package/dashboard/dist/assets/geist-mono-latin-ext-700-normal-BG1muzu_.woff2 +0 -0
  52. package/dashboard/dist/assets/geist-mono-latin-ext-700-normal-BmQm3zK6.woff +0 -0
  53. package/dashboard/dist/assets/geist-mono-latin-ext-900-normal-DvYIGD1f.woff2 +0 -0
  54. package/dashboard/dist/assets/geist-mono-latin-ext-900-normal-LB8u5xx5.woff +0 -0
  55. package/dashboard/dist/assets/geist-mono-symbols2-400-normal-B5fXMCGq.woff +0 -0
  56. package/dashboard/dist/assets/geist-mono-symbols2-500-normal-BYvOiszX.woff +0 -0
  57. package/dashboard/dist/assets/geist-mono-symbols2-700-normal-nLp0AmIG.woff +0 -0
  58. package/dashboard/dist/assets/geist-mono-symbols2-900-normal-DPuoOkkO.woff +0 -0
  59. package/dashboard/dist/assets/geist-mono-vietnamese-400-normal-CyOwoevh.woff +0 -0
  60. package/dashboard/dist/assets/geist-mono-vietnamese-500-normal-Do_laDd2.woff +0 -0
  61. package/dashboard/dist/assets/geist-mono-vietnamese-700-normal-DKtT8o3X.woff +0 -0
  62. package/dashboard/dist/assets/geist-mono-vietnamese-900-normal-BAZIExb_.woff +0 -0
  63. package/dashboard/dist/assets/{info-BVM2oiQP.js → info-CGx4zWQF.js} +1 -1
  64. package/dashboard/dist/assets/main-9Ze1SUIZ.js +995 -0
  65. package/dashboard/dist/assets/main-DMJJVAOH.css +1 -0
  66. package/dashboard/dist/assets/use-limits-display-prefs-Ehri95OP.js +1 -0
  67. package/dashboard/dist/assets/{use-native-settings-BoIA6w2j.js → use-native-settings-BWqG5RDr.js} +1 -1
  68. package/dashboard/dist/assets/{use-usage-limits-Co8ywhqF.js → use-usage-limits-2ZxmPfoP.js} +1 -1
  69. package/dashboard/dist/assets/{useCurrency-CuLnDPms.js → useCurrency-DQmyhw3i.js} +1 -1
  70. package/dashboard/dist/assets/useScrollLock-BcLeWqWK.js +1 -0
  71. package/dashboard/dist/index.html +2 -2
  72. package/dashboard/dist/share.html +2 -2
  73. package/package.json +3 -3
  74. package/src/lib/grok-limits.js +184 -0
  75. package/src/lib/local-api.js +63 -0
  76. package/src/lib/pricing/seed-snapshot.json +1 -1
  77. package/src/lib/rollout.js +47 -29
  78. package/src/lib/usage-limits.js +6 -1
  79. package/dashboard/dist/assets/DashboardPage-CV_vq3RD.js +0 -19
  80. package/dashboard/dist/assets/DialogTitle-HpCbbWQz.js +0 -1
  81. package/dashboard/dist/assets/LandingPage-DWhpEISl.js +0 -4356
  82. package/dashboard/dist/assets/LeaderboardProfilePage-BMJyZxKC.js +0 -1
  83. package/dashboard/dist/assets/LimitsPage-DV6egWEj.js +0 -2
  84. package/dashboard/dist/assets/PopoverPopup-BhquCaxW.js +0 -1
  85. package/dashboard/dist/assets/Select-BBsxYIty.js +0 -1
  86. package/dashboard/dist/assets/SelectItemText-DV94Rvfw.js +0 -1
  87. package/dashboard/dist/assets/SettingsPage-D6kfA65g.js +0 -1
  88. package/dashboard/dist/assets/SkillsPage-BxzsmE10.js +0 -1
  89. package/dashboard/dist/assets/WidgetsPage-CtYs9AGI.js +0 -1
  90. package/dashboard/dist/assets/agent-logos-CKVvzLb1.js +0 -1
  91. package/dashboard/dist/assets/geist-mono-cyrillic-400-normal-BPBWmzPh.woff +0 -0
  92. package/dashboard/dist/assets/geist-mono-cyrillic-400-normal-Ce5q_31Z.woff2 +0 -0
  93. package/dashboard/dist/assets/geist-mono-cyrillic-500-normal-CJBLNVQT.woff2 +0 -0
  94. package/dashboard/dist/assets/geist-mono-cyrillic-500-normal-mNhfPmgl.woff +0 -0
  95. package/dashboard/dist/assets/geist-mono-cyrillic-700-normal-DH5Q319x.woff +0 -0
  96. package/dashboard/dist/assets/geist-mono-cyrillic-700-normal-VCNRadI3.woff2 +0 -0
  97. package/dashboard/dist/assets/geist-mono-cyrillic-900-normal-BKC3PZkM.woff +0 -0
  98. package/dashboard/dist/assets/geist-mono-cyrillic-900-normal-DdrQ8KBw.woff2 +0 -0
  99. package/dashboard/dist/assets/geist-mono-latin-400-normal-CoULgQGM.woff +0 -0
  100. package/dashboard/dist/assets/geist-mono-latin-400-normal-LC9RFr9I.woff2 +0 -0
  101. package/dashboard/dist/assets/geist-mono-latin-500-normal-D3o2eNa9.woff2 +0 -0
  102. package/dashboard/dist/assets/geist-mono-latin-500-normal-DOxI7kZ4.woff +0 -0
  103. package/dashboard/dist/assets/geist-mono-latin-700-normal-D6izGJRP.woff2 +0 -0
  104. package/dashboard/dist/assets/geist-mono-latin-700-normal-QGw08Lff.woff +0 -0
  105. package/dashboard/dist/assets/geist-mono-latin-900-normal-CmoKXrdK.woff +0 -0
  106. package/dashboard/dist/assets/geist-mono-latin-900-normal-Cu5MFKsu.woff2 +0 -0
  107. package/dashboard/dist/assets/geist-mono-latin-ext-400-normal-Cgks_Qgx.woff2 +0 -0
  108. package/dashboard/dist/assets/geist-mono-latin-ext-400-normal-CxNRRMGd.woff +0 -0
  109. package/dashboard/dist/assets/geist-mono-latin-ext-500-normal-CQcGuCNt.woff2 +0 -0
  110. package/dashboard/dist/assets/geist-mono-latin-ext-500-normal-diTenJ8L.woff +0 -0
  111. package/dashboard/dist/assets/geist-mono-latin-ext-700-normal-BX9f1BHp.woff +0 -0
  112. package/dashboard/dist/assets/geist-mono-latin-ext-700-normal-YOllDaLV.woff2 +0 -0
  113. package/dashboard/dist/assets/geist-mono-latin-ext-900-normal-Br6WNUGb.woff +0 -0
  114. package/dashboard/dist/assets/geist-mono-latin-ext-900-normal-CrmBTzU2.woff2 +0 -0
  115. package/dashboard/dist/assets/main-BMyBoVLI.css +0 -1
  116. package/dashboard/dist/assets/main-CPiNtuB_.js +0 -971
  117. package/dashboard/dist/assets/use-limits-display-prefs-kAa9p8ua.js +0 -1
  118. package/dashboard/dist/assets/useOpenInteractionType-CAJUA73r.js +0 -12
@@ -0,0 +1 @@
1
+ import{c as _t,b5 as St,b3 as G,b6 as Tt,bD as D,d9 as vt,cz as Ot,j as Te,cF as ze,r as f,bB as U,cH as ot,da as Bt,b7 as ct,bA as Ae,c5 as Gt,cG as it,db as wt,bF as x,bE as xe,c0 as Ee,dc as $e,dd as le,cL as ae,bJ as C,bK as Kt,d3 as Ct,cX as Dt,cY as Xt,d6 as xt,c6 as Vt,bX as ut,bS as lt,bU as Ut,de as $t,cM as qt,bG as Re,bW as jt,c_ as zt,b as Me,bP as Jt,df as Je,ba as We,dg as Qt,dh as He,bM as Zt,di as en,bz as Ne,bN as tn,cE as nn,bC as Ce,cv as _e,cu as rn,dj as sn,cs as on,bL as cn,dk as un,bQ as Se,dl as ye,be as ln,b9 as Be,dm as an,dn as at,d0 as fn,cA as Qe}from"./main-9Ze1SUIZ.js";const dn=[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]],jn=_t("check",dn);function Ie(e,t,n=!0){return e.filter(s=>s.parentId===t).flatMap(s=>[...!n||s.context?.open?[s]:[],...Ie(e,s.id,n)])}function ft(e,t){let n=[],r=e.find(s=>s.id===t)?.parentId;for(;r;){const s=e.find(c=>c.id===r);r=s?.parentId,s&&(n=n.concat(s))}return n}function Ge(e){const t=St(pn,e).current;return t.next=e,G(t.effect),t}function pn(e){const t={current:e,next:e,effect:()=>{t.current=t.next}};return t}let Fe=0;function Ke(e,t={}){const{preventScroll:n=!1,sync:r=!1,shouldFocus:s}=t;cancelAnimationFrame(Fe);function c(){s&&!s()||e?.focus({preventScroll:n})}if(r)return c(),Tt;const o=requestAnimationFrame(c);return Fe=o,()=>{Fe===o&&(cancelAnimationFrame(o),Fe=0)}}const De={inert:new WeakMap,"aria-hidden":new WeakMap},dt="data-base-ui-inert",qe={inert:new WeakSet,"aria-hidden":new WeakSet};let we=new WeakMap,Xe=0;function gn(e){return qe[e]}function It(e){return e?vt(e)?e.host:It(e.parentNode):null}const Ve=(e,t)=>t.map(n=>{if(e.contains(n))return n;const r=It(n);return e.contains(r)?r:null}).filter(n=>n!=null),pt=e=>{const t=new Set;return e.forEach(n=>{let r=n;for(;r&&!t.has(r);)t.add(r),r=r.parentNode}),t},gt=(e,t,n)=>{const r=[],s=c=>{!c||n.has(c)||Array.from(c.children).forEach(o=>{Ot(o)!=="script"&&(t.has(o)?s(o):r.push(o))})};return s(e),r};function hn(e,t,n,r,{mark:s=!0,markerIgnoreElements:c=[]}){const o=r?"inert":n?"aria-hidden":null;let u=null,v=null;const M=Ve(t,e),O=s?Ve(t,c):[],A=new Set(O),z=s?gt(t,pt(M),new Set(M)).filter(m=>!A.has(m)):[],w=[],k=[];if(o){const m=De[o],y=gn(o);v=y,u=m;const b=Ve(t,Array.from(t.querySelectorAll("[aria-live]"))),E=M.concat(b);gt(t,pt(E),new Set(E)).forEach(N=>{const Y=N.getAttribute(o),J=Y!==null&&Y!=="false",I=(m.get(N)||0)+1;m.set(N,I),w.push(N),I===1&&J&&y.add(N),J||N.setAttribute(o,o==="inert"?"":"true")})}return s&&z.forEach(m=>{const y=(we.get(m)||0)+1;we.set(m,y),k.push(m),y===1&&m.setAttribute(dt,"")}),Xe+=1,()=>{u&&w.forEach(m=>{const b=(u.get(m)||0)-1;u.set(m,b),b||(!v?.has(m)&&o&&m.removeAttribute(o),v?.delete(m))}),s&&k.forEach(m=>{const y=(we.get(m)||0)-1;we.set(m,y),y||m.removeAttribute(dt)}),Xe-=1,Xe||(De.inert=new WeakMap,De["aria-hidden"]=new WeakMap,qe.inert=new WeakSet,qe["aria-hidden"]=new WeakSet,we=new WeakMap)}}function ht(e,t={}){const{ariaHidden:n=!1,inert:r=!1,mark:s=!0,markerIgnoreElements:c=[]}=t,o=D(e[0]).body;return hn(e,o,n,r,{mark:s,markerIgnoreElements:c})}function kt(){const e=new Map;return{emit(t,n){e.get(t)?.forEach(r=>r(n))},on(t,n){e.has(t)||e.set(t,new Set),e.get(t).add(n)},off(t,n){e.get(t)?.delete(n)}}}class mn{nodesRef={current:[]};events=kt();addNode(t){this.nodesRef.current.push(t)}removeNode(t){const n=this.nodesRef.current.findIndex(r=>r===t);n!==-1&&this.nodesRef.current.splice(n,1)}}const Pt=f.createContext(null),Ft=f.createContext(null),Ze=()=>f.useContext(Pt)?.id||null,et=e=>{const t=f.useContext(Ft);return e??t};function zn(e){const t=ze(),n=et(e),r=Ze();return G(()=>{if(!t)return;const s={id:t,parentId:r};return n?.addNode(s),()=>{n?.removeNode(s)}},[n,t,r]),t}function Jn(e){const{children:t,id:n}=e,r=Ze();return Te.jsx(Pt.Provider,{value:f.useMemo(()=>({id:n,parentId:r}),[n,r]),children:t})}function Qn(e){const{children:t,externalTree:n}=e,r=St(()=>n??new mn).current;return Te.jsx(Ft.Provider,{value:r,children:t})}function bn(e,t){const n=We(Re(e));return e instanceof n.KeyboardEvent?"keyboard":e instanceof n.FocusEvent?t||"keyboard":"pointerType"in e?e.pointerType||"keyboard":"touches"in e?"touch":e instanceof n.MouseEvent?t||(e.detail===0?"keyboard":"mouse"):""}const mt=20;let fe=[];function tt(){fe=fe.filter(e=>e.deref()?.isConnected)}function En(e){tt(),e&&Ot(e)!=="body"&&(fe.push(new WeakRef(e)),fe.length>mt&&(fe=fe.slice(-mt)))}function Ue(){return tt(),fe[fe.length-1]?.deref()}function yn(e){return e?Je(e)?e:wt(e)[0]||e:null}function bt(e,t){if(e.hasAttribute("tabindex")&&!e.hasAttribute("data-tabindex")||!t.current.includes("floating")&&!e.getAttribute("role")?.includes("dialog"))return;const r=Qt(e).filter(c=>{const o=c.getAttribute("data-tabindex")||"";return Je(c)||c.hasAttribute("data-tabindex")&&!o.startsWith("-")}),s=e.getAttribute("tabindex");t.current.includes("floating")||r.length===0?s!=="0"&&e.setAttribute("tabindex","0"):(s!=="-1"||e.hasAttribute("data-tabindex")&&e.getAttribute("data-tabindex")!=="-1")&&(e.setAttribute("tabindex","-1"),e.setAttribute("data-tabindex","-1"))}function Zn(e){const{context:t,children:n,disabled:r=!1,initialFocus:s=!0,returnFocus:c=!0,restoreFocus:o=!1,modal:u=!0,closeOnFocusOut:v=!0,openInteractionType:M="",nextFocusableElement:O,previousFocusableElement:A,beforeContentFocusGuardRef:z,externalTree:w,getInsideElements:k}=e,m="rootStore"in t?t.rootStore:t,y=m.useState("open"),b=m.useState("domReferenceElement"),E=m.useState("floatingElement"),{events:Z,dataRef:N}=m.context,Y=U(()=>N.current.floatingContext?.nodeId),J=s===!1,I=ot(b)&&J,ee=f.useRef(["content"]),se=Ge(s),P=Ge(c),ie=Ge(M),j=et(w),p=Bt(),$=f.useRef(!1),Q=f.useRef(!1),de=f.useRef(!1),oe=f.useRef(null),te=f.useRef(""),pe=f.useRef(""),ge=f.useRef(null),he=f.useRef(null),ke=ct(ge,z,p?.beforeInsideRef),R=ct(he,p?.afterInsideRef),q=Ae(),ce=Ae(),me=Gt(),Pe=p!=null,g=it(E),K=U((a=g)=>a?wt(a):[]),ne=U(()=>k?.().filter(a=>a!=null)??[]);f.useEffect(()=>{if(r||!u)return;function a(H){H.key==="Tab"&&C(g,ae(D(g)))&&K().length===0&&!I&&qt(H)}const W=D(g);return x(W,"keydown",a)},[r,g,u,I,K]),f.useEffect(()=>{if(r||!y)return;const a=D(g);function W(){de.current=!1}function H(S){const h=Re(S),F=ne(),d=C(E,h)||C(b,h)||C(p?.portalNode,h)||F.some(_=>_===h||C(_,h));de.current=!d,pe.current=S.pointerType||"keyboard",h?.closest(`[${jt}]`)&&(Q.current=!0)}function L(){pe.current="keyboard"}return xe(x(a,"pointerdown",H,!0),x(a,"pointerup",W,!0),x(a,"pointercancel",W,!0),x(a,"keydown",L,!0))},[r,E,b,g,y,p,ne]),f.useEffect(()=>{if(r||!v)return;const a=D(g);function W(){Q.current=!0,ce.start(0,()=>{Q.current=!1})}function H(F){const d=Re(F);Je(d)&&(oe.current=d)}function L(F){const d=F.relatedTarget,_=F.currentTarget,X=Re(F);queueMicrotask(()=>{const be=Y(),V=m.context.triggerElements,Le=ne(),i=d?.hasAttribute($e("focus-guard"))&&[ge.current,he.current,p?.beforeInsideRef.current,p?.afterInsideRef.current,p?.beforeOutsideRef.current,p?.afterOutsideRef.current,le(A),le(O)].includes(d),l=!(C(b,d)||C(E,d)||C(d,E)||C(p?.portalNode,d)||Le.some(T=>T===d||C(T,d))||d!=null&&V.hasElement(d)||V.hasMatchingElement(T=>C(T,d))||i||j&&(Ie(j.nodesRef.current,be).find(T=>C(T.context?.elements.floating,d)||C(T.context?.elements.domReference,d))||ft(j.nodesRef.current,be).find(T=>[T.context?.elements.floating,it(T.context?.elements.floating)].includes(d)||T.context?.elements.domReference===d)));if(_===b&&g&&bt(g,ee),o&&_!==b&&!zt(X)&&ae(a)===a.body){if(Ee(g)&&(g.focus(),o==="popup")){me.request(()=>{g.focus()});return}const T=K(),B=oe.current,ue=(B&&T.includes(B)?B:null)||T[T.length-1]||g;Ee(ue)&&ue.focus()}if(N.current.insideReactTree){N.current.insideReactTree=!1;return}(I||!u)&&d&&l&&!Q.current&&(I||d!==Ue())&&($.current=!0,m.setOpen(!1,Me(Jt,F)))})}function S(){de.current||(N.current.insideReactTree=!0,q.start(0,()=>{N.current.insideReactTree=!1}))}const h=Ee(b)?b:null;if(!(!E&&!h))return xe(h&&x(h,"focusout",L),h&&x(h,"pointerdown",W),E&&x(E,"focusin",H),E&&x(E,"focusout",L),E&&p&&x(E,"focusout",S,!0))},[r,b,E,g,u,j,p,m,v,o,K,I,Y,ee,N,q,ce,me,O,A,ne]),f.useEffect(()=>{if(r||!E||!y)return;const a=Array.from(p?.portalNode?.querySelectorAll(`[${$e("portal")}]`)||[]),H=(j?ft(j.nodesRef.current,Y()):[]).find(_=>ot(_.context?.elements.domReference||null))?.context?.elements.domReference,S=[...[E,...a,ge.current,he.current,p?.beforeOutsideRef.current,p?.afterOutsideRef.current,...ne()],H,le(A),le(O),I?b:null].filter(_=>_!=null),h=ht(S,{ariaHidden:u||I,mark:!1}),F=[E,...a].filter(_=>_!=null),d=ht(F);return()=>{d(),h()}},[y,r,b,E,u,p,I,j,Y,O,A,ne]),G(()=>{if(!y||r||!Ee(g))return;const a=D(g),W=ae(a);queueMicrotask(()=>{const H=se.current,L=typeof H=="function"?H(ie.current||""):H;if(L===void 0||L===!1||C(g,W))return;let h=null;const F=()=>(h==null&&(h=K(g)),h[0]||g);let d;L===!0||L===null?d=F():d=le(L),d=d||F();const _=C(g,ae(a));Ke(d,{preventScroll:d===g,shouldFocus(){if(_)return!0;const X=ae(a);return!(X!==d&&C(g,X))}})})},[r,y,g,K,se,ie]),G(()=>{if(r||!g)return;const a=D(g),W=ae(a);En(W);function H(S){if(S.open||(te.current=bn(S.nativeEvent,pe.current)),S.reason===Kt&&S.nativeEvent.type==="mouseleave"&&($.current=!0),S.reason===Ct)if(S.nested)$.current=!1;else if(Dt(S.nativeEvent)||Xt(S.nativeEvent))$.current=!1;else{let h=!1;D(g).createElement("div").focus({get preventScroll(){return h=!0,!1}}),h?$.current=!1:$.current=!0}}Z.on("openchange",H);function L(){const S=P.current;let h=typeof S=="function"?S(te.current):S;if(h===void 0||h===!1)return null;if(h===null&&(h=!0),typeof h=="boolean")return b?.isConnected?b:Ue()||null;const F=b?.isConnected?b:Ue();return le(h)||F||null}return()=>{Z.off("openchange",H);const S=ae(a),h=ne(),F=C(E,S)||h.some(X=>X===S||C(X,S))||j&&Ie(j.nodesRef.current,Y(),!1).some(X=>C(X.context?.elements.floating,S)),d=P.current,_=L();queueMicrotask(()=>{const X=yn(_),be=typeof d!="boolean";d&&!$.current&&Ee(X)&&(!(!be&&X!==S&&S!==a.body)||F)&&X.focus({preventScroll:!0}),$.current=!1})}},[r,E,g,P,Z,j,b,Y,ne]),G(()=>{if(!xt||y||!E)return;const a=ae(D(E));!Ee(a)||!Vt(a)||C(E,a)&&a.blur()},[y,E]),G(()=>{if(!(r||!p))return p.setFocusManagerState({modal:u,closeOnFocusOut:v,open:y,onOpenChange:m.setOpen,domReference:b}),()=>{p.setFocusManagerState(null)}},[r,p,u,y,m,v,b]),G(()=>{if(!(r||!g))return bt(g,ee),()=>{queueMicrotask(tt)}},[r,g,ee]);const ve=!r&&(u?!I:!0)&&(Pe||u);return Te.jsxs(f.Fragment,{children:[ve&&Te.jsx(ut,{"data-type":"inside",ref:ke,onFocus:a=>{if(u){const W=K();Ke(W[W.length-1])}else p?.portalNode&&($.current=!1,lt(a,p.portalNode)?Ut(b)?.focus():le(A??p.beforeOutsideRef)?.focus())}}),n,ve&&Te.jsx(ut,{"data-type":"inside",ref:R,onFocus:a=>{u?Ke(K()[0]):p?.portalNode&&(v&&($.current=!0),lt(a,p.portalNode)?$t(b)?.focus():le(O??p.afterOutsideRef)?.focus())}})]})}const Rn={intentional:"onClick",sloppy:"onPointerDown"};function Sn(){return!1}function Tn(e){return{escapeKey:typeof e=="boolean"?e:e?.escapeKey??!1,outsidePress:typeof e=="boolean"?e:e?.outsidePress??!0}}function er(e,t={}){const{enabled:n=!0,escapeKey:r=!0,outsidePress:s=!0,outsidePressEvent:c="sloppy",referencePress:o=Sn,referencePressEvent:u="sloppy",bubbles:v,externalTree:M}=t,O="rootStore"in e?e.rootStore:e,A=O.useState("open"),z=O.useState("floatingElement"),{dataRef:w}=O.context,k=et(M),m=U(typeof s=="function"?s:()=>!1),y=typeof s=="function"?m:s,b=y!==!1,E=U(()=>c),{escapeKey:Z,outsidePress:N}=Tn(v),Y=f.useRef(!1),J=f.useRef(!1),I=f.useRef(!1),ee=f.useRef(!1),se=f.useRef(""),P=f.useRef(null),ie=Ae(),j=Ae(),p=U(()=>{j.clear(),w.current.insideReactTree=!1}),$=U(R=>{const q=w.current.floatingContext?.nodeId;return(k?Ie(k.nodesRef.current,q):[]).some(me=>me.context?.open&&!me.context.dataRef.current[R])}),Q=U(R=>He(R,O.select("floatingElement"))||He(R,O.select("domReferenceElement"))),de=U(R=>{o()&&O.setOpen(!1,Me(Zt,R.nativeEvent))}),oe=U(R=>{if(!A||!n||!r||R.key!=="Escape"||ee.current||!Z&&$("__escapeKeyBubbles"))return;const q=en(R)?R.nativeEvent:R,ce=Me(tn,q);O.setOpen(!1,ce),ce.isCanceled||R.preventDefault(),!Z&&!ce.isPropagationAllowed&&R.stopPropagation()}),te=U(()=>{w.current.insideReactTree=!0,j.start(0,p)}),pe=U(R=>{if(!A||!n||R.button!==0)return;const q=Re(R.nativeEvent);C(O.select("floatingElement"),q)&&(Y.current||(Y.current=!0,J.current=!1))}),ge=U(R=>{!A||!n||(R.defaultPrevented||R.nativeEvent.defaultPrevented)&&Y.current&&(J.current=!0)});f.useEffect(()=>{if(!A||!n)return;w.current.__escapeKeyBubbles=Z,w.current.__outsidePressBubbles=N;const R=new Ne,q=new Ne;function ce(){R.clear(),ee.current=!0}function me(){R.start(nn()?5:0,()=>{ee.current=!1})}function Pe(){I.current=!0,q.start(0,()=>{I.current=!1})}function g(){Y.current=!1,J.current=!1}function K(){const i=se.current,l=i==="pen"||!i?"mouse":i,T=E(),B=typeof T=="function"?T():T;return typeof B=="string"?B:B[l]}function ne(i){const l=K();return l==="intentional"&&i.type!=="click"||l==="sloppy"&&i.type==="click"}function ve(i){const l=w.current.floatingContext?.nodeId,T=k&&Ie(k.nodesRef.current,l).some(B=>He(i,B.context?.elements.floating));return Q(i)||T}function a(i){if(ne(i)){i.type!=="click"&&!Q(i)&&(q.clear(),I.current=!1),p();return}if(w.current.insideReactTree){p();return}const l=Re(i),T=`[${$e("inert")}]`,B=Ce(l)?l.getRootNode():null,ue=Array.from((vt(B)?B:D(O.select("floatingElement"))).querySelectorAll(T)),rt=O.context.triggerElements;if(l&&(rt.hasElement(l)||rt.hasMatchingElement(re=>C(re,l))))return;let Oe=Ce(l)?l:null;for(;Oe&&!_e(Oe);){const re=rn(Oe);if(_e(re)||!Ce(re))break;Oe=re}if(!(ue.length&&Ce(l)&&!sn(l)&&!C(l,O.select("floatingElement"))&&ue.every(re=>!C(Oe,re)))){if(Ee(l)&&!("touches"in i)){const re=_e(l),Ye=on(l),st=/auto|scroll/,Mt=re||st.test(Ye.overflowX),At=re||st.test(Ye.overflowY),Nt=Mt&&l.clientWidth>0&&l.scrollWidth>l.clientWidth,Wt=At&&l.clientHeight>0&&l.scrollHeight>l.clientHeight,Lt=Ye.direction==="rtl",Yt=Wt&&(Lt?i.offsetX<=l.offsetWidth-l.clientWidth:i.offsetX>l.clientWidth),Ht=Nt&&i.offsetY>l.clientHeight;if(Yt||Ht)return}if(!ve(i)){if(K()==="intentional"&&I.current){q.clear(),I.current=!1;return}typeof y=="function"&&!y(i)||$("__outsidePressBubbles")||(O.setOpen(!1,Me(Ct,i)),p())}}}function W(i){K()!=="sloppy"||i.pointerType==="touch"||!O.select("open")||!n||Q(i)||a(i)}function H(i){if(K()!=="sloppy"||!O.select("open")||!n||Q(i))return;const l=i.touches[0];l&&(P.current={startTime:Date.now(),startX:l.clientX,startY:l.clientY,dismissOnTouchEnd:!1,dismissOnMouseDown:!0},ie.start(1e3,()=>{P.current&&(P.current.dismissOnTouchEnd=!1,P.current.dismissOnMouseDown=!1)}))}function L(i,l){const T=Re(i);if(!T)return;const B=x(T,i.type,()=>{l(i),B()})}function S(i){se.current="touch",L(i,H)}function h(i){ie.clear(),i.type==="pointerdown"&&(se.current=i.pointerType),!(i.type==="mousedown"&&P.current&&!P.current.dismissOnMouseDown)&&L(i,l=>{l.type==="pointerdown"?W(l):a(l)})}function F(i){if(!Y.current)return;const l=J.current;if(g(),K()==="intentional"){if(i.type==="pointercancel"){l&&Pe();return}if(!ve(i)){if(l){Pe();return}typeof y=="function"&&!y(i)||(q.clear(),I.current=!0,p())}}}function d(i){if(K()!=="sloppy"||!P.current||Q(i))return;const l=i.touches[0];if(!l)return;const T=Math.abs(l.clientX-P.current.startX),B=Math.abs(l.clientY-P.current.startY),ue=Math.sqrt(T*T+B*B);ue>5&&(P.current.dismissOnTouchEnd=!0),ue>10&&(a(i),ie.clear(),P.current=null)}function _(i){L(i,d)}function X(i){K()!=="sloppy"||!P.current||Q(i)||(P.current.dismissOnTouchEnd&&a(i),ie.clear(),P.current=null)}function be(i){L(i,X)}const V=D(z),Le=xe(r&&xe(x(V,"keydown",oe),x(V,"compositionstart",ce),x(V,"compositionend",me)),b&&xe(x(V,"click",h,!0),x(V,"pointerdown",h,!0),x(V,"pointerup",F,!0),x(V,"pointercancel",F,!0),x(V,"mousedown",h,!0),x(V,"mouseup",F,!0),x(V,"touchstart",S,!0),x(V,"touchmove",_,!0),x(V,"touchend",be,!0)));return()=>{Le(),R.clear(),q.clear(),g(),I.current=!1}},[w,z,r,b,y,A,n,Z,N,oe,p,E,$,Q,k,O,ie]),f.useEffect(p,[y,p]);const he=f.useMemo(()=>({onKeyDown:oe,[Rn[u]]:de,...u!=="intentional"&&{onClick:de}}),[oe,de,u]),ke=f.useMemo(()=>({onKeyDown:oe,onPointerDown:ge,onMouseDown:ge,onClickCapture:te,onMouseDownCapture(R){te(),pe(R)},onPointerDownCapture(R){te(),pe(R)},onMouseUpCapture:te,onTouchEndCapture:te,onTouchMoveCapture:te}),[oe,te,pe,ge]);return f.useMemo(()=>n?{reference:he,floating:ke,trigger:he}:{},[n,he,ke])}const vn={open:Se(e=>e.open),transitionStatus:Se(e=>e.transitionStatus),domReferenceElement:Se(e=>e.domReferenceElement),referenceElement:Se(e=>e.positionReference??e.referenceElement),floatingElement:Se(e=>e.floatingElement),floatingId:Se(e=>e.floatingId)};class On extends cn{constructor(t){const{syncOnly:n,nested:r,onOpenChange:s,triggerElements:c,...o}=t;super({...o,positionReference:o.referenceElement,domReferenceElement:o.referenceElement},{onOpenChange:s,dataRef:{current:{}},events:kt(),nested:r,triggerElements:c},vn),this.syncOnly=n}syncOpenEvent=(t,n)=>{(!t||!this.state.open||n!=null&&un(n))&&(this.context.dataRef.current.openEvent=t?n:void 0)};dispatchOpenChange=(t,n)=>{this.syncOpenEvent(t,n.event);const r={open:t,reason:n.reason,nativeEvent:n.event,nested:this.context.nested,triggerElement:n.trigger};this.context.events.emit("openchange",r)};setOpen=(t,n)=>{if(this.syncOnly){this.context.onOpenChange?.(t,n);return}this.dispatchOpenChange(t,n),this.context.onOpenChange?.(t,n)}}function wn(e){const{popupStore:t,treatPopupAsFloatingElement:n=!1,floatingRootContext:r,floatingId:s,nested:c,onOpenChange:o}=e,u=t.useState("open"),v=t.useState("activeTriggerElement"),M=t.useState(n?"popupElement":"positionerElement"),O=t.context.triggerElements,A=o,z=f.useRef(null);r===void 0&&z.current===null&&(z.current=new On({open:u,transitionStatus:void 0,referenceElement:v,floatingElement:M,triggerElements:O,onOpenChange:A,floatingId:s,syncOnly:!0,nested:c}));const w=r??z.current;return t.useSyncedValue("floatingId",s),G(()=>{const k={open:u,floatingId:s,referenceElement:v,floatingElement:M};Ce(v)&&(k.domReferenceElement=v),w.state.positionReference===w.state.referenceElement&&(k.positionReference=v),w.update(k)},[u,s,v,M,w]),w.context.onOpenChange=A,w.context.nested=c,w}function Cn(e,t=!1,n=!1){const[r,s]=f.useState(e&&t?"idle":void 0),[c,o]=f.useState(e);return e&&!c&&(o(!0),s("starting")),!e&&c&&r!=="ending"&&!n&&s("ending"),!e&&!c&&r==="ending"&&s(void 0),G(()=>{if(!e&&c&&r!=="ending"&&n){const u=ye.request(()=>{s("ending")});return()=>{ye.cancel(u)}}},[e,c,r,n]),G(()=>{if(!e||t)return;const u=ye.request(()=>{s(void 0)});return()=>{ye.cancel(u)}},[t,e]),G(()=>{if(!e||!t)return;e&&c&&r!=="idle"&&s("starting");const u=ye.request(()=>{s("idle")});return()=>{ye.cancel(u)}},[t,e,c,r]),{mounted:c,setMounted:o,transitionStatus:r}}const tr={tabIndex:-1,[an]:""};function nr(e,t,n=!1){const r=ze(),s=Ze()!=null,c=f.useRef(null);e===void 0&&c.current===null&&(c.current=t(r,s));const o=e??c.current;return wn({popupStore:o,treatPopupAsFloatingElement:n,floatingRootContext:o.state.floatingRootContext,floatingId:r,nested:s,onOpenChange:o.setOpen}),{store:o,internalStore:c.current}}function xn(e,t){const n=f.useRef(null),r=f.useRef(null);return f.useCallback(s=>{if(e===void 0)return;let c=!1;if(n.current!==null){const o=n.current,u=r.current,v=t.context.triggerElements.getById(o);u&&v===u&&(t.context.triggerElements.delete(o),c=!0),n.current=null,r.current=null}if(s!==null&&(n.current=e,r.current=s,t.context.triggerElements.add(e,s),c=!0),c){const o=t.context.triggerElements.size;t.select("open")&&t.state.triggerCount!==o&&t.set("triggerCount",o)}},[t,e])}function rr(e,t,n){const r=n?.id??null;(r||t)&&(e.activeTriggerId=r,e.activeTriggerElement=n??null)}function sr(e,t,n,r){const s=n.useState("isMountedByTrigger",e),c=xn(e,n),o=U(u=>{if(c(u),!u)return;const v=n.select("open"),M=n.select("activeTriggerId");if(M===e){n.update({activeTriggerElement:u,...v?r:null});return}M==null&&v&&n.update({activeTriggerId:e,activeTriggerElement:u,...r})});return G(()=>{s&&n.update({activeTriggerElement:t.current,...r})},[s,n,t,...Object.values(r)]),{registerTrigger:o,isMountedByThisTrigger:s}}function or(e){const t=e.useState("open"),n=e.useState("triggerCount");G(()=>{if(!t){e.state.triggerCount!==0&&e.set("triggerCount",0);return}const r=e.context.triggerElements.size,s={};if(e.state.triggerCount!==r&&(s.triggerCount=r),!e.select("activeTriggerId")&&r===1){const c=e.context.triggerElements.entries().next();if(!c.done){const[o,u]=c.value;s.activeTriggerId=o,s.activeTriggerElement=u}}(s.triggerCount!==void 0||s.activeTriggerId!==void 0)&&e.update(s)},[t,e,n])}function cr(e,t,n){const{mounted:r,setMounted:s,transitionStatus:c}=Cn(e);t.useSyncedValues({mounted:r,transitionStatus:c});const o=U(()=>{s(!1),t.update({activeTriggerId:null,activeTriggerElement:null,mounted:!1,preventUnmountingOnClose:!1}),n?.(),t.context.onOpenChangeComplete?.(!1)}),u=t.useState("preventUnmountingOnClose");return ln({enabled:r&&!e&&!u,open:e,ref:t.context.popupRef,onComplete(){e||o()}}),{forceUnmount:o,transitionStatus:c}}function ir(e,t){e.useSyncedValues(t),G(()=>()=>{e.update({activeTriggerProps:Be,inactiveTriggerProps:Be,popupProps:Be})},[e])}function ur(e,t){G(()=>{!t&&e.state.openMethod!==null&&e.set("openMethod",null)},[t,e]),G(()=>()=>{e.state.openMethod!==null&&e.set("openMethod",null)},[e])}class lr{constructor(){this.elementsSet=new Set,this.idMap=new Map}add(t,n){const r=this.idMap.get(t);r!==n&&(r!==void 0&&this.elementsSet.delete(r),this.elementsSet.add(n),this.idMap.set(t,n))}delete(t){const n=this.idMap.get(t);n&&(this.elementsSet.delete(n),this.idMap.delete(t))}hasElement(t){return this.elementsSet.has(t)}hasMatchingElement(t){for(const n of this.elementsSet)if(t(n))return!0;return!1}getById(t){return this.idMap.get(t)}entries(){return this.idMap.entries()}elements(){return this.elementsSet.values()}get size(){return this.idMap.size}}let nt=(function(e){return e.open="data-open",e.closed="data-closed",e[e.startingStyle=at.startingStyle]="startingStyle",e[e.endingStyle=at.endingStyle]="endingStyle",e.anchorHidden="data-anchor-hidden",e.side="data-side",e.align="data-align",e})({}),je=(function(e){return e.popupOpen="data-popup-open",e.pressed="data-pressed",e})({});const In={[je.popupOpen]:""},kn={[je.popupOpen]:"",[je.pressed]:""},Pn={[nt.open]:""},Fn={[nt.closed]:""},Mn={[nt.anchorHidden]:""},ar={open(e){return e?In:null}},fr={open(e){return e?kn:null}},dr={open(e){return e?Pn:Fn},anchorHidden(e){return e?Mn:null}};function pr(e){return ze(e,"base-ui")}const An="ArrowUp",Nn="ArrowDown",Wn="ArrowLeft",Ln="ArrowRight",Yn="Home",Hn="End",_n=new Set([Wn,Ln]),Bn=new Set([An,Nn]),Gn=new Set([..._n,...Bn]),gr=new Set([...Gn,Yn,Hn]),hr=f.forwardRef(function(t,n){const{cutout:r,...s}=t;let c;if(r){const o=r.getBoundingClientRect();c=`polygon(0% 0%,100% 0%,100% 100%,0% 100%,0% 0%,${o.left}px ${o.top}px,${o.left}px ${o.bottom}px,${o.right}px ${o.bottom}px,${o.right}px ${o.top}px,${o.left}px ${o.top}px)`}return Te.jsx("div",{ref:n,role:"presentation","data-base-ui-inert":"",...s,style:{position:"fixed",inset:0,userSelect:"none",WebkitUserSelect:"none",clipPath:c}})});function mr(e){const t=f.useRef(!0);t.current&&(t.current=!1,e())}let Et={},yt={},Rt="";function Kn(e){if(typeof document>"u")return!1;const t=D(e);return We(t).innerWidth-t.documentElement.clientWidth>0}function Dn(e){if(!(typeof CSS<"u"&&CSS.supports&&CSS.supports("scrollbar-gutter","stable"))||typeof document>"u")return!1;const n=D(e),r=n.documentElement,s=n.body,c=Qe(r)?r:s,o=c.style.overflowY,u=r.style.scrollbarGutter;r.style.scrollbarGutter="stable",c.style.overflowY="scroll";const v=c.offsetWidth;c.style.overflowY="hidden";const M=c.offsetWidth;return c.style.overflowY=o,r.style.scrollbarGutter=u,v===M}function Xn(e){const t=D(e),n=t.documentElement,r=t.body,s=Qe(n)?n:r,c={overflowY:s.style.overflowY,overflowX:s.style.overflowX};return Object.assign(s.style,{overflowY:"hidden",overflowX:"hidden"}),()=>{Object.assign(s.style,c)}}function Vn(e){const t=D(e),n=t.documentElement,r=t.body,s=We(n);let c=0,o=0,u=!1;const v=ye.create();if(xt&&(s.visualViewport?.scale??1)!==1)return()=>{};function M(){const w=s.getComputedStyle(n),k=s.getComputedStyle(r),b=(w.scrollbarGutter||"").includes("both-edges")?"stable both-edges":"stable";c=n.scrollTop,o=n.scrollLeft,Et={scrollbarGutter:n.style.scrollbarGutter,overflowY:n.style.overflowY,overflowX:n.style.overflowX},Rt=n.style.scrollBehavior,yt={position:r.style.position,height:r.style.height,width:r.style.width,boxSizing:r.style.boxSizing,overflowY:r.style.overflowY,overflowX:r.style.overflowX,scrollBehavior:r.style.scrollBehavior};const E=n.scrollHeight>n.clientHeight,Z=n.scrollWidth>n.clientWidth,N=w.overflowY==="scroll"||k.overflowY==="scroll",Y=w.overflowX==="scroll"||k.overflowX==="scroll",J=Math.max(0,s.innerWidth-r.clientWidth),I=Math.max(0,s.innerHeight-r.clientHeight),ee=parseFloat(k.marginTop)+parseFloat(k.marginBottom),se=parseFloat(k.marginLeft)+parseFloat(k.marginRight),P=Qe(n)?n:r;if(u=Dn(e),u){n.style.scrollbarGutter=b,P.style.overflowY="hidden",P.style.overflowX="hidden";return}Object.assign(n.style,{scrollbarGutter:b,overflowY:"hidden",overflowX:"hidden"}),(E||N)&&(n.style.overflowY="scroll"),(Z||Y)&&(n.style.overflowX="scroll"),Object.assign(r.style,{position:"relative",height:ee||I?`calc(100dvh - ${ee+I}px)`:"100dvh",width:se||J?`calc(100vw - ${se+J}px)`:"100vw",boxSizing:"border-box",overflow:"hidden",scrollBehavior:"unset"}),r.scrollTop=c,r.scrollLeft=o,n.setAttribute("data-base-ui-scroll-locked",""),n.style.scrollBehavior="unset"}function O(){Object.assign(n.style,Et),Object.assign(r.style,yt),u||(n.scrollTop=c,n.scrollLeft=o,n.removeAttribute("data-base-ui-scroll-locked"),n.style.scrollBehavior=Rt)}function A(){O(),v.request(M)}M();const z=x(s,"resize",A);return()=>{v.cancel(),O(),typeof s.removeEventListener=="function"&&z()}}class Un{lockCount=0;restore=null;timeoutLock=Ne.create();timeoutUnlock=Ne.create();acquire(t){return this.lockCount+=1,this.lockCount===1&&this.restore===null&&this.timeoutLock.start(0,()=>this.lock(t)),this.release}release=()=>{this.lockCount-=1,this.lockCount===0&&this.restore&&this.timeoutUnlock.start(0,this.unlock)};unlock=()=>{this.lockCount===0&&this.restore&&(this.restore?.(),this.restore=null)};lock(t){if(this.lockCount===0||this.restore!==null)return;const r=D(t).documentElement,s=We(r).getComputedStyle(r).overflowY;if(s==="hidden"||s==="clip"){this.restore=Tt;return}const c=fn||!Kn(t);this.restore=c?Xn(t):Vn(t)}}const $n=new Un;function br(e=!0,t=null){G(()=>{if(e)return $n.acquire(t)},[e,t])}export{nt as A,jn as C,Qn as F,hr as I,lr as P,Cn as a,et as b,Ze as c,Ge as d,nr as e,mr as f,Ie as g,ur as h,or as i,cr as j,er as k,tr as l,ir as m,sr as n,zn as o,fr as p,Jn as q,Zn as r,rr as s,ar as t,pr as u,gr as v,dr as w,On as x,Ke as y,br as z};
@@ -235,8 +235,8 @@
235
235
  ]
236
236
  }
237
237
  </script>
238
- <script type="module" crossorigin src="/assets/main-CPiNtuB_.js"></script>
239
- <link rel="stylesheet" crossorigin href="/assets/main-BMyBoVLI.css">
238
+ <script type="module" crossorigin src="/assets/main-9Ze1SUIZ.js"></script>
239
+ <link rel="stylesheet" crossorigin href="/assets/main-DMJJVAOH.css">
240
240
  </head>
241
241
  <body>
242
242
  <main class="aeo-seed-content" aria-label="Token Tracker AI-readable summary">
@@ -75,8 +75,8 @@
75
75
  "description": "Shareable Token Tracker dashboard snapshot."
76
76
  }
77
77
  </script>
78
- <script type="module" crossorigin src="/assets/main-CPiNtuB_.js"></script>
79
- <link rel="stylesheet" crossorigin href="/assets/main-BMyBoVLI.css">
78
+ <script type="module" crossorigin src="/assets/main-9Ze1SUIZ.js"></script>
79
+ <link rel="stylesheet" crossorigin href="/assets/main-DMJJVAOH.css">
80
80
  </head>
81
81
  <body>
82
82
  <main class="aeo-seed-content" aria-label="Token Tracker share page summary">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tokentracker-cli",
3
- "version": "0.40.0",
3
+ "version": "0.42.0",
4
4
  "description": "Token usage tracker for AI agent CLIs (Claude Code, Codex, Cursor, Gemini, Kiro, OpenCode, OpenClaw, Every Code, Hermes, GitHub Copilot, Kimi Code, CodeBuddy, Grok Build, oh-my-pi, pi, Craft Agents, Kilo CLI, Kilo Code, Roo Code, Zed Agent, Goose)",
5
5
  "main": "src/cli.js",
6
6
  "bin": {
@@ -45,8 +45,8 @@
45
45
  "undici": "^8.2.0"
46
46
  },
47
47
  "devDependencies": {
48
- "@sourcegraph/scip-typescript": "^0.3.6",
49
- "esbuild": "0.27.2"
48
+ "@sourcegraph/scip-typescript": "^0.4.0",
49
+ "esbuild": "0.28.0"
50
50
  },
51
51
  "repository": {
52
52
  "type": "git",
@@ -0,0 +1,184 @@
1
+ const fs = require("node:fs");
2
+ const os = require("node:os");
3
+ const path = require("node:path");
4
+
5
+ const DEFAULT_BILLING_BASE_URL = "https://cli-chat-proxy.grok.com";
6
+
7
+ function resolveGrokHome({ home, env = process.env } = {}) {
8
+ if (typeof env.TOKENTRACKER_GROK_HOME === "string" && env.TOKENTRACKER_GROK_HOME.trim()) {
9
+ return path.resolve(env.TOKENTRACKER_GROK_HOME.trim());
10
+ }
11
+ if (typeof env.GROK_HOME === "string" && env.GROK_HOME.trim()) {
12
+ return path.resolve(env.GROK_HOME.trim());
13
+ }
14
+ return path.join(home || os.homedir(), ".grok");
15
+ }
16
+
17
+ function resolveGrokBillingBaseUrl(env = process.env) {
18
+ const explicit =
19
+ typeof env.GROK_CLI_CHAT_PROXY_BASE_URL === "string"
20
+ ? env.GROK_CLI_CHAT_PROXY_BASE_URL.trim()
21
+ : typeof env.TOKENTRACKER_GROK_BILLING_BASE_URL === "string"
22
+ ? env.TOKENTRACKER_GROK_BILLING_BASE_URL.trim()
23
+ : "";
24
+ if (explicit) return explicit.replace(/\/$/, "");
25
+ return DEFAULT_BILLING_BASE_URL;
26
+ }
27
+
28
+ function grokValNumber(value) {
29
+ if (value == null) return null;
30
+ if (typeof value === "object" && value !== null && "val" in value) {
31
+ return grokValNumber(value.val);
32
+ }
33
+ const n = Number(value);
34
+ return Number.isFinite(n) ? n : null;
35
+ }
36
+
37
+ function grokIsoReset(value) {
38
+ if (typeof value !== "string" || !value.trim()) return null;
39
+ const ts = Date.parse(value.trim());
40
+ return Number.isFinite(ts) && ts > 0 ? new Date(ts).toISOString() : null;
41
+ }
42
+
43
+ function clampPercent(value) {
44
+ if (value === null || value === undefined || value === "") return null;
45
+ const n = Number(value);
46
+ if (!Number.isFinite(n)) return null;
47
+ if (n <= 0) return 0;
48
+ if (n >= 100) return 100;
49
+ return n;
50
+ }
51
+
52
+ function buildWindow({ usedPercent, resetAt }) {
53
+ const pct = clampPercent(usedPercent);
54
+ if (pct === null) return null;
55
+ return {
56
+ used_percent: pct,
57
+ reset_at: typeof resetAt === "string" && resetAt ? resetAt : null,
58
+ };
59
+ }
60
+
61
+ function isGrokInstalled({ home, env } = {}) {
62
+ const grokHome = resolveGrokHome({ home, env });
63
+ const authPath = path.join(grokHome, "auth.json");
64
+ if (fs.existsSync(authPath)) return true;
65
+ return fs.existsSync(path.join(grokHome, "sessions"));
66
+ }
67
+
68
+ function loadGrokAuthEntry({ home, env } = {}) {
69
+ const authPath = path.join(resolveGrokHome({ home, env }), "auth.json");
70
+ if (!fs.existsSync(authPath)) return null;
71
+ try {
72
+ const parsed = JSON.parse(fs.readFileSync(authPath, "utf8"));
73
+ if (!parsed || typeof parsed !== "object") return null;
74
+ for (const value of Object.values(parsed)) {
75
+ if (!value || typeof value !== "object") continue;
76
+ const key = typeof value.key === "string" ? value.key.trim() : "";
77
+ if (key) return { entry: value, authPath };
78
+ }
79
+ } catch (_error) {
80
+ return null;
81
+ }
82
+ return null;
83
+ }
84
+
85
+ function readGrokAccessToken({ home, env } = {}) {
86
+ const loaded = loadGrokAuthEntry({ home, env });
87
+ const key = typeof loaded?.entry?.key === "string" ? loaded.entry.key.trim() : "";
88
+ return key || null;
89
+ }
90
+
91
+ function normalizeGrokBillingResponse(body) {
92
+ const config = body?.config;
93
+ if (!config || typeof config !== "object") {
94
+ throw new Error("Could not parse Grok billing: missing config");
95
+ }
96
+
97
+ const monthlyLimit = grokValNumber(config.monthlyLimit);
98
+ const used = grokValNumber(config.used);
99
+ const onDemandCap = grokValNumber(config.onDemandCap);
100
+ const onDemandUsed = grokValNumber(config.onDemandUsed);
101
+ const resetAt = grokIsoReset(config.billingPeriodEnd);
102
+
103
+ let primaryWindow = null;
104
+ if (Number.isFinite(monthlyLimit) && monthlyLimit > 0 && Number.isFinite(used)) {
105
+ primaryWindow = buildWindow({
106
+ usedPercent: (used / monthlyLimit) * 100,
107
+ resetAt,
108
+ });
109
+ }
110
+
111
+ let secondaryWindow = null;
112
+ if (Number.isFinite(onDemandCap) && onDemandCap > 0 && Number.isFinite(onDemandUsed)) {
113
+ secondaryWindow = buildWindow({
114
+ usedPercent: (onDemandUsed / onDemandCap) * 100,
115
+ resetAt,
116
+ });
117
+ }
118
+
119
+ if (!primaryWindow && !secondaryWindow) {
120
+ throw new Error("Could not parse Grok billing: no quota windows in response");
121
+ }
122
+
123
+ return {
124
+ monthly_credits_limit: monthlyLimit,
125
+ monthly_credits_used: used,
126
+ on_demand_cap: onDemandCap,
127
+ on_demand_used: onDemandUsed,
128
+ billing_period_start: grokIsoReset(config.billingPeriodStart),
129
+ primary_window: primaryWindow,
130
+ secondary_window: secondaryWindow,
131
+ };
132
+ }
133
+
134
+ async function fetchGrokBilling(accessToken, { fetchImpl = fetch, baseUrl, env } = {}) {
135
+ const root = (baseUrl || resolveGrokBillingBaseUrl(env)).replace(/\/$/, "");
136
+ const res = await fetchImpl(`${root}/v1/billing`, {
137
+ method: "GET",
138
+ headers: {
139
+ Authorization: `Bearer ${accessToken}`,
140
+ Accept: "application/json",
141
+ },
142
+ });
143
+ if (res.status === 401 || res.status === 403) {
144
+ throw new Error("Not logged in to Grok Build. Run `grok login` in Terminal to authenticate.");
145
+ }
146
+ if (!res.ok) {
147
+ throw new Error(`Grok billing API returned ${res.status}`);
148
+ }
149
+ return res.json();
150
+ }
151
+
152
+ async function fetchGrokLimits({ home, env, fetchImpl = fetch } = {}) {
153
+ if (!isGrokInstalled({ home, env })) {
154
+ return { configured: false };
155
+ }
156
+ const accessToken = readGrokAccessToken({ home, env });
157
+ if (!accessToken) {
158
+ return { configured: false };
159
+ }
160
+ try {
161
+ const body = await fetchGrokBilling(accessToken, { fetchImpl, env });
162
+ return {
163
+ configured: true,
164
+ error: null,
165
+ ...normalizeGrokBillingResponse(body),
166
+ };
167
+ } catch (error) {
168
+ return {
169
+ configured: true,
170
+ error: error?.message || "Unknown error",
171
+ };
172
+ }
173
+ }
174
+
175
+ module.exports = {
176
+ resolveGrokHome,
177
+ resolveGrokBillingBaseUrl,
178
+ isGrokInstalled,
179
+ loadGrokAuthEntry,
180
+ readGrokAccessToken,
181
+ normalizeGrokBillingResponse,
182
+ fetchGrokBilling,
183
+ fetchGrokLimits,
184
+ };
@@ -51,6 +51,60 @@ function resolveQueuePath() {
51
51
  return path.join(home, ".tokentracker", "tracker", "queue.jsonl");
52
52
  }
53
53
 
54
+ /**
55
+ * Stable per-MACHINE identifier, persisted in config.json next to the queue.
56
+ *
57
+ * The dashboard uses this (not a per-browser localStorage id) as the cloud
58
+ * device_name suffix, so every browser / WKWebView / cleared-cache session on
59
+ * the SAME machine resolves to ONE cloud device_id. That keeps cross-device
60
+ * SUM aggregation correct: one physical machine = one device (its cumulative
61
+ * queue upserts onto a single row), while genuinely distinct machines stay
62
+ * distinct devices that legitimately sum. Browser-keyed ids conflated one
63
+ * machine into several device_ids and inflated the account-view total.
64
+ *
65
+ * Returns null only when the id cannot be persisted (read-only home), in which
66
+ * case the caller falls back to its own client id (prior behavior).
67
+ */
68
+ function getOrCreateMachineId(queuePath) {
69
+ const configPath = path.join(path.dirname(queuePath || resolveQueuePath()), "config.json");
70
+ let config = {};
71
+ let raw = null;
72
+ try {
73
+ raw = fs.readFileSync(configPath, "utf8");
74
+ } catch (e) {
75
+ // Missing file is fine (fresh install → create config below). Any other
76
+ // read error means an existing config we must NOT clobber.
77
+ if (e && e.code !== "ENOENT") return null;
78
+ }
79
+ if (raw != null) {
80
+ try {
81
+ config = JSON.parse(raw) || {};
82
+ } catch {
83
+ // Corrupt / partially-written config.json — refuse to overwrite it (that
84
+ // would destroy deviceToken and other keys). Caller falls back to the
85
+ // per-browser client id.
86
+ return null;
87
+ }
88
+ }
89
+ const existing = config.machineId;
90
+ if (typeof existing === "string" && existing.length >= 8) return existing;
91
+ let generated;
92
+ try {
93
+ generated = crypto.randomUUID();
94
+ } catch {
95
+ generated = `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
96
+ }
97
+ try {
98
+ config.machineId = generated;
99
+ fs.mkdirSync(path.dirname(configPath), { recursive: true });
100
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
101
+ try { fs.chmodSync(configPath, 0o600); } catch { /* best effort */ }
102
+ } catch {
103
+ return null;
104
+ }
105
+ return generated;
106
+ }
107
+
54
108
  function readProjectQueueData(projectQueuePath) {
55
109
  let raw;
56
110
  try {
@@ -1631,6 +1685,15 @@ function createLocalApiHandler({ queuePath }) {
1631
1685
  return true;
1632
1686
  }
1633
1687
 
1688
+ // --- machine-id (stable per-machine device identity for cloud sync) ---
1689
+ // The dashboard reads this before issuing a cloud device token so the
1690
+ // device_name keys on the MACHINE, not the browser — see
1691
+ // getOrCreateMachineId above and dashboard/src/lib/cloud-sync.ts.
1692
+ if (p === "/functions/tokentracker-machine-id") {
1693
+ json(res, { machineId: getOrCreateMachineId(qp) });
1694
+ return true;
1695
+ }
1696
+
1634
1697
  // --- usage-hourly (stub for day-view) ---
1635
1698
  if (p === "/functions/tokentracker-usage-hourly") {
1636
1699
  const day = url.searchParams.get("day") || new Date().toISOString().slice(0, 10);