tokentracker-cli 0.39.0 → 0.41.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.
- package/README.ja.md +1 -1
- package/README.ko.md +1 -1
- package/README.md +1 -1
- package/README.zh-CN.md +1 -1
- package/dashboard/dist/assets/{ActivityHeatmap-DDzq43pV.js → ActivityHeatmap-DAyvtRkn.js} +1 -1
- package/dashboard/dist/assets/{Card-RRZhPmAq.js → Card-DByZ3SxT.js} +1 -1
- package/dashboard/dist/assets/DashboardPage-DJLLG7DG.js +19 -0
- package/dashboard/dist/assets/{DevicePage-CwjjtGy7.js → DevicePage-BkGbFsCV.js} +1 -1
- package/dashboard/dist/assets/DialogTitle-BhNOpzk4.js +1 -0
- package/dashboard/dist/assets/{FadeIn-BxYlG4qs.js → FadeIn-CQ0uWwqS.js} +1 -1
- package/dashboard/dist/assets/{HeaderGithubStar-Drsogiil.js → HeaderGithubStar-OlcZIZs-.js} +1 -1
- package/dashboard/dist/assets/{IpCheckPage-23cwrKD6.js → IpCheckPage-VaBccp0v.js} +1 -1
- package/dashboard/dist/assets/LandingPage-BbOOtp0W.js +4411 -0
- package/dashboard/dist/assets/{LeaderboardAvatar-BsUf4diw.js → LeaderboardAvatar-B26XN7XT.js} +1 -1
- package/dashboard/dist/assets/{LeaderboardPage-BlRsDd1Y.js → LeaderboardPage-D43tLe4r.js} +3 -3
- package/dashboard/dist/assets/{LeaderboardProfileModal-Bvz_sBn-.js → LeaderboardProfileModal-Cc3TV4wl.js} +3 -3
- package/dashboard/dist/assets/LeaderboardProfilePage-DAVuscsT.js +1 -0
- package/dashboard/dist/assets/LimitsPage-HXB3ON_M.js +2 -0
- package/dashboard/dist/assets/{LocalOnlyNotice-p9TjRIic.js → LocalOnlyNotice-BtgOf0xW.js} +1 -1
- package/dashboard/dist/assets/{LoginPage-CgJ62gMn.js → LoginPage-CHNz2uuj.js} +1 -1
- package/dashboard/dist/assets/PopoverPopup-i1aCasNO.js +1 -0
- package/dashboard/dist/assets/Select-Dn4TdKJu.js +1 -0
- package/dashboard/dist/assets/SelectItemText-D2YtMFj0.js +1 -0
- package/dashboard/dist/assets/SettingsPage-D-44xtnb.js +1 -0
- package/dashboard/dist/assets/SkillsPage-Bt8e5ROp.js +1 -0
- package/dashboard/dist/assets/WidgetsPage-CGnhXDpP.js +1 -0
- package/dashboard/dist/assets/{WrappedPage-CaFHKfBB.js → WrappedPage-FEgpbrfx.js} +1 -1
- package/dashboard/dist/assets/{agent-logos-ADrK4Olm.js → agent-logos-2LgC_fmg.js} +1 -1
- package/dashboard/dist/assets/{arrow-up-right-H5gfqSzn.js → arrow-up-right-Al34G4US.js} +1 -1
- package/dashboard/dist/assets/{download-BnlEkhpl.js → download-BorAs8Ai.js} +1 -1
- package/dashboard/dist/assets/geist-mono-cyrillic-400-normal-CeA7eGSt.woff +0 -0
- package/dashboard/dist/assets/geist-mono-cyrillic-400-normal-DoshcOXv.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-cyrillic-500-normal-BgLpzsdg.woff +0 -0
- package/dashboard/dist/assets/geist-mono-cyrillic-500-normal-BkE2O7RC.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-cyrillic-700-normal-4t7P5rT3.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-cyrillic-700-normal-DpJKySxv.woff +0 -0
- package/dashboard/dist/assets/geist-mono-cyrillic-900-normal-CVPizhN4.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-cyrillic-900-normal-DDpyx8f0.woff +0 -0
- package/dashboard/dist/assets/geist-mono-latin-400-normal-BXAprPdR.woff +0 -0
- package/dashboard/dist/assets/geist-mono-latin-400-normal-DKaoCDn5.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-latin-500-normal-C3sF8Y1B.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-latin-500-normal-YfPbDI_o.woff +0 -0
- package/dashboard/dist/assets/geist-mono-latin-700-normal-CzSaXH83.woff +0 -0
- package/dashboard/dist/assets/geist-mono-latin-700-normal-DMoeyBRY.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-latin-900-normal-DAGlevET.woff +0 -0
- package/dashboard/dist/assets/geist-mono-latin-900-normal-DVg4HgZN.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-latin-ext-400-normal-C1xxG8eb.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-latin-ext-400-normal-a1APXIwD.woff +0 -0
- package/dashboard/dist/assets/geist-mono-latin-ext-500-normal-CDyCFkgU.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-latin-ext-500-normal-CzSM7th5.woff +0 -0
- package/dashboard/dist/assets/geist-mono-latin-ext-700-normal-BG1muzu_.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-latin-ext-700-normal-BmQm3zK6.woff +0 -0
- package/dashboard/dist/assets/geist-mono-latin-ext-900-normal-DvYIGD1f.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-latin-ext-900-normal-LB8u5xx5.woff +0 -0
- package/dashboard/dist/assets/geist-mono-symbols2-400-normal-B5fXMCGq.woff +0 -0
- package/dashboard/dist/assets/geist-mono-symbols2-500-normal-BYvOiszX.woff +0 -0
- package/dashboard/dist/assets/geist-mono-symbols2-700-normal-nLp0AmIG.woff +0 -0
- package/dashboard/dist/assets/geist-mono-symbols2-900-normal-DPuoOkkO.woff +0 -0
- package/dashboard/dist/assets/geist-mono-vietnamese-400-normal-CyOwoevh.woff +0 -0
- package/dashboard/dist/assets/geist-mono-vietnamese-500-normal-Do_laDd2.woff +0 -0
- package/dashboard/dist/assets/geist-mono-vietnamese-700-normal-DKtT8o3X.woff +0 -0
- package/dashboard/dist/assets/geist-mono-vietnamese-900-normal-BAZIExb_.woff +0 -0
- package/dashboard/dist/assets/{info-D3HmZNML.js → info-BjMpOQ6L.js} +1 -1
- package/dashboard/dist/assets/main-BZIH6355.js +995 -0
- package/dashboard/dist/assets/main-DTwPGswA.css +1 -0
- package/dashboard/dist/assets/use-limits-display-prefs-CMcyG3Sf.js +1 -0
- package/dashboard/dist/assets/{use-native-settings-BWsO3g0J.js → use-native-settings-Dda0lUdD.js} +1 -1
- package/dashboard/dist/assets/{use-usage-limits-DyFBw4HA.js → use-usage-limits-DpD2WuDG.js} +1 -1
- package/dashboard/dist/assets/{useCurrency-DBRwXqVn.js → useCurrency-Bar8ZQys.js} +1 -1
- package/dashboard/dist/assets/useScrollLock-g4Jj83C_.js +1 -0
- package/dashboard/dist/index.html +2 -2
- package/dashboard/dist/share.html +2 -2
- package/package.json +3 -3
- package/src/lib/grok-limits.js +184 -0
- package/src/lib/pricing/seed-snapshot.json +1 -1
- package/src/lib/rollout.js +32 -16
- package/src/lib/usage-limits.js +6 -1
- package/dashboard/dist/assets/DashboardPage-CVpa4Krq.js +0 -19
- package/dashboard/dist/assets/DialogTitle-Caa_Fqbe.js +0 -1
- package/dashboard/dist/assets/LandingPage-CVX86qgQ.js +0 -4356
- package/dashboard/dist/assets/LeaderboardProfilePage-Bidu8F3I.js +0 -1
- package/dashboard/dist/assets/LimitsPage-DlZbIhSx.js +0 -2
- package/dashboard/dist/assets/PopoverPopup-CyUrMrGa.js +0 -1
- package/dashboard/dist/assets/Select-Bcduv8la.js +0 -1
- package/dashboard/dist/assets/SelectItemText-lRVDxgrq.js +0 -1
- package/dashboard/dist/assets/SettingsPage-C2Qi3eZI.js +0 -1
- package/dashboard/dist/assets/SkillsPage-x2Y3gIqM.js +0 -1
- package/dashboard/dist/assets/WidgetsPage-Cbk85G0Y.js +0 -1
- package/dashboard/dist/assets/geist-mono-cyrillic-400-normal-BPBWmzPh.woff +0 -0
- package/dashboard/dist/assets/geist-mono-cyrillic-400-normal-Ce5q_31Z.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-cyrillic-500-normal-CJBLNVQT.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-cyrillic-500-normal-mNhfPmgl.woff +0 -0
- package/dashboard/dist/assets/geist-mono-cyrillic-700-normal-DH5Q319x.woff +0 -0
- package/dashboard/dist/assets/geist-mono-cyrillic-700-normal-VCNRadI3.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-cyrillic-900-normal-BKC3PZkM.woff +0 -0
- package/dashboard/dist/assets/geist-mono-cyrillic-900-normal-DdrQ8KBw.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-latin-400-normal-CoULgQGM.woff +0 -0
- package/dashboard/dist/assets/geist-mono-latin-400-normal-LC9RFr9I.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-latin-500-normal-D3o2eNa9.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-latin-500-normal-DOxI7kZ4.woff +0 -0
- package/dashboard/dist/assets/geist-mono-latin-700-normal-D6izGJRP.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-latin-700-normal-QGw08Lff.woff +0 -0
- package/dashboard/dist/assets/geist-mono-latin-900-normal-CmoKXrdK.woff +0 -0
- package/dashboard/dist/assets/geist-mono-latin-900-normal-Cu5MFKsu.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-latin-ext-400-normal-Cgks_Qgx.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-latin-ext-400-normal-CxNRRMGd.woff +0 -0
- package/dashboard/dist/assets/geist-mono-latin-ext-500-normal-CQcGuCNt.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-latin-ext-500-normal-diTenJ8L.woff +0 -0
- package/dashboard/dist/assets/geist-mono-latin-ext-700-normal-BX9f1BHp.woff +0 -0
- package/dashboard/dist/assets/geist-mono-latin-ext-700-normal-YOllDaLV.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-latin-ext-900-normal-Br6WNUGb.woff +0 -0
- package/dashboard/dist/assets/geist-mono-latin-ext-900-normal-CrmBTzU2.woff2 +0 -0
- package/dashboard/dist/assets/main-C52dR5OB.js +0 -969
- package/dashboard/dist/assets/main-G_F9Iu_x.css +0 -1
- package/dashboard/dist/assets/use-limits-display-prefs-Dispof5a.js +0 -1
- package/dashboard/dist/assets/useOpenInteractionType-TVDd89tp.js +0 -12
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as Ht,a_ as St,aY as G,a$ as Tt,bw as D,d2 as vt,cs as Ot,j as Te,cy as ze,r as f,bu as $,cA as ot,d3 as Bt,b0 as ct,bt as Ae,b_ as Gt,cz as it,d4 as wt,by as x,bx as xe,bV as Ee,d5 as Ue,d6 as le,cE as ae,bC as C,bD as Kt,cY as Ct,cQ as Dt,cR as Vt,c$ as xt,b$ as Xt,bQ as ut,bL as lt,bN as $t,d7 as Ut,cF as qt,bz as Re,bP as jt,cT as zt,b as Me,bI as Jt,d8 as Je,b3 as We,d9 as Qt,da as _e,bF as Zt,db as en,bs as Ne,bG as tn,cx as nn,bv as Ce,co as He,cn as rn,dc as sn,cl as on,bE as cn,dd as un,bJ as Se,de as ye,b7 as ln,b2 as Be,df as an,dg as at,cV as fn,ct as Qe}from"./main-BZIH6355.js";const dn=[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]],jn=Ht("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,Ve=0;function gn(e){return qe[e]}function It(e){return e?vt(e)?e.host:It(e.parentNode):null}const Xe=(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=Xe(t,e),O=s?Xe(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=Xe(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,"")}),Ve+=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)}),Ve-=1,Ve||(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 $e(){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=$(()=>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(),U=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=$((a=g)=>a?wt(a):[]),ne=$(()=>k?.().filter(a=>a!=null)??[]);f.useEffect(()=>{if(r||!u)return;function a(_){_.key==="Tab"&&C(g,ae(D(g)))&&K().length===0&&!I&&qt(_)}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 _(S){const h=Re(S),F=ne(),d=C(E,h)||C(b,h)||C(p?.portalNode,h)||F.some(H=>H===h||C(H,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",_,!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 _(F){const d=Re(F);Je(d)&&(oe.current=d)}function L(F){const d=F.relatedTarget,H=F.currentTarget,V=Re(F);queueMicrotask(()=>{const be=Y(),X=m.context.triggerElements,Le=ne(),i=d?.hasAttribute(Ue("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&&X.hasElement(d)||X.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(H===b&&g&&bt(g,ee),o&&H!==b&&!zt(V)&&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!==$e())&&(U.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",_),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(`[${Ue("portal")}]`)||[]),_=(j?ft(j.nodesRef.current,Y()):[]).find(H=>ot(H.context?.elements.domReference||null))?.context?.elements.domReference,S=[...[E,...a,ge.current,he.current,p?.beforeOutsideRef.current,p?.afterOutsideRef.current,...ne()],_,le(A),le(O),I?b:null].filter(H=>H!=null),h=ht(S,{ariaHidden:u||I,mark:!1}),F=[E,...a].filter(H=>H!=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 _=se.current,L=typeof _=="function"?_(ie.current||""):_;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 H=C(g,ae(a));Ke(d,{preventScroll:d===g,shouldFocus(){if(H)return!0;const V=ae(a);return!(V!==d&&C(g,V))}})})},[r,y,g,K,se,ie]),G(()=>{if(r||!g)return;const a=D(g),W=ae(a);En(W);function _(S){if(S.open||(te.current=bn(S.nativeEvent,pe.current)),S.reason===Kt&&S.nativeEvent.type==="mouseleave"&&(U.current=!0),S.reason===Ct)if(S.nested)U.current=!1;else if(Dt(S.nativeEvent)||Vt(S.nativeEvent))U.current=!1;else{let h=!1;D(g).createElement("div").focus({get preventScroll(){return h=!0,!1}}),h?U.current=!1:U.current=!0}}Z.on("openchange",_);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:$e()||null;const F=b?.isConnected?b:$e();return le(h)||F||null}return()=>{Z.off("openchange",_);const S=ae(a),h=ne(),F=C(E,S)||h.some(V=>V===S||C(V,S))||j&&Ie(j.nodesRef.current,Y(),!1).some(V=>C(V.context?.elements.floating,S)),d=P.current,H=L();queueMicrotask(()=>{const V=yn(H),be=typeof d!="boolean";d&&!U.current&&Ee(V)&&(!(!be&&V!==S&&S!==a.body)||F)&&V.focus({preventScroll:!0}),U.current=!1})}},[r,E,g,P,Z,j,b,Y,ne]),G(()=>{if(!xt||y||!E)return;const a=ae(D(E));!Ee(a)||!Xt(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&&(U.current=!1,lt(a,p.portalNode)?$t(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&&(U.current=!0),lt(a,p.portalNode)?Ut(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=$(typeof s=="function"?s:()=>!1),y=typeof s=="function"?m:s,b=y!==!1,E=$(()=>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=$(()=>{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=$(R=>_e(R,O.select("floatingElement"))||_e(R,O.select("domReferenceElement"))),de=$(R=>{o()&&O.setOpen(!1,Me(Zt,R.nativeEvent))}),oe=$(R=>{if(!A||!n||!r||R.key!=="Escape"||ee.current||!Z&&U("__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=$(()=>{w.current.insideReactTree=!0,j.start(0,p)}),pe=$(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=$(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=>_e(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=`[${Ue("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&&!He(Oe);){const re=rn(Oe);if(He(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=He(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),_t=Nt&&i.offsetY>l.clientHeight;if(Yt||_t)return}if(!ve(i)){if(K()==="intentional"&&I.current){q.clear(),I.current=!1;return}typeof y=="function"&&!y(i)||U("__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 _(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,_)}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 H(i){L(i,d)}function V(i){K()!=="sloppy"||!P.current||Q(i)||(P.current.dismissOnTouchEnd&&a(i),ie.clear(),P.current=null)}function be(i){L(i,V)}const X=D(z),Le=xe(r&&xe(x(X,"keydown",oe),x(X,"compositionstart",ce),x(X,"compositionend",me)),b&&xe(x(X,"click",h,!0),x(X,"pointerdown",h,!0),x(X,"pointerup",F,!0),x(X,"pointercancel",F,!0),x(X,"mousedown",h,!0),x(X,"mouseup",F,!0),x(X,"touchstart",S,!0),x(X,"touchmove",H,!0),x(X,"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,U,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=>{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=$(()=>{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",_n="End",Hn=new Set([Wn,Ln]),Bn=new Set([An,Nn]),Gn=new Set([...Hn,...Bn]),gr=new Set([...Gn,Yn,_n]),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 Vn(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 Xn(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 $n{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?Vn(t):Xn(t)}}const Un=new $n;function br(e=!0,t=null){G(()=>{if(e)return Un.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-
|
|
239
|
-
<link rel="stylesheet" crossorigin href="/assets/main-
|
|
238
|
+
<script type="module" crossorigin src="/assets/main-BZIH6355.js"></script>
|
|
239
|
+
<link rel="stylesheet" crossorigin href="/assets/main-DTwPGswA.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-
|
|
79
|
-
<link rel="stylesheet" crossorigin href="/assets/main-
|
|
78
|
+
<script type="module" crossorigin src="/assets/main-BZIH6355.js"></script>
|
|
79
|
+
<link rel="stylesheet" crossorigin href="/assets/main-DTwPGswA.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.
|
|
3
|
+
"version": "0.41.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.
|
|
49
|
-
"esbuild": "0.
|
|
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
|
+
};
|