tokentracker-cli 1.0.7 → 1.1.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.de.md +6 -5
- package/README.ja.md +6 -5
- package/README.ko.md +6 -5
- package/README.md +9 -7
- package/README.zh-CN.md +6 -5
- package/dashboard/dist/assets/{AchievementBadge-BI_HiL08.js → AchievementBadge-CKSLpTB6.js} +1 -1
- package/dashboard/dist/assets/{AchievementsPage-CbK_pV0C.js → AchievementsPage-r42Lu6ll.js} +2 -2
- package/dashboard/dist/assets/{AchievementsSection-DEQycrwd.js → AchievementsSection-1L_uoCV4.js} +1 -1
- package/dashboard/dist/assets/{BadgeDetailModal-BdaHueq5.js → BadgeDetailModal-DlYT33qj.js} +1 -1
- package/dashboard/dist/assets/{BotAnimated-BATn4r97.js → BotAnimated-BJilDdvD.js} +1 -1
- package/dashboard/dist/assets/{Card-C3_Fzc5V.js → Card-DfMS7eJT.js} +1 -1
- package/dashboard/dist/assets/{ClawdAnimated-BidgYaVn.js → ClawdAnimated-B2IKU3oX.js} +2 -2
- package/dashboard/dist/assets/{CommandPalette-D86_iwFa.js → CommandPalette-BQAnKMQp.js} +1 -1
- package/dashboard/dist/assets/{CommunityStatsModal-CJuy4O88.js → CommunityStatsModal-DrYW6eRx.js} +1 -1
- package/dashboard/dist/assets/{ConfirmModal-BaAc5rzt.js → ConfirmModal-DzIeh5dx.js} +1 -1
- package/dashboard/dist/assets/{Controls-Brnf_QJ_.js → Controls-Ce-II3Yn.js} +1 -1
- package/dashboard/dist/assets/{DashboardPage-BmW622BX.js → DashboardPage-CeQYNbXo.js} +1 -1
- package/dashboard/dist/assets/{DevicePage-DDrrY5AJ.js → DevicePage-DmoCLkPn.js} +1 -1
- package/dashboard/dist/assets/{DialogClose-BNcKZCV5.js → DialogClose-DhDGRv1X.js} +1 -1
- package/dashboard/dist/assets/DialogDescription-1rzvf7wG.js +1 -0
- package/dashboard/dist/assets/{DialogTitle-DL9AVJvk.js → DialogTitle-BI2-gsHD.js} +1 -1
- package/dashboard/dist/assets/{FadeIn-BYwYqoVv.js → FadeIn-Bm7hEdb4.js} +1 -1
- package/dashboard/dist/assets/{HeaderGithubStar-C71yS5fY.js → HeaderGithubStar-BDAWv2_t.js} +1 -1
- package/dashboard/dist/assets/{HoverTooltip-nJQ-bK5U.js → HoverTooltip-Z8xawE-X.js} +1 -1
- package/dashboard/dist/assets/{IpCheckPage-CTwXZRZk.js → IpCheckPage-BjmCHK-1.js} +1 -1
- package/dashboard/dist/assets/{LandingPage--GOHgrB4.js → LandingPage-DPfKTaC7.js} +2 -2
- package/dashboard/dist/assets/{LeaderboardAvatar-B7SjpjnT.js → LeaderboardAvatar-Cd0_hasU.js} +1 -1
- package/dashboard/dist/assets/{LeaderboardPage-BmExdKSM.js → LeaderboardPage-FbGCyz1h.js} +2 -2
- package/dashboard/dist/assets/{LeaderboardProfileModal-C5cQqviO.js → LeaderboardProfileModal-CzL7x0ts.js} +3 -3
- package/dashboard/dist/assets/{LeaderboardProfilePage-DJ-09rX6.js → LeaderboardProfilePage-CRU4_vJ_.js} +1 -1
- package/dashboard/dist/assets/{LimitsPage-CazL_F1h.js → LimitsPage-C8j3oSMF.js} +1 -1
- package/dashboard/dist/assets/{LocalOnlyNotice-K3aCR52T.js → LocalOnlyNotice-DMuYjLqc.js} +1 -1
- package/dashboard/dist/assets/{LoginCard-_FbeoBO0.js → LoginCard-BTT8hq7T.js} +1 -1
- package/dashboard/dist/assets/{LoginModal-CYXuWlcp.js → LoginModal-DFyh1GeQ.js} +1 -1
- package/dashboard/dist/assets/{LoginPage-NgvQXPTx.js → LoginPage-Cylxxqn4.js} +1 -1
- package/dashboard/dist/assets/{PetPage-CQ1aHdDU.js → PetPage-CGgadvAb.js} +1 -1
- package/dashboard/dist/assets/{PopoverPopup-BH948Enq.js → PopoverPopup-DiBUe7yt.js} +1 -1
- package/dashboard/dist/assets/{ProviderIcon-CTBbzd0x.js → ProviderIcon-_jz2BcWs.js} +1 -1
- package/dashboard/dist/assets/{ResetPasswordPage-GCsv0PKq.js → ResetPasswordPage-Fv4MB_xt.js} +1 -1
- package/dashboard/dist/assets/{SegmentedControl-D-a1T6Ay.js → SegmentedControl-yi9ALUzr.js} +1 -1
- package/dashboard/dist/assets/{Select-BuBpeT1X.js → Select-CiF8kiQJ.js} +1 -1
- package/dashboard/dist/assets/{SelectItemText-BJl0lY5n.js → SelectItemText-Dbzv_uem.js} +1 -1
- package/dashboard/dist/assets/{ServiceStatusPage-Xz-rDYxA.js → ServiceStatusPage-nIhZrGkz.js} +1 -1
- package/dashboard/dist/assets/{SessionsPage-BvJjRxbT.js → SessionsPage-BSyoUCDc.js} +1 -1
- package/dashboard/dist/assets/{SettingsPage-CDrrA4Z_.js → SettingsPage-Cl2eEX84.js} +2 -2
- package/dashboard/dist/assets/{SkillsPage-C3YDKdBr.js → SkillsPage-Cl8kb4jo.js} +1 -1
- package/dashboard/dist/assets/{TokenGalaxy-CwBN1Nw2.js → TokenGalaxy-Da8tynGB.js} +1 -1
- package/dashboard/dist/assets/{ToolbarRootContext-2RKWzsAn.js → ToolbarRootContext-IQUwRnDp.js} +1 -1
- package/dashboard/dist/assets/{TrendMonitor-CrCYxmL5.js → TrendMonitor-lpOCu-La.js} +1 -1
- package/dashboard/dist/assets/{WidgetsPage-CdJhuvNK.js → WidgetsPage-Cmby6Cw0.js} +1 -1
- package/dashboard/dist/assets/{WrappedPage-xQN9f_Lg.js → WrappedPage-CE3GkR5a.js} +1 -1
- package/dashboard/dist/assets/{__vite-browser-external-CMMzxCk7.js → __vite-browser-external-dDN0mi9f.js} +3 -3
- package/dashboard/dist/assets/{agent-logos-fd9xH1K3.js → agent-logos-D9dYPUzL.js} +1 -1
- package/dashboard/dist/assets/{arrow-up-right-DWTEaioI.js → arrow-up-right-DwAAGP7p.js} +1 -1
- package/dashboard/dist/assets/{check-D7d6q9Tz.js → check-D1Lq-9ts.js} +1 -1
- package/dashboard/dist/assets/{composite-xFyWluZ9.js → composite-JEjFHOYa.js} +1 -1
- package/dashboard/dist/assets/{copy-BlQDmjZB.js → copy-Cgep9txD.js} +1 -1
- package/dashboard/dist/assets/{download-CCvNpDTW.js → download-BvCJfrsP.js} +1 -1
- package/dashboard/dist/assets/{external-link-D3CFEoOU.js → external-link-BvrBuvDE.js} +1 -1
- package/dashboard/dist/assets/{flame-BVD3QAGl.js → flame-CpFTS5jY.js} +1 -1
- package/dashboard/dist/assets/{format-tokens-BeU_fDKc.js → format-tokens-DMy_T00F.js} +1 -1
- package/dashboard/dist/assets/{icons-DT5tCQC8.js → icons-BF-Gt_W6.js} +1 -1
- package/dashboard/dist/assets/{index-CuRJmltu.js → index-BV_fWDL1.js} +1 -1
- package/dashboard/dist/assets/{index-7Rxzbfye.js → index-CG8txBGV.js} +1 -1
- package/dashboard/dist/assets/{index-CB5EF37x.js → index-D7gB7QU6.js} +1 -1
- package/dashboard/dist/assets/{info-Ct8mnVg8.js → info-DN-YTwZw.js} +1 -1
- package/dashboard/dist/assets/{link-2-BkEYcjI7.js → link-2-C5QllJZa.js} +1 -1
- package/dashboard/dist/assets/{loader-circle-Cwlqvkcz.js → loader-circle-Br6MWmXZ.js} +1 -1
- package/dashboard/dist/assets/{maximize-2-Bfi31lVA.js → maximize-2-DWQUOE9I.js} +1 -1
- package/dashboard/dist/assets/{modifiers.esm-DC5Ku6C4.js → modifiers.esm-BW3ZY-q5.js} +1 -1
- package/dashboard/dist/assets/{monitor-smartphone-CjsPxNBN.js → monitor-smartphone-C0lh9STU.js} +1 -1
- package/dashboard/dist/assets/{plus-CgM_CX0H.js → plus-DGzzR4Ta.js} +1 -1
- package/dashboard/dist/assets/{provider-display-TEnGljXd.js → provider-display-C6cpMzsX.js} +1 -1
- package/dashboard/dist/assets/{react-CwlX45ob.js → react-Bl3I3D1L.js} +1 -1
- package/dashboard/dist/assets/{search-CKtoGzmW.js → search-C9Xi6QaM.js} +1 -1
- package/dashboard/dist/assets/{skills-api-DuBly_gc.js → skills-api-BPqKd9uy.js} +1 -1
- package/dashboard/dist/assets/{sortable.esm-BNsp-WHM.js → sortable.esm-CDX2JVl9.js} +1 -1
- package/dashboard/dist/assets/{store-BTs6kZtj.js → store-BBp505Pu.js} +1 -1
- package/dashboard/dist/assets/{terminal-DPMN8gR5.js → terminal-CS1tejfk.js} +1 -1
- package/dashboard/dist/assets/{trash-BDR38M5I.js → trash-CBCEVUxu.js} +1 -1
- package/dashboard/dist/assets/{use-community-stats-Deg7skO9.js → use-community-stats-W4PO2W2z.js} +1 -1
- package/dashboard/dist/assets/{use-latest-request-guard-Bs2kD7b1.js → use-latest-request-guard-DkL6VAD-.js} +1 -1
- package/dashboard/dist/assets/{use-limits-display-prefs-BgdguDzu.js → use-limits-display-prefs-BrBaoX2Q.js} +1 -1
- package/dashboard/dist/assets/{use-ordered-list-ezT84-W6.js → use-ordered-list-BH_LviiX.js} +1 -1
- package/dashboard/dist/assets/use-reduced-motion-CoktFwg_.js +1 -0
- package/dashboard/dist/assets/{use-session-efficiency-pref-CTxl79WJ.js → use-session-efficiency-pref-8vzPyNum.js} +1 -1
- package/dashboard/dist/assets/{use-transform-BpIPybsm.js → use-transform-ILmR4oVe.js} +1 -1
- package/dashboard/dist/assets/use-usage-limits-CeoHpc3u.js +1 -0
- package/dashboard/dist/assets/{useCurrency-e-C23rLv.js → useCurrency-_1mDCij1.js} +1 -1
- package/dashboard/dist/assets/{useTokenFormat-D_LHEY77.js → useTokenFormat-DalbmT3S.js} +1 -1
- package/dashboard/dist/assets/{zap-CjrBTjSn.js → zap-DanLIcSw.js} +1 -1
- package/dashboard/dist/brand-logos/cline.png +0 -0
- package/dashboard/dist/index.html +13 -11
- package/dashboard/dist/ip-check.html +1 -1
- package/dashboard/dist/leaderboard.html +1 -1
- package/dashboard/dist/llms.txt +3 -2
- package/dashboard/dist/share.html +1 -1
- package/package.json +2 -2
- package/src/commands/init.js +25 -0
- package/src/commands/status.js +31 -0
- package/src/commands/sync.js +39 -0
- package/src/lib/pricing/curated-overrides.json +15 -0
- package/src/lib/pricing/index.js +6 -3
- package/src/lib/pricing/matcher.js +7 -0
- package/src/lib/pricing/seed-snapshot.json +1 -1
- package/src/lib/rollout.js +497 -0
- package/src/lib/zcode-limits.js +147 -16
- package/dashboard/dist/assets/DialogDescription-CSvbgRdI.js +0 -1
- package/dashboard/dist/assets/use-reduced-motion-TNdjFH8O.js +0 -1
- package/dashboard/dist/assets/use-usage-limits-ts6E8fNZ.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{m as c}from"./__vite-browser-external-
|
|
1
|
+
import{m as c}from"./__vite-browser-external-dDN0mi9f.js";const e={name:"search",size:24,node:[["path",{d:"m21 21-4.34-4.34",key:"14j7rj"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}]]};e.node;const o=c(e);export{o as S};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{O as E,P as I,Q as R,S as $}from"./__vite-browser-external-
|
|
1
|
+
import{O as E,P as I,Q as R,S as $}from"./__vite-browser-external-dDN0mi9f.js";function s(e){return typeof e=="string"?e.trim():""}function g(e){return Array.isArray(e)?[...new Set(e.map(s).filter(Boolean))]:[]}function v(e){const t=s(e).replace(/\\/g,"/");if(!t||t.startsWith("/")||/^[A-Za-z]:\//.test(t))return"";const n=t.replace(/\/+$/g,"").split("/").filter(Boolean);return!n.length||n.some(r=>r==="."||r==="..")?"":n.join("/")}function C(e){const t=s(e).replace(/\\/g,"/");return!t||t.startsWith("/")||t.includes(":/")||/[A-Za-z]:\//.test(t)?"":t}function S(e){return s(e?.key)||s(e?.id)||`local:${s(e?.directory)}`}function L(e){return(Array.isArray(e)?e:[]).filter(t=>t?.scope!=="system").map(t=>{const n=v(t?.directory),r=C(S(t));if(!r||!n)return null;const i=t?.scope==="plugin"?"plugin":t?.managed?"managed":"local",o=v(t?.sourceName);return{key:r,name:s(t?.name)||n.split("/").pop()||"Skill",directory:n,targets:g(t?.targets),managed:t?.managed===!0,readOnly:t?.readOnly===!0,scope:i,...o?{sourceName:o}:{}}}).filter(t=>!!t)}function N(e){return{id:s(e?.id),name:s(e?.device_name)||s(e?.id),platform:s(e?.platform)||null,scannedAt:s(e?.scanned_at)||null}}function m(e,t){const n=Array.isArray(e.deviceSources)?e.deviceSources:[];return n.some(r=>r.id===t.id)?e:{...e,deviceSources:[...n,t]}}function q(e,t,n){const r=(Array.isArray(e)?e:[]).filter(o=>o?.scope!=="system").map(o=>({...o})),i=new Map;r.forEach((o,a)=>i.set(S(o).toLowerCase(),a));for(const o of Array.isArray(t?.devices)?t.devices:[]){const a=N(o);if(!(!a.id||a.id===n))for(const c of Array.isArray(o?.skills)?o.skills:[]){if(c?.scope==="system")continue;const u=S(c),p=s(c?.directory);if(!u||!p)continue;const h=u.toLowerCase(),k=g(c.targets),y=i.get(h);if(y!=null){const f=r[y];if(f.remote===!0&&f.inventoryOnly===!0){const A=[...new Set([...g(f.targets),...k])],j=Object.fromEntries(A.map(U=>[U,"synced"]));r[y]=m({...f,targets:A,targetStates:j},a)}else r[y]=m(f,a);continue}const w=k,_=Object.fromEntries(w.map(f=>[f,"synced"])),b=m({id:`remote:${encodeURIComponent(u)}`,key:u,name:s(c.name)||p.split(/[\\/]/).pop()||"Skill",directory:p,description:"",targets:w,targetStates:_,managed:!1,readOnly:!0,inventoryOnly:!0,remote:!0,scope:s(c.scope)||"local",sourceName:s(c.sourceName)||null},a);i.set(h,r.length),r.push(b)}}return r.sort((o,a)=>String(o.name||o.directory).localeCompare(String(a.name||a.directory))||String(o.id||o.key).localeCompare(String(a.id||a.key)))}const T="tokentracker-skills",P="tokentracker-account-skills",J=15e3;async function d(e){const t=new URL(`/functions/${T}`,window.location.origin);if(e)for(const[i,o]of Object.entries(e))o!=null&&o!==""&&t.searchParams.set(i,String(o));const n=await fetch(t.toString(),{headers:{Accept:"application/json"},cache:"no-store"}),r=await n.json().catch(()=>null);if(!n.ok)throw new Error(r?.error||`Request failed with HTTP ${n.status}`);return r}async function l(e){const t=await $(),n=await fetch(`/functions/${T}`,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json",...t},cache:"no-store",body:JSON.stringify(e)}),r=await n.json().catch(()=>null);if(!n.ok||r?.ok===!1)throw new Error(r?.error||`Request failed with HTTP ${n.status}`);return r}function x(){return d({mode:"installed"})}function H(e={}){return d({mode:"discover",...e.force?{force:1}:{}})}function z(e,t=0,n=20){return d({mode:"search",q:e,offset:t,limit:n})}function B(){return d({mode:"repos"})}function M(e,t){return l({action:"install",skill:e,targets:t})}function D(e){return l({action:"update_all",ids:e})}function G(e){return l({action:"uninstall",id:e})}function Q(e){return l({action:"restore",id:e})}function W(e,t){return l({action:"set_targets",id:e,targets:t})}function Z(e,t){return l({action:"import_local",directory:e,targets:t})}function F(e,t){return l({action:"delete_local",directory:e,targets:t||[]})}function V(e){return l({action:"add_repo",repo:e})}function X(e,t){return l({action:"remove_repo",owner:e,name:t})}function Y(e={}){return d({mode:"popular",...e.force?{force:1}:{}})}function ee(e={}){return d({mode:"updates",...e.force?{force:1}:{}})}function te(e={}){return d({mode:"skill_usage",...e.force?{force:1}:{}})}async function O({accessToken:e,method:t="GET",body:n}){if(!e||!E(e))throw new Error("Skills sync requires sign-in");const r=I();if(!r)throw new Error("InsForge base URL not configured");const i={Accept:"application/json","Content-Type":"application/json",Authorization:`Bearer ${e}`},o=R();o&&(i.apikey=o);const a=new AbortController,c=setTimeout(()=>a.abort(),J);try{const u=await fetch(`${r.replace(/\/$/,"")}/functions/${P}`,{method:t,headers:i,cache:"no-store",signal:a.signal,...n==null?{}:{body:JSON.stringify(n)}}),p=await u.json().catch(()=>null);if(!u.ok)throw new Error(p?.error||`Request failed with HTTP ${u.status}`);return p}finally{clearTimeout(c)}}function ne(e){return O({accessToken:e})}function re({accessToken:e,deviceId:t,skills:n}){return O({accessToken:e,method:"POST",body:{device_id:t,skills:L(n)}})}export{ne as a,B as b,Y as c,H as d,ee as e,te as f,x as g,F as h,M as i,W as j,Z as k,D as l,q as m,X as n,V as o,re as p,Q as r,z as s,G as u};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as c,d as P,a2 as Oe}from"./__vite-browser-external-
|
|
1
|
+
import{r as c,d as P,a2 as Oe}from"./__vite-browser-external-dDN0mi9f.js";function Sn(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return c.useMemo(()=>r=>{t.forEach(o=>o(r))},t)}const tt=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u";function me(e){const t=Object.prototype.toString.call(e);return t==="[object Window]"||t==="[object global]"}function bt(e){return"nodeType"in e}function B(e){var t,n;return e?me(e)?e:bt(e)&&(t=(n=e.ownerDocument)==null?void 0:n.defaultView)!=null?t:window:window}function wt(e){const{Document:t}=B(e);return e instanceof t}function Be(e){return me(e)?!1:e instanceof B(e).HTMLElement}function Wt(e){return e instanceof B(e).SVGElement}function ye(e){return e?me(e)?e.document:bt(e)?wt(e)?e:Be(e)||Wt(e)?e.ownerDocument:document:document:document}const Q=tt?c.useLayoutEffect:c.useEffect;function mt(e){const t=c.useRef(e);return Q(()=>{t.current=e}),c.useCallback(function(){for(var n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return t.current==null?void 0:t.current(...r)},[])}function En(){const e=c.useRef(null),t=c.useCallback((r,o)=>{e.current=setInterval(r,o)},[]),n=c.useCallback(()=>{e.current!==null&&(clearInterval(e.current),e.current=null)},[]);return[t,n]}function ke(e,t){t===void 0&&(t=[e]);const n=c.useRef(e);return Q(()=>{n.current!==e&&(n.current=e)},t),n}function Fe(e,t){const n=c.useRef();return c.useMemo(()=>{const r=e(n.current);return n.current=r,r},[...t])}function Je(e){const t=mt(e),n=c.useRef(null),r=c.useCallback(o=>{o!==n.current&&t?.(o,n.current),n.current=o},[]);return[n,r]}function ft(e){const t=c.useRef();return c.useEffect(()=>{t.current=e},[e]),t.current}let ct={};function $e(e,t){return c.useMemo(()=>{if(t)return t;const n=ct[e]==null?0:ct[e]+1;return ct[e]=n,e+"-"+n},[e,t])}function Ht(e){return function(t){for(var n=arguments.length,r=new Array(n>1?n-1:0),o=1;o<n;o++)r[o-1]=arguments[o];return r.reduce((i,s)=>{const a=Object.entries(s);for(const[l,u]of a){const f=i[l];f!=null&&(i[l]=f+e*u)}return i},{...t})}}const we=Ht(1),ze=Ht(-1);function In(e){return"clientX"in e&&"clientY"in e}function yt(e){if(!e)return!1;const{KeyboardEvent:t}=B(e.target);return t&&e instanceof t}function Mn(e){if(!e)return!1;const{TouchEvent:t}=B(e.target);return t&&e instanceof t}function ht(e){if(Mn(e)){if(e.touches&&e.touches.length){const{clientX:t,clientY:n}=e.touches[0];return{x:t,y:n}}else if(e.changedTouches&&e.changedTouches.length){const{clientX:t,clientY:n}=e.changedTouches[0];return{x:t,y:n}}}return In(e)?{x:e.clientX,y:e.clientY}:null}const _e=Object.freeze({Translate:{toString(e){if(!e)return;const{x:t,y:n}=e;return"translate3d("+(t?Math.round(t):0)+"px, "+(n?Math.round(n):0)+"px, 0)"}},Scale:{toString(e){if(!e)return;const{scaleX:t,scaleY:n}=e;return"scaleX("+t+") scaleY("+n+")"}},Transform:{toString(e){if(e)return[_e.Translate.toString(e),_e.Scale.toString(e)].join(" ")}},Transition:{toString(e){let{property:t,duration:n,easing:r}=e;return t+" "+n+"ms "+r}}}),Tt="a,frame,iframe,input:not([type=hidden]):not(:disabled),select:not(:disabled),textarea:not(:disabled),button:not(:disabled),*[tabindex]";function An(e){return e.matches(Tt)?e:e.querySelector(Tt)}const On={display:"none"};function Tn(e){let{id:t,value:n}=e;return P.createElement("div",{id:t,style:On},n)}function Nn(e){let{id:t,announcement:n,ariaLiveType:r="assertive"}=e;const o={position:"fixed",top:0,left:0,width:1,height:1,margin:-1,border:0,padding:0,overflow:"hidden",clip:"rect(0 0 0 0)",clipPath:"inset(100%)",whiteSpace:"nowrap"};return P.createElement("div",{id:t,style:o,role:"status","aria-live":r,"aria-atomic":!0},n)}function Ln(){const[e,t]=c.useState("");return{announce:c.useCallback(r=>{r!=null&&t(r)},[]),announcement:e}}const Kt=c.createContext(null);function kn(e){const t=c.useContext(Kt);c.useEffect(()=>{if(!t)throw new Error("useDndMonitor must be used within a children of <DndContext>");return t(e)},[e,t])}function zn(){const[e]=c.useState(()=>new Set),t=c.useCallback(r=>(e.add(r),()=>e.delete(r)),[e]);return[c.useCallback(r=>{let{type:o,event:i}=r;e.forEach(s=>{var a;return(a=s[o])==null?void 0:a.call(s,i)})},[e]),t]}const Pn={draggable:`
|
|
2
2
|
To pick up a draggable item, press the space bar.
|
|
3
3
|
While dragging, use the arrow keys to move the item.
|
|
4
4
|
Press space again to drop the item in its new position, or press escape to cancel.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{E as r}from"./__vite-browser-external-
|
|
1
|
+
import{E as r}from"./__vite-browser-external-dDN0mi9f.js";import{F as g}from"./composite-JEjFHOYa.js";function a(e,n,u=!1){return{open:!1,openProp:void 0,mounted:!1,transitionStatus:void 0,floatingRootContext:new g({open:!1,transitionStatus:void 0,floatingElement:null,referenceElement:null,triggerElements:e,floatingId:n,syncOnly:!0,nested:u,onOpenChange:void 0}),floatingId:n,triggerCount:0,preventUnmountingOnClose:!1,payload:void 0,activeTriggerId:null,activeTriggerElement:null,triggerIdProp:void 0,popupElement:null,positionerElement:null,activeTriggerProps:r,inactiveTriggerProps:r,popupProps:r}}const o=e=>e.triggerIdProp??e.activeTriggerId,t=e=>e.openProp??e.open,i=e=>(e.popupElement?.id??e.floatingId)||void 0;function p(e,n){return n!==void 0&&t(e)&&o(e)===n}function l(e,n){return p(e,n)?!0:n!==void 0&&t(e)&&o(e)==null&&e.triggerCount===1}const c={open:t,mounted:e=>e.mounted,transitionStatus:e=>e.transitionStatus,floatingRootContext:e=>e.floatingRootContext,triggerCount:e=>e.triggerCount,preventUnmountingOnClose:e=>e.preventUnmountingOnClose,payload:e=>e.payload,activeTriggerId:o,activeTriggerElement:e=>e.mounted?e.activeTriggerElement:null,popupId:i,isTriggerActive:(e,n)=>n!==void 0&&o(e)===n,isOpenedByTrigger:(e,n)=>p(e,n),isMountedByTrigger:(e,n)=>n!==void 0&&o(e)===n&&e.mounted,triggerProps:(e,n)=>n?e.activeTriggerProps:e.inactiveTriggerProps,triggerPopupId:(e,n)=>l(e,n)?i(e):void 0,popupProps:e=>e.popupProps,popupElement:e=>e.popupElement,positionerElement:e=>e.positionerElement};export{a as c,c as p};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{m as a}from"./__vite-browser-external-
|
|
1
|
+
import{m as a}from"./__vite-browser-external-dDN0mi9f.js";const e={name:"terminal",size:24,node:[["path",{d:"M12 19h8",key:"baeox8"}],["path",{d:"m4 17 6-6-6-6",key:"1yngyt"}]]};e.node;const o=a(e);export{o as T};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{m as e}from"./__vite-browser-external-
|
|
1
|
+
import{m as e}from"./__vite-browser-external-dDN0mi9f.js";const a={name:"trash",size:24,node:[["path",{d:"M10 11v6",key:"nco0om"}],["path",{d:"M14 11v6",key:"outv1u"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6",key:"miytrc"}],["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2",key:"e791ji"}]],aliases:["trash-2"]};a.node;const o=e(a);export{o as T};
|
package/dashboard/dist/assets/{use-community-stats-Deg7skO9.js → use-community-stats-W4PO2W2z.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as p,g as N,b as M}from"./__vite-browser-external-
|
|
1
|
+
import{r as p,g as N,b as M}from"./__vite-browser-external-dDN0mi9f.js";const D=6e3,S=2500,E=100;function h(t,r){let o;const n=new Promise((a,i)=>{o=setTimeout(()=>i(new Error("landing stats timeout")),r)});return Promise.race([t,n]).finally(()=>{o!=null&&clearTimeout(o)})}const A=5*6e4,P=1440*6e4,k="tokentracker:community-stats:v2";let s=null;function C(t){const r=Number(t?.tokenFloor)||0,o=Number(t?.totalEntries)||0;return!(r>0)||!(o>0)?null:{tokenFloor:r,totalEntries:o,top:Array.isArray(t?.top)?t.top:[],topModels:Array.isArray(t?.topModels)?t.topModels:[],providers:Array.isArray(t?.providers)?t.providers:[],dailyGrowth:Array.isArray(t?.dailyGrowth)?t.dailyGrowth:[],tokenMix:Array.isArray(t?.tokenMix)?t.tokenMix:[],userDistribution:Array.isArray(t?.userDistribution)?t.userDistribution:[],platforms:Array.isArray(t?.platforms)?t.platforms:[],activeDevelopersTotal:Number(t?.activeDevelopersTotal)||0,activeDevelopers30d:Number(t?.activeDevelopers30d)||0,tokens30d:Number(t?.tokens30d)||0,tokenGrowthPct:t?.tokenGrowthPct!=null&&Number.isFinite(Number(t.tokenGrowthPct))?Number(t.tokenGrowthPct):null,developerGrowthPct:t?.developerGrowthPct!=null&&Number.isFinite(Number(t.developerGrowthPct))?Number(t.developerGrowthPct):null,generatedAt:typeof t?.generatedAt=="string"?t.generatedAt:null}}function G(){if(typeof window>"u"||!window.localStorage)return null;try{const t=JSON.parse(window.localStorage.getItem(k)||"null"),r=Number(t?.cachedAt)||0,o=C(t?.data),n=Date.now()-r;return!o||n<0||n>P?null:{data:o,isFresh:n<A}}catch{return null}}function I(t){if(!(typeof window>"u"||!window.localStorage))try{window.localStorage.setItem(k,JSON.stringify({cachedAt:Date.now(),data:t}))}catch{}}function F(){if(s&&Date.now()-s.at<A)return s.promise;const t=Promise.all([h(N({period:"total",limit:E,offset:0}),D),h(M(),S).catch(()=>null)]);return s={at:Date.now(),promise:t},t.catch(()=>{s?.promise===t&&(s=null)}),t}function O({enabled:t=!0}={}){const[r]=p.useState(()=>G()),[o,n]=p.useState(()=>r?{status:"ready",...r.data}:{status:"loading",tokenFloor:null,totalEntries:null,top:[]});return p.useEffect(()=>{if(!t||r?.isFresh)return;let a=!1,i=null,u=null;const y=async()=>{try{const[l,e]=await F();if(a)return;const c=Array.isArray(l?.entries)?l.entries:[],b=c.reduce((m,T)=>m+(Number(T?.total_tokens)||0),0),d=Number(e?.total_tokens)||0;d>0||(s=null);const w=Number(r?.data?.tokenFloor)||0,f=d>0?d:w>0?w:b;if(!c.length||!(f>0)){n(m=>({...m,status:"error"}));return}const g=Array.isArray(e?.top_models)?e.top_models:r?.data?.topModels||[],_={tokenFloor:f,totalEntries:Number(l?.total_entries)||c.length,top:c.slice(0,3),topModels:g,providers:Array.isArray(e?.providers)?e.providers:[],dailyGrowth:Array.isArray(e?.daily_growth)?e.daily_growth:[],tokenMix:Array.isArray(e?.token_mix)?e.token_mix:[],userDistribution:Array.isArray(e?.user_distribution)?e.user_distribution:[],platforms:Array.isArray(e?.platforms)?e.platforms:[],activeDevelopersTotal:Number(e?.active_developers_total)||0,activeDevelopers30d:Number(e?.active_developers_30d)||0,tokens30d:Number(e?.tokens_30d)||0,tokenGrowthPct:e?.token_growth_pct==null?null:Number(e.token_growth_pct),developerGrowthPct:e?.developer_growth_pct==null?null:Number(e.developer_growth_pct),generatedAt:typeof e?.generated_at=="string"?e.generated_at:null};n({status:"ready",..._}),d>0&&I(_)}catch{a||n(e=>e.status==="ready"?e:{...e,status:"error"})}};return typeof window<"u"&&"requestIdleCallback"in window?i=window.requestIdleCallback(y,{timeout:1500}):u=setTimeout(y,400),()=>{a=!0,i!=null&&typeof window.cancelIdleCallback=="function"&&window.cancelIdleCallback(i),u!=null&&clearTimeout(u)}},[t,r]),o}export{O as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as u}from"./__vite-browser-external-
|
|
1
|
+
import{r as u}from"./__vite-browser-external-dDN0mi9f.js";function f(r,e){return r.length===e.length&&r.every((t,n)=>Object.is(t,e[n]))}function a(r){const e=u.useRef(r),t=u.useRef(0),n=u.useRef(!0);return u.useLayoutEffect(()=>{f(e.current,r)||(e.current=r,t.current+=1)}),u.useEffect(()=>(n.current=!0,()=>{n.current=!1,t.current+=1}),[]),u.useCallback(()=>{const c=++t.current,s=e.current;return()=>n.current&&t.current===c&&e.current===s},[])}export{a as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as a,r as c,J as N,K as B,M as F,N as H}from"./__vite-browser-external-
|
|
1
|
+
import{c as a,r as c,J as N,K as B,M as F,N as H}from"./__vite-browser-external-dDN0mi9f.js";const Q=["claude","codex","cursor","gemini","kimi","kiro","grok","copilot","antigravity","zcode","opencodeGo","commandCode","qoder","qoderCn","codingPlan","agentPlan","devin"],W={claude:"CLAUDE",codex:"CODEX",cursor:"CURSOR",gemini:"GEMINI",kimi:"KIMI",kiro:"KIRO",grok:"GROK",copilot:"COPILOT",antigravity:"ANTIGRAVITY",zcode:"ZCODE",opencodeGo:"OPENCODE",commandCode:"COMMAND-CODE",qoder:"QODER",qoderCn:"QODER-CN",codingPlan:"VOLCANO-ARK",agentPlan:"VOLCANO-ARK",devin:"DEVIN"};function fe(e){return W[e]||null}function me(e){switch(e){case"claude":return a("limits.provider.claude");case"codex":return a("limits.provider.codex");case"cursor":return a("limits.provider.cursor");case"gemini":return a("limits.provider.gemini");case"kimi":return a("limits.provider.kimi");case"kiro":return a("limits.provider.kiro");case"grok":return a("limits.provider.grok");case"copilot":return a("limits.provider.copilot");case"antigravity":return a("limits.provider.antigravity");case"zcode":return a("limits.provider.zcode");case"opencodeGo":return a("limits.provider.opencode_go");case"commandCode":return a("limits.provider.command_code");case"qoder":return a("limits.provider.qoder");case"qoderCn":return a("limits.provider.qoder_cn");case"codingPlan":return a("limits.provider.ark_coding_plan");case"agentPlan":return a("limits.provider.ark_agent_plan");case"devin":return a("limits.provider.devin");default:return String(e||"")}}const m=Q,E="tt.limits.providerOrder",I="tt.limits.providerVisibility",A="tt.limits.displayMode",D="tt.limits.showSubscriptions",O="tt.limits.updatedAt",C="limitsPreferences",X="limitsDisplayMode",Z="tt:limits-prefs-changed",w=Object.freeze({USED:"used",REMAINING:"remaining"}),g=new Set(Object.values(w)),_=new Set([E,I,A,D,O]);function h(){return[...m]}const $=new Set(["devin"]);function b(){return Object.fromEntries(m.map(e=>[e,!$.has(e)]))}function L(e){const r=[];if(Array.isArray(e))for(const o of e)m.includes(o)&&!r.includes(o)&&r.push(o);for(const o of m)r.includes(o)||r.push(o);return r}function P(e){const r=b();if(!e||typeof e!="object"||Array.isArray(e))return r;for(const o of m)typeof e[o]=="boolean"&&(r[o]=e[o]);return r}function ee(e){return g.has(e)?e:w.USED}function k(e){return typeof e=="boolean"?e:!0}function S(e){if(e!=null){if(typeof e=="number")return Number.isSafeInteger(e)?e:void 0;if(typeof e=="string"){const r=e.trim();if(r==="")return;const o=Number(r);return Number.isSafeInteger(o)?o:void 0}}}function y(e={}){const r=e&&typeof e=="object"?e:{};return{displayMode:ee(r.displayMode),providerOrder:L(r.providerOrder),providerVisibility:P(r.providerVisibility),showSubscriptions:k(r.showSubscriptions),updatedAt:S(r.updatedAt)}}function re(){if(typeof window>"u")return h();try{const e=window.localStorage.getItem(E);return L(e?JSON.parse(e):void 0)}catch{return h()}}function R(){if(typeof window>"u")return b();try{const e=window.localStorage.getItem(I);return P(e?JSON.parse(e):void 0)}catch{return b()}}function Se(e){return e===null||_.has(e)}function we(){return R().devin===!0}function te(){if(typeof window>"u")return w.USED;try{const e=window.localStorage.getItem(A);return g.has(e)?e:w.USED}catch{return w.USED}}function ie(){if(typeof window>"u")return!0;try{const e=window.localStorage.getItem(D);return e===null?!0:k(JSON.parse(e))}catch{return!0}}function ne(){if(!(typeof window>"u"))try{return S(window.localStorage.getItem(O))}catch{return}}function oe(){if(typeof window>"u")return!1;try{for(const e of _)if(window.localStorage.getItem(e)!==null)return!0}catch{return!1}return!1}function v(){return y({displayMode:te(),providerOrder:re(),providerVisibility:R(),showSubscriptions:ie(),updatedAt:ne()})}function se(e){if(typeof window>"u")return;const r=y(e);try{window.localStorage.setItem(E,JSON.stringify(r.providerOrder)),window.localStorage.setItem(I,JSON.stringify(r.providerVisibility)),window.localStorage.setItem(A,r.displayMode),window.localStorage.setItem(D,JSON.stringify(r.showSubscriptions)),r.updatedAt===void 0?window.localStorage.removeItem(O):window.localStorage.setItem(O,String(r.updatedAt))}catch(o){console.warn("[tokentracker] limits preferences localStorage write failed:",o)}}function de(e){const r=y(e);return{displayMode:r.displayMode,providerOrder:[...r.providerOrder],providerVisibility:{...r.providerVisibility},showSubscriptions:r.showSubscriptions,updatedAt:r.updatedAt??null}}function ae(...e){let r;for(const d of e){const l=S(d);l!==void 0&&(r=r===void 0?l:Math.max(r,l))}const o=Date.now();return r!==void 0&&o<=r?r+1:o}function ce(e,r){return e.length===r.length&&e.every((o,d)=>o===r[d])}function ue(e,r){return m.every(o=>e[o]===r[o])}function K(e,r){return e.displayMode===r.displayMode&&ce(e.providerOrder,r.providerOrder)&&ue(e.providerVisibility,r.providerVisibility)&&e.showSubscriptions===r.showSubscriptions}function le(e,r){return K(e,r)&&S(e.updatedAt)===S(r.updatedAt)}function V(e,r){const o=S(e.updatedAt),d=S(r.updatedAt);return o!==void 0&&(d===void 0||o>d)}function ye(){const[e,r]=c.useState(v),o=c.useRef(e),d=c.useCallback((i,t={})=>{const n=y(i);return o.current=n,r(n),t.writeLocal&&se(n),typeof window<"u"&&window.dispatchEvent(new CustomEvent(Z)),n},[]),l=c.useCallback(i=>{N()&&B(C,de(i))},[]),u=c.useCallback(i=>{const t=v(),n=V(t,o.current)?d(t):o.current,s=y(i(n));if(K(n,s))return;const p=ae(t.updatedAt,n.updatedAt),f=d({...s,updatedAt:p},{writeLocal:!0});l(f)},[d,l]),T=c.useCallback(i=>{g.has(i)&&u(t=>({...t,displayMode:i}))},[u]),x=c.useCallback(i=>{u(t=>({...t,showSubscriptions:!!i}))},[u]),M=c.useCallback(i=>{if(!g.has(i))return;const t=v();if(t.updatedAt!==void 0){d(t);return}d({...t,displayMode:i,updatedAt:void 0},{writeLocal:!0})},[d]);c.useEffect(()=>{if(!N())return;const i=F(t=>{const n=t?.[C];if(n&&typeof n=="object"){const s=y(n);if(!oe()){d(s,{writeLocal:!0});return}const p=v();if(V(s,p))d(s,{writeLocal:!0});else{const f=d(p);le(s,p)||l(f)}return}M(t?.[X])});return H(),i},[M,d,l]),c.useEffect(()=>{if(typeof window>"u")return;const i=t=>{(t.key===null||_.has(t.key))&&d(v())};return window.addEventListener("storage",i),()=>window.removeEventListener("storage",i)},[d]);const U=c.useCallback(i=>{m.includes(i)&&u(t=>({...t,providerVisibility:{...t.providerVisibility,[i]:!t.providerVisibility[i]}}))},[u]),Y=c.useCallback(i=>{u(t=>{const n=t.providerOrder.indexOf(i);if(n<=0)return t;const s=[...t.providerOrder];return[s[n-1],s[n]]=[s[n],s[n-1]],{...t,providerOrder:s}})},[u]),z=c.useCallback(i=>{u(t=>{const n=t.providerOrder.indexOf(i);if(n<0||n>=t.providerOrder.length-1)return t;const s=[...t.providerOrder];return[s[n],s[n+1]]=[s[n+1],s[n]],{...t,providerOrder:s}})},[u]),q=c.useCallback((i,t)=>{i!==t&&u(n=>{const s=n.providerOrder.indexOf(i),p=n.providerOrder.indexOf(t);if(s<0||p<0)return n;const f=[...n.providerOrder],[j]=f.splice(s,1);return f.splice(p,0,j),{...n,providerOrder:f}})},[u]),G=c.useCallback(()=>{u(()=>({displayMode:w.USED,providerOrder:h(),providerVisibility:b(),showSubscriptions:!0}))},[u]),J=c.useMemo(()=>e.providerOrder.filter(i=>e.providerVisibility[i]!==!1),[e.providerOrder,e.providerVisibility]);return{order:e.providerOrder,visibility:e.providerVisibility,displayMode:e.displayMode,showSubscriptions:e.showSubscriptions,setDisplayMode:T,setShowSubscriptions:x,visibleOrdered:J,toggle:U,moveUp:Y,moveDown:z,moveToward:q,reset:G}}export{Z as L,Se as a,w as b,Q as c,fe as d,we as i,me as l,ye as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as f}from"./__vite-browser-external-
|
|
1
|
+
import{r as f}from"./__vite-browser-external-dDN0mi9f.js";function O(t){if(typeof window>"u")return null;try{const n=window.localStorage.getItem(t);if(!n)return null;const i=JSON.parse(n);return Array.isArray(i)?i.filter(o=>typeof o=="string"):null}catch{return null}}function m(t,n){if(!(typeof window>"u"))try{window.localStorage.setItem(t,JSON.stringify(n))}catch{}}function S(t,n){if(!t)return n;const i=new Set(n),o=t.filter(u=>i.has(u)),c=n.filter(u=>!o.includes(u));return[...o,...c]}function p(t,n){const i=f.useMemo(()=>n.join("|"),[n]),[o,c]=f.useState(()=>S(O(t),n));f.useEffect(()=>{c(r=>{const e=S(r,n);return e.length===r.length&&e.every((l,d)=>l===r[d])?r:(m(t,e),e)})},[i,n,t]);const u=f.useCallback((r,e)=>{!r||!e||r===e||c(s=>{const l=s.indexOf(r),d=s.indexOf(e);if(l===-1||d===-1)return s;const w=s.slice(),[h]=w.splice(l,1);return w.splice(d,0,h),m(t,w),w})},[t]),a=f.useCallback(()=>{m(t,n),c(n)},[t,n]);return{order:o,reorder:u,reset:a}}export{p as u};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as o}from"./__vite-browser-external-dDN0mi9f.js";import{h as r,i as t,p as s}from"./react-Bl3I3D1L.js";function i(){!r.current&&t();const[e]=o.useState(s.current);return e}export{i as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{m as f,r as n}from"./__vite-browser-external-
|
|
1
|
+
import{m as f,r as n}from"./__vite-browser-external-dDN0mi9f.js";const u={name:"pencil",size:24,node:[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]]};u.node;const E=f(u),i="tt.qualityPerDollar.enabled";function l(){if(typeof window>"u")return!1;try{return window.localStorage.getItem(i)==="1"}catch{return!1}}function y(){const[r,o]=n.useState(l);n.useEffect(()=>{if(typeof window>"u")return;const t=e=>{(e.key===null||e.key===i)&&o(l())};return window.addEventListener("storage",t),()=>window.removeEventListener("storage",t)},[]);const a=n.useCallback(t=>{const e=!!t;o(e);try{window.localStorage.setItem(i,e?"1":"0")}catch{}},[]),s=n.useCallback(()=>a(!l()),[a]);return{enabled:r,setEnabled:a,toggle:s}}const d="tt.sessionEfficiency.enabled";function c(){if(typeof window>"u")return!1;try{return window.localStorage.getItem(d)==="1"}catch{return!1}}function g(){const[r,o]=n.useState(c);n.useEffect(()=>{if(typeof window>"u")return;const t=e=>{(e.key===null||e.key===d)&&o(c())};return window.addEventListener("storage",t),()=>window.removeEventListener("storage",t)},[]);const a=n.useCallback(t=>{const e=!!t;o(e);try{window.localStorage.setItem(d,e?"1":"0")}catch{}},[]),s=n.useCallback(()=>a(!c()),[a]);return{enabled:r,setEnabled:a,toggle:s}}export{E as P,g as a,y as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d as y,u as l,e as A,M as p,b as h,f as C,g as V,j as u}from"./react-
|
|
1
|
+
import{d as y,u as l,e as A,M as p,b as h,f as C,g as V,j as u}from"./react-Bl3I3D1L.js";import{r as f}from"./__vite-browser-external-dDN0mi9f.js";function x(...t){const e=!Array.isArray(t[0]),n=e?0:-1,o=t[0+n],s=t[1+n],c=t[2+n],r=t[3+n],a=y(s,c,r);return e?a(o):a}function E(t){const e=l(()=>A(t)),{isStatic:n}=f.useContext(p);if(n){const[,o]=f.useState(t);f.useEffect(()=>e.on("change",o),[])}return e}function m(t,e){const n=E(e()),o=()=>n.set(e());return o(),h(()=>{const s=()=>V.preRender(o,!1,!0),c=t.map(r=>r.on("change",s));return()=>{c.forEach(r=>r()),C(o)}}),n}function L(t){u.current=[],t();const e=m(u.current,t);return u.current=void 0,e}function g(t,e,n,o){if(typeof t=="function")return L(t);const c=typeof e=="function"?e:x(e,n,o),r=Array.isArray(t)?i(t,c):i([t],([d])=>c(d)),a=Array.isArray(t)?void 0:t.accelerate;return a&&!a.isTransformed&&typeof e!="function"&&Array.isArray(n)&&o?.clamp!==!1&&(r.accelerate={...a,times:e,keyframes:n,isTransformed:!0}),r}function i(t,e){const n=l(()=>[]);return m(t,()=>{n.length=0;const o=t.length;for(let s=0;s<o;s++)n[s]=t[s].get();return e(n)})}export{g as a,E as u};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{J as S,ab as x,r as w,c as N,ac as C,ad as O,ae as g}from"./__vite-browser-external-dDN0mi9f.js";import{l as R,i as _,L as P,a as q}from"./use-limits-display-prefs-BrBaoX2Q.js";import{u as z}from"./use-latest-request-guard-DkL6VAD-.js";const F="native:notificationPermission";let M=null;function I(){return typeof window<"u"&&!!window.chrome?.webview}function L(){return S()?M||"unknown":I()?"granted":typeof Notification>"u"?"unsupported":Notification.permission}function j(e){if(typeof window>"u")return()=>{};const n=i=>{const a=i?.detail?.status;typeof a=="string"&&(M=a),e(L())};return window.addEventListener(F,n),e(L()),S()&&x({type:"getNotificationStatus"}),()=>window.removeEventListener(F,n)}async function T(){if(S()){x({type:"requestNotificationPermission"});return}I()||typeof Notification<"u"&&Notification.permission==="default"&&await Notification.requestPermission().catch(()=>"denied")}const v="tt.limitAlerts.enabled";function $(){try{return window.localStorage.getItem(v)==="1"}catch{return!1}}function te(){const[e,n]=w.useState($),[i,a]=w.useState("unknown");w.useEffect(()=>j(a),[]);const y=w.useCallback(async o=>{const r=!!o;r&&await T();try{window.localStorage.setItem(v,r?"1":"0")}catch{}n(r)},[]);return{enabled:e,setEnabled:y,permissionBlocked:i==="denied"}}function B(e,n){if(!(e>0))return null;const i=(e-n)/e;return Number.isFinite(i)?Math.min(Math.max(i,0),1):null}function G(e,n,i=.03){return e>n+i}function V(e){const n=Math.max(0,Math.floor(e)),i=Math.floor(n/3600);return i>24?`${Math.floor(i/24)}d`:i>0?`${i}h`:`${Math.floor(n/60)}m`}function J(e,n){if(typeof e.windowSeconds=="number")return e.windowSeconds;if(e.windowSecondsField&&n){const i=n[e.windowSecondsField];return typeof i=="number"&&i>0?i:null}return null}function U(e){return e==null?NaN:typeof e=="number"?e*1e3:Date.parse(e)}function H({usedPercent:e,windowSeconds:n,resetMs:i,mode:a,now:y=Date.now()}){const o=Math.min(Math.max(Number(e)||0,0),100)/100,r={pacePercent:null,paceOver:!1,expectedPercent:null,runsOutEta:null,projectedEnd:null};if(!(n>0)||!Number.isFinite(i))return r;const l=Math.max(0,(i-y)/1e3),d=B(n,l);if(d==null)return r;if(r.expectedPercent=Math.round(d*100),r.paceOver=G(o,d),o>0){const c=a==="remaining"?1-d:d;r.pacePercent=c*100}if(d>.02&&o>0){const c=n*d,m=o/c,f=o/d;f>=1&&m>0?r.runsOutEta=V((1-o)/m):r.projectedEnd=Math.round(Math.min(f,1)*100)}return r}const W={claude:{windows(e){const n=Array.isArray(e.weekly_scoped)?e.weekly_scoped.map(i=>({key:`scoped-${i.label}`,label:i.label,window:i,pctField:"utilization",resetField:"resets_at",windowSeconds:604800})):[];return[{key:"5h",labelKey:"limits.label.claude_5h",window:e.five_hour,pctField:"utilization",resetField:"resets_at",windowSeconds:5*3600},{key:"7d",labelKey:"limits.label.claude_7d",window:e.seven_day,pctField:"utilization",resetField:"resets_at",windowSeconds:7*86400},{key:"opus",labelKey:"limits.label.claude_opus",window:e.seven_day_opus,pctField:"utilization",resetField:"resets_at",windowSeconds:7*86400},...n]}},codex:{extra:"codex_meta",windows(e){return[{key:"5h",labelKey:"limits.label.codex_5h",window:e.primary_window,windowSecondsField:"limit_window_seconds"},{key:"7d",labelKey:"limits.label.codex_7d",window:e.secondary_window,windowSecondsField:"limit_window_seconds"},{key:"credits",labelKey:"limits.label.codex_credits",window:e.credit_window},{key:"spark-5h",labelKey:"limits.label.codex_spark_5h",window:e.spark_primary_window,windowSecondsField:"limit_window_seconds"},{key:"spark-7d",labelKey:"limits.label.codex_spark_7d",window:e.spark_secondary_window,windowSecondsField:"limit_window_seconds"}]}},cursor:{windows(e){return[{key:"plan",labelKey:"limits.label.cursor_plan",window:e.primary_window,windowSecondsField:"limit_window_seconds"},{key:"auto",labelKey:"limits.label.cursor_auto",window:e.secondary_window,windowSecondsField:"limit_window_seconds"},{key:"api",labelKey:"limits.label.cursor_api",window:e.tertiary_window,windowSecondsField:"limit_window_seconds"},{key:"grok-bot",labelKey:"limits.label.cursor_grok_bot",window:e.quaternary_window,windowSecondsField:"limit_window_seconds"}]}},gemini:{windows(e){return[{key:"pro",labelKey:"limits.label.gemini_pro",window:e.primary_window},{key:"flash",labelKey:"limits.label.gemini_flash",window:e.secondary_window},{key:"lite",labelKey:"limits.label.gemini_lite",window:e.tertiary_window}]}},kimi:{extra:"kimi_parallel",windows(e){return[{key:"weekly",labelKey:"limits.label.kimi_weekly",window:e.primary_window,windowSeconds:7*86400},{key:"5h",labelKey:"limits.label.kimi_5h",window:e.secondary_window,windowSeconds:5*3600},{key:"total",labelKey:"limits.label.kimi_total",window:e.tertiary_window}]}},kiro:{extra:"kiro_credits",windows(e){return[{key:"month",labelKey:"limits.label.kiro_month",window:e.primary_window},{key:"bonus",labelKey:"limits.label.kiro_bonus",window:e.secondary_window}]}},grok:{windows(e){const n=typeof e.period_type=="string"?e.period_type:null,i=n==="weekly"?"limits.label.grok_week":n==="daily"?"limits.label.grok_day":"limits.label.grok_month",a=n==="weekly"?7*86400:n==="daily"?86400:void 0;return[{key:n==="weekly"?"week":n==="daily"?"day":"month",labelKey:i,window:e.primary_window,windowSeconds:a},{key:"ondemand",labelKey:"limits.label.grok_ondemand",window:e.secondary_window}]}},antigravity:{windows(e){return[{key:"claude-weekly",labelKey:"limits.label.antigravity_claude_weekly",window:e.primary_window},{key:"claude-5h",labelKey:"limits.label.antigravity_claude_5h",window:e.secondary_window},{key:"gemini-weekly",labelKey:"limits.label.antigravity_gemini_weekly",window:e.tertiary_window},{key:"gemini-5h",labelKey:"limits.label.antigravity_gemini_5h",window:e.quaternary_window}]}},copilot:{extra:"copilot_otel",windows(e){return[{key:"premium",labelKey:"limits.label.copilot_premium",window:e.primary_window},{key:"chat",labelKey:"limits.label.copilot_chat",window:e.secondary_window}]}},zcode:{windows(e){if(e.plan_kind==="coding-plan")return[{key:"5h",labelKey:"limits.label.zcode_5h",window:e.primary_window},{key:"weekly",labelKey:"limits.label.zcode_weekly",window:e.secondary_window},{key:"tools",labelKey:"limits.label.zcode_tools",window:e.tertiary_window}];const n=Array.isArray(e.buckets)?e.buckets.filter(i=>i?.label&&i.window):[];return n.length?n.map((i,a)=>({key:`bucket-${i.entitlement_id||a}`,label:i.label,window:i.window})):[{key:"glm52",labelKey:"limits.label.zcode_glm52",window:e.primary_window},{key:"glm5t",labelKey:"limits.label.zcode_glm5t",window:e.secondary_window}]}},opencodeGo:{windows(e){return[{key:"5h",labelKey:"limits.label.opencode_go_5h",window:e.primary_window},{key:"weekly",labelKey:"limits.label.opencode_go_weekly",window:e.secondary_window},{key:"monthly",labelKey:"limits.label.opencode_go_monthly",window:e.tertiary_window}]}},qoder:{windows(e){return[{key:"credits",labelKey:"limits.label.qoder_credits",window:e.primary_window},{key:"ultimate",labelKey:"limits.label.qoder_ultimate",window:e.secondary_window,timeKind:"expiry"}]}},qoderCn:{windows(e){return[{key:"credits",labelKey:"limits.label.qoder_cn_credits",window:e.primary_window},{key:"ultimate",labelKey:"limits.label.qoder_cn_ultimate",window:e.secondary_window,timeKind:"expiry"}]}},codingPlan:{windows(e){return[{key:"5h",labelKey:"limits.label.ark_coding_plan_5h",window:e.primary_window},{key:"weekly",labelKey:"limits.label.ark_coding_plan_weekly",window:e.secondary_window},{key:"monthly",labelKey:"limits.label.ark_coding_plan_monthly",window:e.tertiary_window}]}},commandCode:{windows(e){return[{key:"5h",labelKey:"limits.label.command_code_5h",window:e.primary_window},{key:"weekly",labelKey:"limits.label.command_code_weekly",window:e.secondary_window}]}},agentPlan:{windows(e){return[{key:"5h",labelKey:"limits.label.ark_agent_plan_5h",window:e.primary_window},{key:"weekly",labelKey:"limits.label.ark_agent_plan_weekly",window:e.secondary_window},{key:"monthly",labelKey:"limits.label.ark_agent_plan_monthly",window:e.tertiary_window}]}},devin:{windows(e){return[{key:"daily",labelKey:"limits.label.devin_daily",window:e.primary_window,windowSecondsField:"limit_window_seconds"},{key:"weekly",labelKey:"limits.label.devin_weekly",window:e.secondary_window,windowSecondsField:"limit_window_seconds"}]}}},D="tt.limitAlerts.cycles.v1";function Y(){try{return JSON.parse(window.localStorage.getItem(D)||"{}")}catch{return{}}}function Q(e){try{window.localStorage.setItem(D,JSON.stringify(e))}catch{}}function X(e,{now:n=Date.now()}={}){const i=[],a=W;for(const[y,o]of Object.entries(e||{})){const r=a[y];if(!(!o?.configured||o.error||!r))for(const l of r.windows(o)){if(!l.window)continue;const d=Number(l.pctField==="utilization"?l.window.utilization:l.window.used_percent),c=l.resetField==="resets_at"?l.window.resets_at:l.window.reset_at,m=U(c),f=H({usedPercent:d,windowSeconds:J(l,l.window),resetMs:m,mode:"used",now:n});!f.runsOutEta||!f.paceOver||d<20||!(m>n)||i.push({id:`${y}:${l.key}:${m}`,providerId:y,windowKey:l.key,resetMs:m,usedPercent:d,runsOutEta:f.runsOutEta})}}return i}function Z(e){const n=Y(),i=X(e);for(const o of i){if(n[o.id])continue;const r=R(o.providerId),l=N("limits.alert.title",{provider:r}),d=N("limits.alert.body",{eta:o.runsOutEta,percent:Math.round(o.usedPercent)});let c=C({title:l,body:d,id:o.id});!c&&typeof Notification<"u"&&Notification.permission==="granted"&&(new Notification(l,{body:d,tag:o.id}),c=!0),c&&(n[o.id]=Date.now())}const a=Date.now()-864e5,y=Object.fromEntries(Object.entries(n).filter(([o,r])=>{const l=Number(o.split(":").at(-1));return Number.isFinite(l)?l>=a:Number(r)>=a}).slice(-100));return Q(y),i.length}function k(e,n){return!e||n||!e.devin||e.devin.configured===!1&&Object.keys(e.devin).length===1?e:{...e,devin:{configured:!1}}}function oe(e){const n=!!e?.initialState,[i,a]=w.useState(_),[y,o]=w.useState(()=>n?k(e?.initialState?.data??null,_()):null),[r,l]=w.useState(()=>n?e?.initialState?.error??null:null),[d,c]=w.useState(!n),m=!!e?.initialRefresh,f=!!e?.publishToPreloadCache,b=z([i]);w.useEffect(()=>{if(typeof window>"u")return;const s=()=>a(_()),t=u=>{q(u.key)&&s()};return window.addEventListener(P,s),window.addEventListener("storage",t),()=>{window.removeEventListener(P,s),window.removeEventListener("storage",t)}},[]),w.useEffect(()=>{if(!(!y||typeof window>"u"))try{window.localStorage.getItem(v)==="1"&&Z(y)}catch{}},[y]);const p=w.useCallback((s,t)=>{!f||!s||typeof s!="object"||O(k(s,_()),{source:t})},[f]),A=w.useCallback(async()=>{const s=b();try{const t=await g({refresh:!0,devinEnabled:_()});if(!s())return;const u=t&&typeof t=="object"?t:null;o(k(u,_())),l(null),c(!1),p(u,"manual-refresh")}catch(t){if(!s())return;l(t?.message||String(t)),c(!1)}},[b,p]),h=w.useCallback(async()=>{const s=b();try{const t=await g({devinEnabled:_()});if(!s())return;const u=t&&typeof t=="object"?t:null;o(k(u,_())),l(null),c(!1),p(u,"page-load")}catch(t){if(!s())return;l(t?.message||String(t)),c(!1)}},[b,p]);w.useEffect(()=>{if(typeof window>"u"||typeof document>"u")return;const s=15e3;let t=Date.now();const u=()=>{if(document.visibilityState!=="visible")return;const E=Date.now();E-t<s||(t=E,h())};return window.addEventListener("focus",u),document.addEventListener("visibilitychange",u),()=>{window.removeEventListener("focus",u),document.removeEventListener("visibilitychange",u)}},[h]);const K=w.useRef(i);return w.useEffect(()=>{K.current!==i&&(K.current=i,i||o(s=>k(s,!1)),h())},[i,h]),w.useEffect(()=>{if(n&&!m)return;const s=b();(async()=>{try{const t=await g({devinEnabled:_()});if(!s())return;const u=t&&typeof t=="object"?t:null;o(k(u,_())),l(null),p(u,"page-load")}catch(t){if(!s())return;l(t?.message||String(t))}finally{s()&&c(!1)}})()},[b,n,m,p]),{data:y,error:r,isLoading:d,refresh:A}}export{W as P,J as a,te as b,H as c,U as r,Z as s,oe as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e,C as t,D as r,q as c}from"./__vite-browser-external-
|
|
1
|
+
import{r as e,C as t,D as r,q as c}from"./__vite-browser-external-dDN0mi9f.js";const s=Object.freeze({currency:c,rate:1,symbol:"$",rates:{...r},rateSource:"default",rateFetchedAt:null,setCurrency:()=>{}});function a(){return e.useContext(t)??s}export{a as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e,T as r,n,o as a,p as s}from"./__vite-browser-external-
|
|
1
|
+
import{r as e,T as r,n,o as a,p as s}from"./__vite-browser-external-dDN0mi9f.js";const T=Object.freeze({mode:n.COMPACT,setMode:()=>{},formatTokens:(o,t={})=>s(o,t),formatTokensTooltip:(o,t={})=>a(o,t)});function f(){return e.useContext(r)??T}export{f as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{m as e}from"./__vite-browser-external-
|
|
1
|
+
import{m as e}from"./__vite-browser-external-dDN0mi9f.js";const a={name:"zap",size:24,node:[["path",{d:"M15.914 4a1.5 1.5 0 00-2.474-1.561l-9 9A1.5 1.5 0 005.5 14h4.002a.5.5 0 01.471.666L8.086 20a1.5 1.5 0 002.475 1.56l9-9A1.5 1.5 0 0018.5 10h-3.997a.5.5 0 01-.472-.667z",key:"1v7up4"}]]};a.node;const n=e(a);export{n as Z};
|
|
Binary file
|
|
@@ -123,7 +123,7 @@
|
|
|
123
123
|
"price": "0",
|
|
124
124
|
"priceCurrency": "USD"
|
|
125
125
|
},
|
|
126
|
-
"description": "Local-first AI coding usage tracker for
|
|
126
|
+
"description": "Local-first AI coding usage tracker for 41 tools, with a desktop pet, four widgets, achievements, native macOS and Windows apps, accurate cross-provider deduplication, and no prompt collection."
|
|
127
127
|
},
|
|
128
128
|
{
|
|
129
129
|
"@type": "WebSite",
|
|
@@ -203,7 +203,8 @@
|
|
|
203
203
|
{ "@type": "ListItem", "position": 37, "name": "Unsloth Studio" },
|
|
204
204
|
{ "@type": "ListItem", "position": 38, "name": "Devin CLI" },
|
|
205
205
|
{ "@type": "ListItem", "position": 39, "name": "OmO" },
|
|
206
|
-
{ "@type": "ListItem", "position": 40, "name": "
|
|
206
|
+
{ "@type": "ListItem", "position": 40, "name": "Cline" },
|
|
207
|
+
{ "@type": "ListItem", "position": 41, "name": "MiniMax Code" }
|
|
207
208
|
]
|
|
208
209
|
},
|
|
209
210
|
{
|
|
@@ -222,7 +223,7 @@
|
|
|
222
223
|
"name": "Which AI coding CLIs does Token Tracker support?",
|
|
223
224
|
"acceptedAnswer": {
|
|
224
225
|
"@type": "Answer",
|
|
225
|
-
"text": "Token Tracker supports
|
|
226
|
+
"text": "Token Tracker supports 41 AI coding tools, including Claude Code, Codex CLI, AStudio, Cursor, Gemini CLI, Antigravity, Kiro, OpenCode, OpenClaw, Every Code, Hermes Agent, GitHub Copilot, Kimi Code, CodeBuddy, WorkBuddy, Grok Build, oh-my-pi, OmO, pi, Dots, Prime Agent, Craft Agents, Reasonix, Kilo CLI, Kilo Code, Roo Code, Zed Agent, Goose, Droid, Mimo Code, ZCode, Qoder, AnythingLLM Desktop, Claude Science, DeepSeek Harness, TRAE Work CN, LM Studio, Unsloth Studio, Devin CLI, Cline, and MiniMax Code."
|
|
226
227
|
}
|
|
227
228
|
},
|
|
228
229
|
{
|
|
@@ -254,7 +255,7 @@
|
|
|
254
255
|
"name": "How do I monitor AI token usage and cost across tools?",
|
|
255
256
|
"acceptedAnswer": {
|
|
256
257
|
"@type": "Answer",
|
|
257
|
-
"text": "Install Token Tracker with npx tokentracker-cli. It is an AI token usage and cost tracker that monitors token consumption and spend across all
|
|
258
|
+
"text": "Install Token Tracker with npx tokentracker-cli. It is an AI token usage and cost tracker that monitors token consumption and spend across all 41 supported tools in one dashboard, with per-model pricing across 2,200+ models so you can see cost by model, project, and time window without manual tracking."
|
|
258
259
|
}
|
|
259
260
|
},
|
|
260
261
|
{
|
|
@@ -270,7 +271,7 @@
|
|
|
270
271
|
]
|
|
271
272
|
}
|
|
272
273
|
</script>
|
|
273
|
-
<script type="module" crossorigin src="/assets/__vite-browser-external-
|
|
274
|
+
<script type="module" crossorigin src="/assets/__vite-browser-external-dDN0mi9f.js"></script>
|
|
274
275
|
<link rel="stylesheet" crossorigin href="/assets/__vite-browser-external-5P7me0Qq.css">
|
|
275
276
|
</head>
|
|
276
277
|
<body>
|
|
@@ -278,7 +279,7 @@
|
|
|
278
279
|
<h1>Token Tracker: monitor AI token usage and cost with a local dashboard and desktop companion</h1>
|
|
279
280
|
<p>
|
|
280
281
|
Token Tracker is a free, open-source, local-first dashboard that automatically tracks and monitors token usage
|
|
281
|
-
and cost across
|
|
282
|
+
and cost across 41 AI coding tools — including Claude Code, OpenAI Codex, AStudio, Cursor, Gemini CLI, LM Studio, and Unsloth Studio. A desktop pet
|
|
282
283
|
reacts to real token activity, four desktop widgets
|
|
283
284
|
keep usage visible, and achievements turn coding history into progress. Native macOS and Windows apps
|
|
284
285
|
sit on top of accurate cross-provider deduplication. Token counts only — never prompts or conversations.
|
|
@@ -303,7 +304,7 @@
|
|
|
303
304
|
<li><strong>Desktop pet</strong> — a pixel companion that reacts to real token burn, streaks, and rest.</li>
|
|
304
305
|
<li><strong>Four desktop widgets</strong> — usage, activity heatmap, top models, and limits at a glance.</li>
|
|
305
306
|
<li><strong>Achievements</strong> — unlock milestones from local and optional account-wide activity.</li>
|
|
306
|
-
<li><strong>Unified usage dashboard</strong> — input, output, cached, and cache-creation tokens across
|
|
307
|
+
<li><strong>Unified usage dashboard</strong> — input, output, cached, and cache-creation tokens across 41 AI coding tools.</li>
|
|
307
308
|
<li><strong>Cost analysis</strong> — per-model pricing across 2,200+ models with an offline snapshot.</li>
|
|
308
309
|
<li><strong>Usage limits view</strong> — live quota and subscription status for 17 providers, with last-good caching for local providers such as Antigravity and Qoder.</li>
|
|
309
310
|
<li><strong>Service Status page</strong> — live operational and incident status from eight official provider status pages.</li>
|
|
@@ -314,11 +315,11 @@
|
|
|
314
315
|
</ul>
|
|
315
316
|
<p><em>Privacy by design</em>: token counts only, never prompts or conversation content. Local-first; cloud sync is optional and powers only the public leaderboard.</p>
|
|
316
317
|
|
|
317
|
-
<h2>Supported AI coding tools (
|
|
318
|
+
<h2>Supported AI coding tools (41)</h2>
|
|
318
319
|
<p>
|
|
319
320
|
Use Token Tracker as a Claude Code token tracker, Codex token tracker, Cursor token tracker,
|
|
320
321
|
Gemini token tracker, OpenCode token tracker, GitHub Copilot token tracker, or DeepSeek Harness token tracker — one dashboard
|
|
321
|
-
covers all
|
|
322
|
+
covers all 41 tools below.
|
|
322
323
|
</p>
|
|
323
324
|
<ul>
|
|
324
325
|
<li><strong>Claude Code</strong> — Anthropic's official coding agent CLI; integrated via SessionEnd hook.</li>
|
|
@@ -360,6 +361,7 @@
|
|
|
360
361
|
<li><strong>LM Studio</strong> — passive local developer-server usage reader with mirrored-response deduplication.</li>
|
|
361
362
|
<li><strong>Unsloth Studio</strong> — passive scalar-only SQLite usage reader for local and paid-provider chat routes.</li>
|
|
362
363
|
<li><strong>Devin CLI</strong> — passive per-request SQLite usage reader deduplicated by request_id.</li>
|
|
364
|
+
<li><strong>Cline</strong> — CLI v3 / desktop app; passive <code>~/.cline/data/sessions</code> transcript reader.</li>
|
|
363
365
|
<li><strong>MiniMax Code</strong> — passive JSONL session reader for the MiniMax desktop coding agent, deduplicated by message_id.</li>
|
|
364
366
|
</ul>
|
|
365
367
|
|
|
@@ -391,7 +393,7 @@
|
|
|
391
393
|
<p>Run <code>npx tokentracker-cli</code>. The CLI auto-detects your AI coding tools, installs hooks, and opens the dashboard.</p>
|
|
392
394
|
|
|
393
395
|
<h3>Which AI coding tools does Token Tracker support?</h3>
|
|
394
|
-
<p>Token Tracker supports
|
|
396
|
+
<p>Token Tracker supports 41 tools: Claude Code, Codex CLI, AStudio, Cursor, Gemini CLI, Antigravity, Kiro, OpenCode, OpenClaw, Every Code, Hermes Agent, GitHub Copilot, Kimi Code, CodeBuddy, WorkBuddy, Grok Build, oh-my-pi, OmO, pi, Dots, Prime Agent, Craft Agents, Reasonix, Kilo CLI, Kilo Code, Roo Code, Zed Agent, Goose, Droid, Mimo Code, ZCode, Qoder, AnythingLLM Desktop, Claude Science, DeepSeek Harness, TRAE Work CN, LM Studio, Unsloth Studio, Devin CLI, Cline, and MiniMax Code.</p>
|
|
395
397
|
|
|
396
398
|
<h3>Is Token Tracker free and open source?</h3>
|
|
397
399
|
<p>Yes. Source on GitHub at <a href="https://github.com/xiufengsun/TokenTracker">github.com/xiufengsun/TokenTracker</a>; npm package <code>tokentracker-cli</code>.</p>
|
|
@@ -403,7 +405,7 @@
|
|
|
403
405
|
<p>Input, output, cached, and cache-creation tokens per model, project, and time window. It also surfaces usage limits for 17 providers, including Claude, Codex, Cursor, Gemini, Antigravity, Qoder, Qoder CN, Command Code, and Devin.</p>
|
|
404
406
|
|
|
405
407
|
<h3>How do I monitor AI token usage and cost across tools?</h3>
|
|
406
|
-
<p>Token Tracker is an AI token usage and cost tracker: install it with <code>npx tokentracker-cli</code>, and it monitors token consumption and spend across all
|
|
408
|
+
<p>Token Tracker is an AI token usage and cost tracker: install it with <code>npx tokentracker-cli</code>, and it monitors token consumption and spend across all 41 tools in one dashboard, with per-model pricing across 2,200+ models so you can see cost by model, project, and time window without manual tracking.</p>
|
|
407
409
|
|
|
408
410
|
<h3>Does Token Tracker work offline?</h3>
|
|
409
411
|
<p>Yes. Token Tracker is local-first. All parsing, aggregation, and dashboard rendering happen on your machine. Cloud sync is optional and powers only the public leaderboard.</p>
|
|
@@ -165,7 +165,7 @@
|
|
|
165
165
|
]
|
|
166
166
|
}
|
|
167
167
|
</script>
|
|
168
|
-
<script type="module" crossorigin src="/assets/__vite-browser-external-
|
|
168
|
+
<script type="module" crossorigin src="/assets/__vite-browser-external-dDN0mi9f.js"></script>
|
|
169
169
|
<link rel="stylesheet" crossorigin href="/assets/__vite-browser-external-5P7me0Qq.css">
|
|
170
170
|
</head>
|
|
171
171
|
<body>
|
|
@@ -136,7 +136,7 @@
|
|
|
136
136
|
]
|
|
137
137
|
}
|
|
138
138
|
</script>
|
|
139
|
-
<script type="module" crossorigin src="/assets/__vite-browser-external-
|
|
139
|
+
<script type="module" crossorigin src="/assets/__vite-browser-external-dDN0mi9f.js"></script>
|
|
140
140
|
<link rel="stylesheet" crossorigin href="/assets/__vite-browser-external-5P7me0Qq.css">
|
|
141
141
|
</head>
|
|
142
142
|
<body>
|
package/dashboard/dist/llms.txt
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Token Tracker LLMs Index
|
|
2
2
|
|
|
3
3
|
Token Tracker is a free, open-source, local-first AI coding usage and cost
|
|
4
|
-
tracker for
|
|
4
|
+
tracker for 41 tools. Its distinctive desktop experience includes a pixel pet
|
|
5
5
|
powered by real token activity, four desktop widgets, and achievements. The
|
|
6
6
|
same data powers a cross-platform CLI, a native macOS menu bar app, a native
|
|
7
7
|
Windows system tray app, and a dashboard. It records token counts and
|
|
@@ -23,7 +23,7 @@ timestamps, never prompts, responses, or source code.
|
|
|
23
23
|
- [npm package](https://www.npmjs.com/package/tokentracker-cli)
|
|
24
24
|
- [Latest release](https://github.com/xiufengsun/TokenTracker/releases/latest)
|
|
25
25
|
|
|
26
|
-
## Supported AI coding tools (
|
|
26
|
+
## Supported AI coding tools (41)
|
|
27
27
|
- Claude Code
|
|
28
28
|
- Codex CLI
|
|
29
29
|
- AStudio
|
|
@@ -63,6 +63,7 @@ timestamps, never prompts, responses, or source code.
|
|
|
63
63
|
- LM Studio
|
|
64
64
|
- Unsloth Studio
|
|
65
65
|
- Devin CLI
|
|
66
|
+
- Cline
|
|
66
67
|
- MiniMax Code
|
|
67
68
|
|
|
68
69
|
## Capabilities
|
|
@@ -75,7 +75,7 @@
|
|
|
75
75
|
"description": "Shareable Token Tracker dashboard snapshot."
|
|
76
76
|
}
|
|
77
77
|
</script>
|
|
78
|
-
<script type="module" crossorigin src="/assets/__vite-browser-external-
|
|
78
|
+
<script type="module" crossorigin src="/assets/__vite-browser-external-dDN0mi9f.js"></script>
|
|
79
79
|
<link rel="stylesheet" crossorigin href="/assets/__vite-browser-external-5P7me0Qq.css">
|
|
80
80
|
</head>
|
|
81
81
|
<body>
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tokentracker-cli",
|
|
3
|
-
"version": "1.0
|
|
4
|
-
"description": "Local-first AI coding token usage and cost tracker for
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "Local-first AI coding token usage and cost tracker for 41 tools, with a dashboard, desktop pet, widgets, achievements, and native macOS/Windows apps.",
|
|
5
5
|
"main": "src/cli.js",
|
|
6
6
|
"bin": {
|
|
7
7
|
"tokentracker-cli": "bin/tracker.js",
|
package/src/commands/init.js
CHANGED
|
@@ -152,6 +152,7 @@ const SUPPORTED_PROVIDERS = [
|
|
|
152
152
|
"LM Studio",
|
|
153
153
|
"Unsloth Studio",
|
|
154
154
|
"Devin CLI",
|
|
155
|
+
"Cline",
|
|
155
156
|
"MiniMax Code",
|
|
156
157
|
];
|
|
157
158
|
|
|
@@ -954,6 +955,30 @@ async function applyIntegrationSetup({
|
|
|
954
955
|
}
|
|
955
956
|
}
|
|
956
957
|
|
|
958
|
+
// Cline CLI v3 / desktop app: passive reader — no hook installation needed.
|
|
959
|
+
// Cline keeps its own data dir (~/.cline/data/sessions, overridable through
|
|
960
|
+
// CLINE_DIR/CLINE_DATA_DIR/CLINE_SESSION_DATA_DIR); the VS Code extension's
|
|
961
|
+
// globalStorage layout is a separate, older install we do not read.
|
|
962
|
+
{
|
|
963
|
+
const { resolveClineSessionFilesWithStatus } = require("../lib/rollout");
|
|
964
|
+
const clineScan = resolveClineSessionFilesWithStatus(process.env);
|
|
965
|
+
const sessionFiles = clineScan.files;
|
|
966
|
+
if (sessionFiles.length > 0) {
|
|
967
|
+
summary.push({
|
|
968
|
+
label: "Cline",
|
|
969
|
+
status: "detected",
|
|
970
|
+
detail: `Passive reader · ${sessionFiles.length} transcript${sessionFiles.length !== 1 ? "s" : ""}`,
|
|
971
|
+
});
|
|
972
|
+
}
|
|
973
|
+
for (const failure of clineScan.errors) {
|
|
974
|
+
summary.push({
|
|
975
|
+
label: "Cline",
|
|
976
|
+
status: "error",
|
|
977
|
+
detail: `Passive reader discovery failed · ${failure.root}: ${failure.error.code ? `${failure.error.code}: ` : ""}${failure.error.message}`,
|
|
978
|
+
});
|
|
979
|
+
}
|
|
980
|
+
}
|
|
981
|
+
|
|
957
982
|
// CodeBuddy: Claude-Code fork. Install the SessionEnd hook so finished
|
|
958
983
|
// sessions trigger notify.cjs → tracker sync; passive scan still runs as a
|
|
959
984
|
// safety net for sessions that don't fire SessionEnd cleanly.
|
package/src/commands/status.js
CHANGED
|
@@ -75,6 +75,7 @@ const {
|
|
|
75
75
|
resolveReasonixTelemetryFiles,
|
|
76
76
|
resolveKilocodeTaskFiles,
|
|
77
77
|
resolveRoocodeTaskFiles,
|
|
78
|
+
resolveClineSessionFilesWithStatus,
|
|
78
79
|
resolveZedDbPath,
|
|
79
80
|
resolveLmstudioHome,
|
|
80
81
|
resolveLmstudioLogFiles,
|
|
@@ -690,6 +691,21 @@ async function cmdStatus(argv = []) {
|
|
|
690
691
|
const roocodeTaskFiles = resolveRoocodeTaskFiles(process.env);
|
|
691
692
|
const roocodeInstalled = roocodeTaskFiles.length > 0;
|
|
692
693
|
|
|
694
|
+
// Cline CLI v3 / desktop app — passive scan of
|
|
695
|
+
// <home>/data/sessions/*/<session>.messages.json (Cline's own data dir, not
|
|
696
|
+
// the VS Code globalStorage the Roo/Kilo forks still use).
|
|
697
|
+
const clineScan = resolveClineSessionFilesWithStatus(process.env);
|
|
698
|
+
const clineSessionFiles = clineScan.files;
|
|
699
|
+
const clineInstalled = clineSessionFiles.length > 0;
|
|
700
|
+
const clineSessionsDirCount = new Set(
|
|
701
|
+
clineSessionFiles.map((file) => path.dirname(path.dirname(file.filePath))),
|
|
702
|
+
).size;
|
|
703
|
+
const clineDiscoveryError = clineScan.errors.length > 0
|
|
704
|
+
? clineScan.errors
|
|
705
|
+
.map(({ root, error }) => `${root}: ${error.code ? `${error.code}: ` : ""}${error.message}`)
|
|
706
|
+
.join("; ")
|
|
707
|
+
: null;
|
|
708
|
+
|
|
693
709
|
// Zed Agent — passive read of threads.db across all model providers
|
|
694
710
|
// (hosted "zed.dev" and bring-your-own alike). threadTotals tracks one entry
|
|
695
711
|
// per thread we've surfaced usage for, so its size distinguishes "DB present
|
|
@@ -1048,6 +1064,15 @@ async function cmdStatus(argv = []) {
|
|
|
1048
1064
|
roocode: roocodeInstalled
|
|
1049
1065
|
? { installed: true, files: roocodeTaskFiles.length }
|
|
1050
1066
|
: { installed: false },
|
|
1067
|
+
cline: clineInstalled
|
|
1068
|
+
? {
|
|
1069
|
+
installed: true,
|
|
1070
|
+
files: clineSessionFiles.length,
|
|
1071
|
+
...(clineDiscoveryError ? { error: clineDiscoveryError } : {}),
|
|
1072
|
+
}
|
|
1073
|
+
: clineDiscoveryError
|
|
1074
|
+
? { installed: false, error: clineDiscoveryError }
|
|
1075
|
+
: { installed: false },
|
|
1051
1076
|
zed: zedInstalled ? { installed: true, detail: zedDbPath } : { installed: false },
|
|
1052
1077
|
goose: gooseInstalled
|
|
1053
1078
|
? { installed: true, detail: gooseDbPath }
|
|
@@ -1242,6 +1267,11 @@ async function cmdStatus(argv = []) {
|
|
|
1242
1267
|
roocodeInstalled
|
|
1243
1268
|
? `- Roo Code (VS Code extension): passive reader (${roocodeTaskFiles.length} task${roocodeTaskFiles.length !== 1 ? "s" : ""} across ${new Set(roocodeTaskFiles.map((t) => t.ide)).size} IDE${new Set(roocodeTaskFiles.map((t) => t.ide)).size !== 1 ? "s" : ""})`
|
|
1244
1269
|
: null,
|
|
1270
|
+
clineInstalled
|
|
1271
|
+
? `- Cline: passive reader (${clineSessionFiles.length} transcript${clineSessionFiles.length !== 1 ? "s" : ""} in ${clineSessionsDirCount} sessions dir${clineSessionsDirCount !== 1 ? "s" : ""})${clineDiscoveryError ? `; discovery failed (${clineDiscoveryError})` : ""}`
|
|
1272
|
+
: clineDiscoveryError
|
|
1273
|
+
? `- Cline: discovery failed (${clineDiscoveryError})`
|
|
1274
|
+
: null,
|
|
1245
1275
|
zedInstalled
|
|
1246
1276
|
? `- Zed Agent: passive reader (threads.db, all providers${
|
|
1247
1277
|
zedThreadsCounted > 0
|
|
@@ -1470,6 +1500,7 @@ function renderLightTable(summary) {
|
|
|
1470
1500
|
if (typeof info.installed === "boolean") detail.push(info.installed ? "installed" : "not installed");
|
|
1471
1501
|
if (typeof info.files === "number") detail.push(`${info.files} file${info.files !== 1 ? "s" : ""}`);
|
|
1472
1502
|
if (info.detail) detail.push(info.detail);
|
|
1503
|
+
if (info.error) detail.push(info.error);
|
|
1473
1504
|
if (Array.isArray(info.wsl_distros) && info.wsl_distros.length) {
|
|
1474
1505
|
detail.push(`WSL: ${info.wsl_distros.map((d) => `${d.name} (v${d.version ?? "?"})`).join(", ")}`);
|
|
1475
1506
|
}
|
package/src/commands/sync.js
CHANGED
|
@@ -115,6 +115,8 @@ const {
|
|
|
115
115
|
parseKilocodeIncremental,
|
|
116
116
|
resolveRoocodeTaskFiles,
|
|
117
117
|
parseRoocodeIncremental,
|
|
118
|
+
resolveClineSessionFilesWithStatus,
|
|
119
|
+
parseClineIncremental,
|
|
118
120
|
resolveZedDbPath,
|
|
119
121
|
parseZedIncremental,
|
|
120
122
|
resolveLmstudioLogFiles,
|
|
@@ -295,6 +297,7 @@ const AUTO_SYNC_SOURCES = new Set([
|
|
|
295
297
|
"anythingllm",
|
|
296
298
|
"claude",
|
|
297
299
|
"claude-science",
|
|
300
|
+
"cline",
|
|
298
301
|
"codebuddy",
|
|
299
302
|
"codex",
|
|
300
303
|
"copilot",
|
|
@@ -1889,6 +1892,40 @@ async function cmdSync(argv, context = {}) {
|
|
|
1889
1892
|
}
|
|
1890
1893
|
}
|
|
1891
1894
|
|
|
1895
|
+
// ── Cline (CLI v3 / desktop app — ~/.cline/data/sessions) ──
|
|
1896
|
+
let clineResult = { recordsProcessed: 0, eventsAggregated: 0, bucketsQueued: 0 };
|
|
1897
|
+
if (sourceAllowed("cline")) {
|
|
1898
|
+
try {
|
|
1899
|
+
const clineScan = resolveClineSessionFilesWithStatus(process.env);
|
|
1900
|
+
const clineSessionFiles = clineScan.files;
|
|
1901
|
+
for (const failure of clineScan.errors) {
|
|
1902
|
+
warnProviderParseFailure("Cline", failure.error, opts);
|
|
1903
|
+
}
|
|
1904
|
+
if (progress?.enabled && clineSessionFiles.length > 0) {
|
|
1905
|
+
progress.start(
|
|
1906
|
+
`Parsing Cline ${renderBar(0)} 0/${formatNumber(clineSessionFiles.length)} transcripts | buckets 0`,
|
|
1907
|
+
);
|
|
1908
|
+
}
|
|
1909
|
+
clineResult = await parseClineIncremental({
|
|
1910
|
+
sessionFiles: clineSessionFiles,
|
|
1911
|
+
scanCompleteRoots: clineScan.completedRoots,
|
|
1912
|
+
cursors,
|
|
1913
|
+
queuePath,
|
|
1914
|
+
onProgress: (p) => {
|
|
1915
|
+
if (!progress?.enabled) return;
|
|
1916
|
+
const pct = p.total > 0 ? p.index / p.total : 1;
|
|
1917
|
+
progress.update(
|
|
1918
|
+
`Parsing Cline ${renderBar(pct)} ${formatNumber(p.index)}/${formatNumber(
|
|
1919
|
+
p.total,
|
|
1920
|
+
)} transcripts | buckets ${formatNumber(p.bucketsQueued)}`,
|
|
1921
|
+
);
|
|
1922
|
+
},
|
|
1923
|
+
});
|
|
1924
|
+
} catch (err) {
|
|
1925
|
+
warnProviderParseFailure("Cline", err, opts);
|
|
1926
|
+
}
|
|
1927
|
+
}
|
|
1928
|
+
|
|
1892
1929
|
// ── Cursor (API-based) ──
|
|
1893
1930
|
// One-time migration: earlier CLI versions mis-parsed the Cursor CSV after
|
|
1894
1931
|
// Cursor inserted new "Cloud Agent ID"/"Automation ID" columns, writing
|
|
@@ -3057,6 +3094,7 @@ async function cmdSync(argv, context = {}) {
|
|
|
3057
3094
|
zcodeResult.recordsProcessed +
|
|
3058
3095
|
kilocodeResult.recordsProcessed +
|
|
3059
3096
|
roocodeResult.recordsProcessed +
|
|
3097
|
+
clineResult.recordsProcessed +
|
|
3060
3098
|
zedResult.recordsProcessed +
|
|
3061
3099
|
gooseResult.recordsProcessed +
|
|
3062
3100
|
dshResult.recordsProcessed +
|
|
@@ -3098,6 +3136,7 @@ async function cmdSync(argv, context = {}) {
|
|
|
3098
3136
|
zcodeResult.bucketsQueued +
|
|
3099
3137
|
kilocodeResult.bucketsQueued +
|
|
3100
3138
|
roocodeResult.bucketsQueued +
|
|
3139
|
+
clineResult.bucketsQueued +
|
|
3101
3140
|
zedResult.bucketsQueued +
|
|
3102
3141
|
gooseResult.bucketsQueued +
|
|
3103
3142
|
dshResult.bucketsQueued +
|