tokentracker-cli 0.97.2 → 0.98.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/dashboard/dist/assets/AchievementBadge-DlZklawB.js +1 -0
- package/dashboard/dist/assets/{AchievementsPage-CnkSNpJx.js → AchievementsPage-CprbOKnt.js} +2 -2
- package/dashboard/dist/assets/AchievementsSection-BKLJBRKw.js +1 -0
- package/dashboard/dist/assets/{BadgeDetailModal-BJBrgn24.js → BadgeDetailModal-CfVXLh_t.js} +1 -1
- package/dashboard/dist/assets/{BotAnimated-BJM20N9T.js → BotAnimated-wzqeGbEY.js} +1 -1
- package/dashboard/dist/assets/{Card-BRWOMoBk.js → Card-B-gcOAn7.js} +1 -1
- package/dashboard/dist/assets/{ClawdAnimated-CtX8cne4.js → ClawdAnimated-1c5ezBBN.js} +2 -2
- package/dashboard/dist/assets/CommandPalette-CD8ggEF6.js +1 -0
- package/dashboard/dist/assets/CommunityStatsModal-b2fPhi1E.js +1 -0
- package/dashboard/dist/assets/{ConfirmModal-ZZXg_OLV.js → ConfirmModal-ARBkT8AC.js} +1 -1
- package/dashboard/dist/assets/{Controls-VDvgw_ed.js → Controls-WFXDjIYG.js} +1 -1
- package/dashboard/dist/assets/DashboardPage-XtiZa2JN.js +1 -0
- package/dashboard/dist/assets/{DevicePage-CP5m8azV.js → DevicePage-BCwSpNXa.js} +1 -1
- package/dashboard/dist/assets/{DialogClose-8pTCallP.js → DialogClose-D2PE0TAc.js} +1 -1
- package/dashboard/dist/assets/DialogDescription-5LunWukT.js +1 -0
- package/dashboard/dist/assets/{DialogTitle-BWYdq4TT.js → DialogTitle-Bby0zSCw.js} +1 -1
- package/dashboard/dist/assets/{FadeIn-CEJfaKnL.js → FadeIn-Cx1hl4so.js} +1 -1
- package/dashboard/dist/assets/{HeaderGithubStar-Bg2vijF8.js → HeaderGithubStar-my4zR6Pp.js} +1 -1
- package/dashboard/dist/assets/{HoverTooltip-B03JQ3PO.js → HoverTooltip-DOiGAPLE.js} +1 -1
- package/dashboard/dist/assets/{IpCheckPage-DYZucBOf.js → IpCheckPage-4SdHlFuA.js} +1 -1
- package/dashboard/dist/assets/{LandingPage-m-byhnVx.js → LandingPage-bSWc9xiS.js} +2 -2
- package/dashboard/dist/assets/{LeaderboardAvatar-JtGhJC1s.js → LeaderboardAvatar-EN4117E5.js} +1 -1
- package/dashboard/dist/assets/LeaderboardPage-Bwjf-xZl.js +2 -0
- package/dashboard/dist/assets/{LeaderboardProfileModal-Cm4DDrcY.js → LeaderboardProfileModal-B1mgVtfP.js} +4 -4
- package/dashboard/dist/assets/{LeaderboardProfilePage-bKbMm856.js → LeaderboardProfilePage-DVt5S3lY.js} +1 -1
- package/dashboard/dist/assets/{LimitsPage-B271tZOj.js → LimitsPage-BCXjJE1B.js} +5 -5
- package/dashboard/dist/assets/{LocalOnlyNotice-DKIxuBP0.js → LocalOnlyNotice-CzeH4OoJ.js} +1 -1
- package/dashboard/dist/assets/LoginCard-aiqSQInP.js +1 -0
- package/dashboard/dist/assets/{LoginModal-PxTgIoLk.js → LoginModal-DdGKIi8h.js} +1 -1
- package/dashboard/dist/assets/{LoginPage-uEUnU7NP.js → LoginPage-D7xGSoMn.js} +1 -1
- package/dashboard/dist/assets/PetPage-Dlb6rNpF.js +1 -0
- package/dashboard/dist/assets/{PopoverPopup-DWIMb8D6.js → PopoverPopup-Xbruj7Zi.js} +1 -1
- package/dashboard/dist/assets/{ProviderIcon-DqqwXu3b.js → ProviderIcon-BPxacBzj.js} +1 -1
- package/dashboard/dist/assets/{ResetPasswordPage-BVuJTR9A.js → ResetPasswordPage-9wgPnLRj.js} +1 -1
- package/dashboard/dist/assets/{SegmentedControl-iHtWKWtc.js → SegmentedControl-CYFcZFNE.js} +1 -1
- package/dashboard/dist/assets/{Select-Cr9wq8mD.js → Select-zpFEMqpk.js} +1 -1
- package/dashboard/dist/assets/{SelectItemText-BWnP4yuq.js → SelectItemText-Bldm5Y0C.js} +1 -1
- package/dashboard/dist/assets/{ServiceStatusPage-DLuiUUYV.js → ServiceStatusPage-dgtwFazV.js} +1 -1
- package/dashboard/dist/assets/{SessionsPage-CBAH4ieT.js → SessionsPage-DHfpv53M.js} +2 -2
- package/dashboard/dist/assets/SettingsPage-DcGToOT7.js +2 -0
- package/dashboard/dist/assets/SkillsPage-DiQDLw2l.js +1 -0
- package/dashboard/dist/assets/TokenGalaxy-GDx7ftMU.js +4426 -0
- package/dashboard/dist/assets/ToolbarRootContext-PoCcP2AV.js +1 -0
- package/dashboard/dist/assets/{TrendMonitor-CCzwGDst.js → TrendMonitor-CIfq_yk8.js} +1 -1
- package/dashboard/dist/assets/{WidgetsPage-CcWCidAd.js → WidgetsPage-Dwy-E3Lf.js} +1 -1
- package/dashboard/dist/assets/{WrappedPage-B6dn8eyh.js → WrappedPage-Ce7NV6Ij.js} +1 -1
- package/dashboard/dist/assets/__vite-browser-external-D-WLjvZW.js +45 -0
- package/dashboard/dist/assets/{agent-logos-Dh2k8E_G.js → agent-logos-BY8n7b9g.js} +1 -1
- package/dashboard/dist/assets/arrow-up-right-BDiV6Wlk.js +1 -0
- package/dashboard/dist/assets/check-Chyo6ujc.js +1 -0
- package/dashboard/dist/assets/{composite-CSBcryzA.js → composite-DgBqMs_Z.js} +1 -1
- package/dashboard/dist/assets/copy-ENRv4pAy.js +1 -0
- package/dashboard/dist/assets/download-D3y3gd-z.js +1 -0
- package/dashboard/dist/assets/external-link-VxSAxWnH.js +1 -0
- package/dashboard/dist/assets/flame-CPdTWeRo.js +1 -0
- package/dashboard/dist/assets/{format-tokens-CqiCmYtk.js → format-tokens-BF2G89Q7.js} +1 -1
- package/dashboard/dist/assets/{icons-DD8OvYVG.js → icons-D6rfdVyV.js} +1 -1
- package/dashboard/dist/assets/{index-21lDN4rA.js → index-4bHcp2Ep.js} +1 -1
- package/dashboard/dist/assets/{index-Cm8jn8Va.js → index-CgmpxGym.js} +1 -1
- package/dashboard/dist/assets/{index-DLLivlEh.js → index-mzMCUT_4.js} +1 -1
- package/dashboard/dist/assets/info-BMso9PcY.js +1 -0
- package/dashboard/dist/assets/link-2-Bg34XOcd.js +1 -0
- package/dashboard/dist/assets/loader-circle-C4Vul1Yx.js +1 -0
- package/dashboard/dist/assets/maximize-2-BBqcwFFo.js +1 -0
- package/dashboard/dist/assets/{modifiers.esm-Cwj0l9Zb.js → modifiers.esm-B2F4Iiey.js} +1 -1
- package/dashboard/dist/assets/module-B5tW98jG.js +3 -0
- package/dashboard/dist/assets/monitor-smartphone-k1Ja3ngF.js +1 -0
- package/dashboard/dist/assets/plus-BaCIejxc.js +1 -0
- package/dashboard/dist/assets/provider-display-BYxmO9Bu.js +42 -0
- package/dashboard/dist/assets/{react-xH4nkyuj.js → react-xGx5RIqz.js} +1 -1
- package/dashboard/dist/assets/search-LZQC7j6a.js +1 -0
- package/dashboard/dist/assets/{skills-api-B7lb1cjO.js → skills-api-yLfQkApo.js} +1 -1
- package/dashboard/dist/assets/{sortable.esm-BUPRsWL6.js → sortable.esm-B8XRHrmA.js} +1 -1
- package/dashboard/dist/assets/{store-DneqOW0h.js → store-DfUIKvz3.js} +1 -1
- package/dashboard/dist/assets/terminal-CsFh6eZS.js +1 -0
- package/dashboard/dist/assets/trash-CVk10mDa.js +1 -0
- package/dashboard/dist/assets/{use-community-stats-DB98TGn9.js → use-community-stats-DP7lJyDV.js} +1 -1
- package/dashboard/dist/assets/{use-latest-request-guard-DK3KulKx.js → use-latest-request-guard-B7uLArxV.js} +1 -1
- package/dashboard/dist/assets/{use-limits-display-prefs-BACCRUMZ.js → use-limits-display-prefs-DG97cWcv.js} +1 -1
- package/dashboard/dist/assets/{use-ordered-list-DnKFdI9a.js → use-ordered-list-ChQc2v-Q.js} +1 -1
- package/dashboard/dist/assets/use-reduced-motion-BoFF1l9U.js +1 -0
- package/dashboard/dist/assets/use-session-efficiency-pref-CtF9JAlF.js +1 -0
- package/dashboard/dist/assets/{use-transform-DweC2iKa.js → use-transform-DVIBk7FO.js} +1 -1
- package/dashboard/dist/assets/{use-usage-limits-CN5xWIBs.js → use-usage-limits-BYQuJ9Ud.js} +1 -1
- package/dashboard/dist/assets/{useCurrency-CFjvWawL.js → useCurrency-CNkzJCP9.js} +1 -1
- package/dashboard/dist/assets/{useTokenFormat-Cf81HqWi.js → useTokenFormat-CU3MtXtS.js} +1 -1
- package/dashboard/dist/assets/zap-D5k595AR.js +1 -0
- package/dashboard/dist/index.html +1 -1
- package/dashboard/dist/ip-check.html +1 -1
- package/dashboard/dist/leaderboard.html +1 -1
- package/dashboard/dist/share.html +1 -1
- package/package.json +1 -1
- package/src/commands/sync.js +15 -4
- package/src/lib/cloud-account.js +108 -0
- package/src/lib/grok-limits.js +37 -0
- package/src/lib/opencode-config.js +20 -1
- package/src/lib/pricing/curated-overrides.json +22 -0
- package/src/lib/pricing/index.js +2 -0
- package/src/lib/pricing/seed-snapshot.json +1 -1
- package/src/lib/rollout.js +1044 -136
- package/src/lib/usage-limits.js +7 -1
- package/dashboard/dist/assets/AchievementBadge-Bf2T612R.js +0 -1
- package/dashboard/dist/assets/AchievementsSection-CPwsy04Y.js +0 -1
- package/dashboard/dist/assets/CommandPalette-C8BwOnSn.js +0 -1
- package/dashboard/dist/assets/CommunityStatsModal-BGMbgSjq.js +0 -1
- package/dashboard/dist/assets/DashboardPage-BcJGzQWK.js +0 -1
- package/dashboard/dist/assets/DialogDescription-DRQEfAWH.js +0 -1
- package/dashboard/dist/assets/LeaderboardPage-vVDKFLhl.js +0 -2
- package/dashboard/dist/assets/LoginCard-DA46RXDo.js +0 -1
- package/dashboard/dist/assets/PetPage-DDPZtxMw.js +0 -1
- package/dashboard/dist/assets/SettingsPage-Djku-i8K.js +0 -2
- package/dashboard/dist/assets/SkillsPage-DtBRoB8R.js +0 -1
- package/dashboard/dist/assets/TokenGalaxy-nvyPu5eV.js +0 -4314
- package/dashboard/dist/assets/ToolbarRootContext-DhpHv55w.js +0 -1
- package/dashboard/dist/assets/__vite-browser-external-sJsF0ioo.js +0 -45
- package/dashboard/dist/assets/arrow-up-right-BLDQog1A.js +0 -1
- package/dashboard/dist/assets/check-DNq_ySSn.js +0 -1
- package/dashboard/dist/assets/copy-DHRrNtRb.js +0 -1
- package/dashboard/dist/assets/download-CluyujgG.js +0 -1
- package/dashboard/dist/assets/external-link-Cf12tdLf.js +0 -1
- package/dashboard/dist/assets/flame-CJEYinxo.js +0 -1
- package/dashboard/dist/assets/info-dv3Y0z8Q.js +0 -1
- package/dashboard/dist/assets/link-2-CWHBxVuk.js +0 -1
- package/dashboard/dist/assets/loader-circle-9l5p9Dwa.js +0 -1
- package/dashboard/dist/assets/maximize-2-DQ2t3MJB.js +0 -1
- package/dashboard/dist/assets/module-DUSXqJtA.js +0 -3
- package/dashboard/dist/assets/monitor-smartphone-B-9at3iV.js +0 -1
- package/dashboard/dist/assets/plus-C_CTQjDD.js +0 -1
- package/dashboard/dist/assets/provider-display-XJQod7k9.js +0 -42
- package/dashboard/dist/assets/search-Ut41Fw1G.js +0 -1
- package/dashboard/dist/assets/terminal-DPQyZyHR.js +0 -1
- package/dashboard/dist/assets/trash-CVdV1bBR.js +0 -1
- package/dashboard/dist/assets/use-reduced-motion-BfdrKOsS.js +0 -1
- package/dashboard/dist/assets/use-session-efficiency-pref-BTm6RoSm.js +0 -1
- package/dashboard/dist/assets/zap-Vx_j5oJN.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{m as c}from"./__vite-browser-external-D-WLjvZW.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-D-WLjvZW.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-D-WLjvZW.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-D-WLjvZW.js";import{F as g}from"./composite-DgBqMs_Z.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};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{m as a}from"./__vite-browser-external-D-WLjvZW.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};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{m as e}from"./__vite-browser-external-D-WLjvZW.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-DB98TGn9.js → use-community-stats-DP7lJyDV.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-D-WLjvZW.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-D-WLjvZW.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-D-WLjvZW.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-D-WLjvZW.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-D-WLjvZW.js";import{h as r,i as t,p as s}from"./react-xGx5RIqz.js";function i(){!r.current&&t();const[e]=o.useState(s.current);return e}export{i as u};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{m as f,r as n}from"./__vite-browser-external-D-WLjvZW.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-xGx5RIqz.js";import{r as f}from"./__vite-browser-external-D-WLjvZW.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};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{J as S,ab as x,r as d,c as N,ac as O,ad as A,ae as g}from"./__vite-browser-external-sJsF0ioo.js";import{l as R,i as _,L as P,a as q}from"./use-limits-display-prefs-BACCRUMZ.js";import{u as z}from"./use-latest-request-guard-DK3KulKx.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 i=n=>{const w=n?.detail?.status;typeof w=="string"&&(M=w),e(L())};return window.addEventListener(F,i),e(L()),S()&&x({type:"getNotificationStatus"}),()=>window.removeEventListener(F,i)}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,i]=d.useState($),[n,w]=d.useState("unknown");d.useEffect(()=>j(w),[]);const u=d.useCallback(async o=>{const r=!!o;r&&await T();try{window.localStorage.setItem(v,r?"1":"0")}catch{}i(r)},[]);return{enabled:e,setEnabled:u,permissionBlocked:n==="denied"}}function B(e,i){if(!(e>0))return null;const n=(e-i)/e;return Number.isFinite(n)?Math.min(Math.max(n,0),1):null}function G(e,i,n=.03){return e>i+n}function V(e){const i=Math.max(0,Math.floor(e)),n=Math.floor(i/3600);return n>24?`${Math.floor(n/24)}d`:n>0?`${n}h`:`${Math.floor(i/60)}m`}function J(e,i){if(typeof e.windowSeconds=="number")return e.windowSeconds;if(e.windowSecondsField&&i){const n=i[e.windowSecondsField];return typeof n=="number"&&n>0?n:null}return null}function U(e){return e==null?NaN:typeof e=="number"?e*1e3:Date.parse(e)}function H({usedPercent:e,windowSeconds:i,resetMs:n,mode:w,now:u=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(!(i>0)||!Number.isFinite(n))return r;const l=Math.max(0,(n-u)/1e3),a=B(i,l);if(a==null)return r;if(r.expectedPercent=Math.round(a*100),r.paceOver=G(o,a),o>=.05){const c=w==="remaining"?1-a:a;r.pacePercent=c*100}if(a>.02&&o>0){const c=i*a,m=o/c,f=o/a;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 i=Array.isArray(e.weekly_scoped)?e.weekly_scoped.map(n=>({key:`scoped-${n.label}`,label:n.label,window:n,pctField:"utilization",resetField:"resets_at",windowSeconds:604800})):[];return[{key:"5h",labelKey:"limits.label.claude_5h",window:e.five_hour,pctField:"utilization",resetField:"resets_at",windowSeconds:5*3600},{key:"7d",labelKey:"limits.label.claude_7d",window:e.seven_day,pctField:"utilization",resetField:"resets_at",windowSeconds:7*86400},{key:"opus",labelKey:"limits.label.claude_opus",window:e.seven_day_opus,pctField:"utilization",resetField:"resets_at",windowSeconds:7*86400},...i]}},codex:{extra:"codex_meta",windows(e){return[{key:"5h",labelKey:"limits.label.codex_5h",window:e.primary_window,windowSecondsField:"limit_window_seconds"},{key:"7d",labelKey:"limits.label.codex_7d",window:e.secondary_window,windowSecondsField:"limit_window_seconds"},{key:"credits",labelKey:"limits.label.codex_credits",window:e.credit_window},{key:"spark-5h",labelKey:"limits.label.codex_spark_5h",window:e.spark_primary_window,windowSecondsField:"limit_window_seconds"},{key:"spark-7d",labelKey:"limits.label.codex_spark_7d",window:e.spark_secondary_window,windowSecondsField:"limit_window_seconds"}]}},cursor:{windows(e){return[{key:"plan",labelKey:"limits.label.cursor_plan",window:e.primary_window,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 i=typeof e.period_type=="string"?e.period_type:null,n=i==="weekly"?"limits.label.grok_week":i==="daily"?"limits.label.grok_day":"limits.label.grok_month",w=i==="weekly"?7*86400:i==="daily"?86400:void 0;return[{key:i==="weekly"?"week":i==="daily"?"day":"month",labelKey:n,window:e.primary_window,windowSeconds:w},{key:"ondemand",labelKey:"limits.label.grok_ondemand",window:e.secondary_window}]}},antigravity:{windows(e){return[{key:"claude-weekly",labelKey:"limits.label.antigravity_claude_weekly",window:e.primary_window},{key:"claude-5h",labelKey:"limits.label.antigravity_claude_5h",window:e.secondary_window},{key:"gemini-weekly",labelKey:"limits.label.antigravity_gemini_weekly",window:e.tertiary_window},{key:"gemini-5h",labelKey:"limits.label.antigravity_gemini_5h",window:e.quaternary_window}]}},copilot:{extra:"copilot_otel",windows(e){return[{key:"premium",labelKey:"limits.label.copilot_premium",window:e.primary_window},{key:"chat",labelKey:"limits.label.copilot_chat",window:e.secondary_window}]}},zcode:{windows(e){return e.plan_kind==="coding-plan"?[{key:"5h",labelKey:"limits.label.zcode_5h",window:e.primary_window},{key:"weekly",labelKey:"limits.label.zcode_weekly",window:e.secondary_window},{key:"tools",labelKey:"limits.label.zcode_tools",window:e.tertiary_window}]:[{key:"glm52",labelKey:"limits.label.zcode_glm52",window:e.primary_window},{key:"glm5t",labelKey:"limits.label.zcode_glm5t",window:e.secondary_window}]}},opencodeGo:{windows(e){return[{key:"5h",labelKey:"limits.label.opencode_go_5h",window:e.primary_window},{key:"weekly",labelKey:"limits.label.opencode_go_weekly",window:e.secondary_window},{key:"monthly",labelKey:"limits.label.opencode_go_monthly",window:e.tertiary_window}]}},qoder:{windows(e){return[{key:"credits",labelKey:"limits.label.qoder_credits",window:e.primary_window},{key:"ultimate",labelKey:"limits.label.qoder_ultimate",window:e.secondary_window,timeKind:"expiry"}]}},qoderCn:{windows(e){return[{key:"credits",labelKey:"limits.label.qoder_cn_credits",window:e.primary_window},{key:"ultimate",labelKey:"limits.label.qoder_cn_ultimate",window:e.secondary_window,timeKind:"expiry"}]}},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:i=Date.now()}={}){const n=[],w=W;for(const[u,o]of Object.entries(e||{})){const r=w[u];if(!(!o?.configured||o.error||!r))for(const l of r.windows(o)){if(!l.window)continue;const a=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:a,windowSeconds:J(l,l.window),resetMs:m,mode:"used",now:i});!f.runsOutEta||!f.paceOver||a<20||!(m>i)||n.push({id:`${u}:${l.key}:${m}`,providerId:u,windowKey:l.key,resetMs:m,usedPercent:a,runsOutEta:f.runsOutEta})}}return n}function Z(e){const i=Y(),n=X(e);for(const o of n){if(i[o.id])continue;const r=R(o.providerId),l=N("limits.alert.title",{provider:r}),a=N("limits.alert.body",{eta:o.runsOutEta,percent:Math.round(o.usedPercent)});let c=O({title:l,body:a,id:o.id});!c&&typeof Notification<"u"&&Notification.permission==="granted"&&(new Notification(l,{body:a,tag:o.id}),c=!0),c&&(i[o.id]=Date.now())}const w=Date.now()-864e5,u=Object.fromEntries(Object.entries(i).filter(([o,r])=>{const l=Number(o.split(":").at(-1));return Number.isFinite(l)?l>=w:Number(r)>=w}).slice(-100));return Q(u),n.length}function k(e,i){return!e||i||!e.devin||e.devin.configured===!1&&Object.keys(e.devin).length===1?e:{...e,devin:{configured:!1}}}function oe(e){const i=!!e?.initialState,[n,w]=d.useState(_),[u,o]=d.useState(()=>i?k(e?.initialState?.data??null,_()):null),[r,l]=d.useState(()=>i?e?.initialState?.error??null:null),[a,c]=d.useState(!i),m=!!e?.initialRefresh,f=!!e?.publishToPreloadCache,b=z([n]);d.useEffect(()=>{if(typeof window>"u")return;const s=()=>w(_()),t=y=>{q(y.key)&&s()};return window.addEventListener(P,s),window.addEventListener("storage",t),()=>{window.removeEventListener(P,s),window.removeEventListener("storage",t)}},[]),d.useEffect(()=>{if(!(!u||typeof window>"u"))try{window.localStorage.getItem(v)==="1"&&Z(u)}catch{}},[u]);const p=d.useCallback((s,t)=>{!f||!s||typeof s!="object"||A(k(s,_()),{source:t})},[f]),C=d.useCallback(async()=>{const s=b();try{const t=await g({refresh:!0,devinEnabled:_()});if(!s())return;const y=t&&typeof t=="object"?t:null;o(k(y,_())),l(null),c(!1),p(y,"manual-refresh")}catch(t){if(!s())return;l(t?.message||String(t)),c(!1)}},[b,p]),h=d.useCallback(async()=>{const s=b();try{const t=await g({devinEnabled:_()});if(!s())return;const y=t&&typeof t=="object"?t:null;o(k(y,_())),l(null),c(!1),p(y,"page-load")}catch(t){if(!s())return;l(t?.message||String(t)),c(!1)}},[b,p]);d.useEffect(()=>{if(typeof window>"u"||typeof document>"u")return;const s=15e3;let t=Date.now();const y=()=>{if(document.visibilityState!=="visible")return;const E=Date.now();E-t<s||(t=E,h())};return window.addEventListener("focus",y),document.addEventListener("visibilitychange",y),()=>{window.removeEventListener("focus",y),document.removeEventListener("visibilitychange",y)}},[h]);const K=d.useRef(n);return d.useEffect(()=>{K.current!==n&&(K.current=n,n||o(s=>k(s,!1)),h())},[n,h]),d.useEffect(()=>{if(i&&!m)return;const s=b();(async()=>{try{const t=await g({devinEnabled:_()});if(!s())return;const y=t&&typeof t=="object"?t:null;o(k(y,_())),l(null),p(y,"page-load")}catch(t){if(!s())return;l(t?.message||String(t))}finally{s()&&c(!1)}})()},[b,i,m,p]),{data:u,error:r,isLoading:a,refresh:C}}export{W as P,J as a,te as b,H as c,U as r,Z as s,oe as u};
|
|
1
|
+
import{J as S,ab as x,r as d,c as N,ac as O,ad as A,ae as g}from"./__vite-browser-external-D-WLjvZW.js";import{l as R,i as _,L as P,a as q}from"./use-limits-display-prefs-DG97cWcv.js";import{u as z}from"./use-latest-request-guard-B7uLArxV.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 i=n=>{const w=n?.detail?.status;typeof w=="string"&&(M=w),e(L())};return window.addEventListener(F,i),e(L()),S()&&x({type:"getNotificationStatus"}),()=>window.removeEventListener(F,i)}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,i]=d.useState($),[n,w]=d.useState("unknown");d.useEffect(()=>j(w),[]);const u=d.useCallback(async o=>{const r=!!o;r&&await T();try{window.localStorage.setItem(v,r?"1":"0")}catch{}i(r)},[]);return{enabled:e,setEnabled:u,permissionBlocked:n==="denied"}}function B(e,i){if(!(e>0))return null;const n=(e-i)/e;return Number.isFinite(n)?Math.min(Math.max(n,0),1):null}function G(e,i,n=.03){return e>i+n}function V(e){const i=Math.max(0,Math.floor(e)),n=Math.floor(i/3600);return n>24?`${Math.floor(n/24)}d`:n>0?`${n}h`:`${Math.floor(i/60)}m`}function J(e,i){if(typeof e.windowSeconds=="number")return e.windowSeconds;if(e.windowSecondsField&&i){const n=i[e.windowSecondsField];return typeof n=="number"&&n>0?n:null}return null}function U(e){return e==null?NaN:typeof e=="number"?e*1e3:Date.parse(e)}function H({usedPercent:e,windowSeconds:i,resetMs:n,mode:w,now:u=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(!(i>0)||!Number.isFinite(n))return r;const l=Math.max(0,(n-u)/1e3),a=B(i,l);if(a==null)return r;if(r.expectedPercent=Math.round(a*100),r.paceOver=G(o,a),o>=.05){const c=w==="remaining"?1-a:a;r.pacePercent=c*100}if(a>.02&&o>0){const c=i*a,m=o/c,f=o/a;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 i=Array.isArray(e.weekly_scoped)?e.weekly_scoped.map(n=>({key:`scoped-${n.label}`,label:n.label,window:n,pctField:"utilization",resetField:"resets_at",windowSeconds:604800})):[];return[{key:"5h",labelKey:"limits.label.claude_5h",window:e.five_hour,pctField:"utilization",resetField:"resets_at",windowSeconds:5*3600},{key:"7d",labelKey:"limits.label.claude_7d",window:e.seven_day,pctField:"utilization",resetField:"resets_at",windowSeconds:7*86400},{key:"opus",labelKey:"limits.label.claude_opus",window:e.seven_day_opus,pctField:"utilization",resetField:"resets_at",windowSeconds:7*86400},...i]}},codex:{extra:"codex_meta",windows(e){return[{key:"5h",labelKey:"limits.label.codex_5h",window:e.primary_window,windowSecondsField:"limit_window_seconds"},{key:"7d",labelKey:"limits.label.codex_7d",window:e.secondary_window,windowSecondsField:"limit_window_seconds"},{key:"credits",labelKey:"limits.label.codex_credits",window:e.credit_window},{key:"spark-5h",labelKey:"limits.label.codex_spark_5h",window:e.spark_primary_window,windowSecondsField:"limit_window_seconds"},{key:"spark-7d",labelKey:"limits.label.codex_spark_7d",window:e.spark_secondary_window,windowSecondsField:"limit_window_seconds"}]}},cursor:{windows(e){return[{key:"plan",labelKey:"limits.label.cursor_plan",window:e.primary_window,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 i=typeof e.period_type=="string"?e.period_type:null,n=i==="weekly"?"limits.label.grok_week":i==="daily"?"limits.label.grok_day":"limits.label.grok_month",w=i==="weekly"?7*86400:i==="daily"?86400:void 0;return[{key:i==="weekly"?"week":i==="daily"?"day":"month",labelKey:n,window:e.primary_window,windowSeconds:w},{key:"ondemand",labelKey:"limits.label.grok_ondemand",window:e.secondary_window}]}},antigravity:{windows(e){return[{key:"claude-weekly",labelKey:"limits.label.antigravity_claude_weekly",window:e.primary_window},{key:"claude-5h",labelKey:"limits.label.antigravity_claude_5h",window:e.secondary_window},{key:"gemini-weekly",labelKey:"limits.label.antigravity_gemini_weekly",window:e.tertiary_window},{key:"gemini-5h",labelKey:"limits.label.antigravity_gemini_5h",window:e.quaternary_window}]}},copilot:{extra:"copilot_otel",windows(e){return[{key:"premium",labelKey:"limits.label.copilot_premium",window:e.primary_window},{key:"chat",labelKey:"limits.label.copilot_chat",window:e.secondary_window}]}},zcode:{windows(e){return e.plan_kind==="coding-plan"?[{key:"5h",labelKey:"limits.label.zcode_5h",window:e.primary_window},{key:"weekly",labelKey:"limits.label.zcode_weekly",window:e.secondary_window},{key:"tools",labelKey:"limits.label.zcode_tools",window:e.tertiary_window}]:[{key:"glm52",labelKey:"limits.label.zcode_glm52",window:e.primary_window},{key:"glm5t",labelKey:"limits.label.zcode_glm5t",window:e.secondary_window}]}},opencodeGo:{windows(e){return[{key:"5h",labelKey:"limits.label.opencode_go_5h",window:e.primary_window},{key:"weekly",labelKey:"limits.label.opencode_go_weekly",window:e.secondary_window},{key:"monthly",labelKey:"limits.label.opencode_go_monthly",window:e.tertiary_window}]}},qoder:{windows(e){return[{key:"credits",labelKey:"limits.label.qoder_credits",window:e.primary_window},{key:"ultimate",labelKey:"limits.label.qoder_ultimate",window:e.secondary_window,timeKind:"expiry"}]}},qoderCn:{windows(e){return[{key:"credits",labelKey:"limits.label.qoder_cn_credits",window:e.primary_window},{key:"ultimate",labelKey:"limits.label.qoder_cn_ultimate",window:e.secondary_window,timeKind:"expiry"}]}},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:i=Date.now()}={}){const n=[],w=W;for(const[u,o]of Object.entries(e||{})){const r=w[u];if(!(!o?.configured||o.error||!r))for(const l of r.windows(o)){if(!l.window)continue;const a=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:a,windowSeconds:J(l,l.window),resetMs:m,mode:"used",now:i});!f.runsOutEta||!f.paceOver||a<20||!(m>i)||n.push({id:`${u}:${l.key}:${m}`,providerId:u,windowKey:l.key,resetMs:m,usedPercent:a,runsOutEta:f.runsOutEta})}}return n}function Z(e){const i=Y(),n=X(e);for(const o of n){if(i[o.id])continue;const r=R(o.providerId),l=N("limits.alert.title",{provider:r}),a=N("limits.alert.body",{eta:o.runsOutEta,percent:Math.round(o.usedPercent)});let c=O({title:l,body:a,id:o.id});!c&&typeof Notification<"u"&&Notification.permission==="granted"&&(new Notification(l,{body:a,tag:o.id}),c=!0),c&&(i[o.id]=Date.now())}const w=Date.now()-864e5,u=Object.fromEntries(Object.entries(i).filter(([o,r])=>{const l=Number(o.split(":").at(-1));return Number.isFinite(l)?l>=w:Number(r)>=w}).slice(-100));return Q(u),n.length}function k(e,i){return!e||i||!e.devin||e.devin.configured===!1&&Object.keys(e.devin).length===1?e:{...e,devin:{configured:!1}}}function oe(e){const i=!!e?.initialState,[n,w]=d.useState(_),[u,o]=d.useState(()=>i?k(e?.initialState?.data??null,_()):null),[r,l]=d.useState(()=>i?e?.initialState?.error??null:null),[a,c]=d.useState(!i),m=!!e?.initialRefresh,f=!!e?.publishToPreloadCache,b=z([n]);d.useEffect(()=>{if(typeof window>"u")return;const s=()=>w(_()),t=y=>{q(y.key)&&s()};return window.addEventListener(P,s),window.addEventListener("storage",t),()=>{window.removeEventListener(P,s),window.removeEventListener("storage",t)}},[]),d.useEffect(()=>{if(!(!u||typeof window>"u"))try{window.localStorage.getItem(v)==="1"&&Z(u)}catch{}},[u]);const p=d.useCallback((s,t)=>{!f||!s||typeof s!="object"||A(k(s,_()),{source:t})},[f]),C=d.useCallback(async()=>{const s=b();try{const t=await g({refresh:!0,devinEnabled:_()});if(!s())return;const y=t&&typeof t=="object"?t:null;o(k(y,_())),l(null),c(!1),p(y,"manual-refresh")}catch(t){if(!s())return;l(t?.message||String(t)),c(!1)}},[b,p]),h=d.useCallback(async()=>{const s=b();try{const t=await g({devinEnabled:_()});if(!s())return;const y=t&&typeof t=="object"?t:null;o(k(y,_())),l(null),c(!1),p(y,"page-load")}catch(t){if(!s())return;l(t?.message||String(t)),c(!1)}},[b,p]);d.useEffect(()=>{if(typeof window>"u"||typeof document>"u")return;const s=15e3;let t=Date.now();const y=()=>{if(document.visibilityState!=="visible")return;const E=Date.now();E-t<s||(t=E,h())};return window.addEventListener("focus",y),document.addEventListener("visibilitychange",y),()=>{window.removeEventListener("focus",y),document.removeEventListener("visibilitychange",y)}},[h]);const K=d.useRef(n);return d.useEffect(()=>{K.current!==n&&(K.current=n,n||o(s=>k(s,!1)),h())},[n,h]),d.useEffect(()=>{if(i&&!m)return;const s=b();(async()=>{try{const t=await g({devinEnabled:_()});if(!s())return;const y=t&&typeof t=="object"?t:null;o(k(y,_())),l(null),p(y,"page-load")}catch(t){if(!s())return;l(t?.message||String(t))}finally{s()&&c(!1)}})()},[b,i,m,p]),{data:u,error:r,isLoading:a,refresh:C}}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-D-WLjvZW.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-D-WLjvZW.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};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{m as e}from"./__vite-browser-external-D-WLjvZW.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};
|
|
@@ -269,7 +269,7 @@
|
|
|
269
269
|
]
|
|
270
270
|
}
|
|
271
271
|
</script>
|
|
272
|
-
<script type="module" crossorigin src="/assets/__vite-browser-external-
|
|
272
|
+
<script type="module" crossorigin src="/assets/__vite-browser-external-D-WLjvZW.js"></script>
|
|
273
273
|
<link rel="stylesheet" crossorigin href="/assets/__vite-browser-external-5P7me0Qq.css">
|
|
274
274
|
</head>
|
|
275
275
|
<body>
|
|
@@ -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-D-WLjvZW.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-D-WLjvZW.js"></script>
|
|
140
140
|
<link rel="stylesheet" crossorigin href="/assets/__vite-browser-external-5P7me0Qq.css">
|
|
141
141
|
</head>
|
|
142
142
|
<body>
|
|
@@ -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-D-WLjvZW.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,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tokentracker-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.98.0",
|
|
4
4
|
"description": "Local-first AI coding token usage and cost tracker for 39 tools, with a dashboard, desktop pet, widgets, achievements, and native macOS/Windows apps.",
|
|
5
5
|
"main": "src/cli.js",
|
|
6
6
|
"bin": {
|
package/src/commands/sync.js
CHANGED
|
@@ -97,7 +97,8 @@ const {
|
|
|
97
97
|
parseReasonixIncremental,
|
|
98
98
|
resolveGrokBuildSessions,
|
|
99
99
|
parseGrokBuildIncremental,
|
|
100
|
-
|
|
100
|
+
resolveAntigravityDbPath,
|
|
101
|
+
listAntigravityTranscriptsWithStatus,
|
|
101
102
|
parseAntigravityIncremental,
|
|
102
103
|
resolveCodebuddyProjectFiles,
|
|
103
104
|
codebuddyJsonlHasUsage,
|
|
@@ -1150,17 +1151,26 @@ async function cmdSync(argv, context = {}) {
|
|
|
1150
1151
|
}
|
|
1151
1152
|
|
|
1152
1153
|
let antigravityFiles = [];
|
|
1154
|
+
let antigravityInventoryComplete = true;
|
|
1153
1155
|
if (sourceAllowed("antigravity") && geminiPaths) {
|
|
1156
|
+
const knownAntigravityFiles = new Set(
|
|
1157
|
+
Object.keys(cursors.files || {}).filter((filePath) => resolveAntigravityDbPath(filePath)),
|
|
1158
|
+
);
|
|
1154
1159
|
const fileSets = [];
|
|
1155
1160
|
if (geminiPaths.native) {
|
|
1156
|
-
fileSets.push(
|
|
1161
|
+
fileSets.push(
|
|
1162
|
+
await listAntigravityTranscriptsWithStatus(geminiPaths.native, knownAntigravityFiles),
|
|
1163
|
+
);
|
|
1157
1164
|
}
|
|
1158
1165
|
if (geminiPaths.wsl) {
|
|
1159
|
-
fileSets.push(
|
|
1166
|
+
fileSets.push(
|
|
1167
|
+
await listAntigravityTranscriptsWithStatus(geminiPaths.wsl, knownAntigravityFiles),
|
|
1168
|
+
);
|
|
1160
1169
|
}
|
|
1170
|
+
antigravityInventoryComplete = fileSets.every((set) => set.complete);
|
|
1161
1171
|
const seen = new Set();
|
|
1162
1172
|
for (const set of fileSets) {
|
|
1163
|
-
for (const f of set) {
|
|
1173
|
+
for (const f of set.files) {
|
|
1164
1174
|
if (!seen.has(f)) {
|
|
1165
1175
|
seen.add(f);
|
|
1166
1176
|
antigravityFiles.push(f);
|
|
@@ -1191,6 +1201,7 @@ async function cmdSync(argv, context = {}) {
|
|
|
1191
1201
|
);
|
|
1192
1202
|
},
|
|
1193
1203
|
source: "antigravity",
|
|
1204
|
+
inventoryComplete: antigravityInventoryComplete,
|
|
1194
1205
|
});
|
|
1195
1206
|
} catch (err) {
|
|
1196
1207
|
warnProviderParseFailure("Antigravity", err, opts);
|
package/src/lib/cloud-account.js
CHANGED
|
@@ -68,6 +68,23 @@ function decodeJwtExpMs(token) {
|
|
|
68
68
|
return 0;
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
+
// The account id the access token was minted for. Used to key the payload cache
|
|
72
|
+
// below on something the backend does NOT rotate: the refresh token changes
|
|
73
|
+
// under us on rotation, which would throw away a still-warm cache entry on
|
|
74
|
+
// exactly the reads that repeat most.
|
|
75
|
+
function decodeJwtSub(token) {
|
|
76
|
+
try {
|
|
77
|
+
const part = String(token || "").split(".")[1];
|
|
78
|
+
if (!part) return "";
|
|
79
|
+
const json = Buffer.from(part.replace(/-/g, "+").replace(/_/g, "/"), "base64").toString("utf8");
|
|
80
|
+
const payload = JSON.parse(json);
|
|
81
|
+
if (payload && typeof payload.sub === "string") return payload.sub;
|
|
82
|
+
} catch {
|
|
83
|
+
/* ignore */
|
|
84
|
+
}
|
|
85
|
+
return "";
|
|
86
|
+
}
|
|
87
|
+
|
|
71
88
|
// Module-level access-token cache, keyed by the cloud base URL and refresh token
|
|
72
89
|
// that produced it.
|
|
73
90
|
// The popover polls frequently, so caching avoids hammering /api/auth/refresh.
|
|
@@ -81,9 +98,78 @@ let tokenCache = { cacheKey: null, accessToken: null, expMs: 0 };
|
|
|
81
98
|
// intermittent "Activity silently dropped to this-machine data" symptom.
|
|
82
99
|
const mintInflight = new Map();
|
|
83
100
|
|
|
101
|
+
// Response cache for the account reads, mirroring the 30-second window the edge
|
|
102
|
+
// functions already keep.
|
|
103
|
+
//
|
|
104
|
+
// Each `tokentracker-account-*` function caches the RPC snapshot it renders
|
|
105
|
+
// from for 30 seconds (`COMPACT_TTL_MS` in dashboard/edge-patches/*), so two
|
|
106
|
+
// reads inside one window render the same numbers from the same snapshot. That
|
|
107
|
+
// cache only saves the edge-to-PostgREST hop, though: the full body still goes
|
|
108
|
+
// out to every caller. And the callers repeat a lot — the Windows tray poller
|
|
109
|
+
// re-reads the 52-week heatmap every ~49 seconds, and one popover refresh fans
|
|
110
|
+
// out six reads at once. Holding the payload here for the same 30 seconds
|
|
111
|
+
// returns exactly what the cloud would have returned, without paying for the
|
|
112
|
+
// transfer again.
|
|
113
|
+
//
|
|
114
|
+
// Bodies are stored serialized and re-parsed on a hit so a caller mutating the
|
|
115
|
+
// object it got back cannot corrupt what the next caller reads.
|
|
116
|
+
const PAYLOAD_TTL_MS = 30_000;
|
|
117
|
+
const PAYLOAD_CACHE_MAX = 64;
|
|
118
|
+
const payloadCache = new Map();
|
|
119
|
+
|
|
120
|
+
// Mirrors the params `fetchAccountFunction` actually puts on the wire, so two
|
|
121
|
+
// requests share an entry only when they would have produced the same URL.
|
|
122
|
+
function payloadCacheKey({ root, sub, slug, searchParams }) {
|
|
123
|
+
const pairs = [];
|
|
124
|
+
if (searchParams && typeof searchParams.entries === "function") {
|
|
125
|
+
for (const [key, value] of searchParams.entries()) {
|
|
126
|
+
if (key === "account" || key === "scope") continue;
|
|
127
|
+
if (value == null || value === "") continue;
|
|
128
|
+
pairs.push(`${key}=${String(value)}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
pairs.sort();
|
|
132
|
+
return `${root}\0${sub}\0${slug}\0${pairs.join("&")}`;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function payloadCacheGet(key, now) {
|
|
136
|
+
const hit = payloadCache.get(key);
|
|
137
|
+
if (!hit) return null;
|
|
138
|
+
if (hit.expMs <= now()) {
|
|
139
|
+
payloadCache.delete(key);
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
// Re-insert so the eviction below drops the coldest entry, not this one.
|
|
143
|
+
payloadCache.delete(key);
|
|
144
|
+
payloadCache.set(key, hit);
|
|
145
|
+
try {
|
|
146
|
+
return JSON.parse(hit.body);
|
|
147
|
+
} catch {
|
|
148
|
+
payloadCache.delete(key);
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function payloadCacheSet(key, data, now) {
|
|
154
|
+
let body;
|
|
155
|
+
try {
|
|
156
|
+
body = JSON.stringify(data);
|
|
157
|
+
} catch {
|
|
158
|
+
return; // Not serializable: skip the cache rather than fail the read.
|
|
159
|
+
}
|
|
160
|
+
if (body === undefined) return;
|
|
161
|
+
payloadCache.set(key, { expMs: now() + PAYLOAD_TTL_MS, body });
|
|
162
|
+
while (payloadCache.size > PAYLOAD_CACHE_MAX) {
|
|
163
|
+
const oldest = payloadCache.keys().next();
|
|
164
|
+
if (oldest.done) break;
|
|
165
|
+
payloadCache.delete(oldest.value);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
84
169
|
function __resetCloudAccountCacheForTests() {
|
|
85
170
|
tokenCache = { cacheKey: null, accessToken: null, expMs: 0 };
|
|
86
171
|
mintInflight.clear();
|
|
172
|
+
payloadCache.clear();
|
|
87
173
|
}
|
|
88
174
|
|
|
89
175
|
// Failure classes surfaced to local-api so it can tell an intentional local
|
|
@@ -328,6 +414,25 @@ async function fetchAccountUsage({
|
|
|
328
414
|
});
|
|
329
415
|
if (!minted) return null;
|
|
330
416
|
|
|
417
|
+
// Keyed after the mint so rotation cannot invalidate the entry, and so a
|
|
418
|
+
// revoked session fails here rather than being served from cache.
|
|
419
|
+
const sub = decodeJwtSub(minted.accessToken);
|
|
420
|
+
const cacheKey = sub
|
|
421
|
+
? payloadCacheKey({ root: String(baseUrl || DEFAULT_BASE_URL).replace(/\/$/, ""), sub, slug, searchParams })
|
|
422
|
+
: null;
|
|
423
|
+
if (cacheKey) {
|
|
424
|
+
const cached = payloadCacheGet(cacheKey, now);
|
|
425
|
+
if (cached !== null) {
|
|
426
|
+
// Still surface a rotation from this mint: dropping it would leave the
|
|
427
|
+
// caller relaying a refresh token the backend has already consumed.
|
|
428
|
+
return {
|
|
429
|
+
data: cached,
|
|
430
|
+
rotatedRefreshToken: minted.refreshToken,
|
|
431
|
+
rotatedCsrfToken: minted.csrfToken,
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
|
|
331
436
|
const data = await fetchAccountFunction({
|
|
332
437
|
baseUrl,
|
|
333
438
|
anonKey,
|
|
@@ -337,16 +442,19 @@ async function fetchAccountUsage({
|
|
|
337
442
|
fetchImpl,
|
|
338
443
|
timeoutMs: getRemainingTimeout(),
|
|
339
444
|
});
|
|
445
|
+
if (cacheKey && data != null) payloadCacheSet(cacheKey, data, now);
|
|
340
446
|
return { data, rotatedRefreshToken: minted.refreshToken, rotatedCsrfToken: minted.csrfToken };
|
|
341
447
|
}
|
|
342
448
|
|
|
343
449
|
module.exports = {
|
|
344
450
|
AccountAuthError,
|
|
345
451
|
USAGE_TO_ACCOUNT_SLUG,
|
|
452
|
+
PAYLOAD_TTL_MS,
|
|
346
453
|
accountSlugFor,
|
|
347
454
|
accessTokenFromRefreshPayload,
|
|
348
455
|
refreshTokenFromRefreshPayload,
|
|
349
456
|
decodeJwtExpMs,
|
|
457
|
+
decodeJwtSub,
|
|
350
458
|
mintAccessToken,
|
|
351
459
|
fetchAccountFunction,
|
|
352
460
|
fetchAccountUsage,
|
package/src/lib/grok-limits.js
CHANGED
|
@@ -495,6 +495,40 @@ async function resolveGrokAccessToken({
|
|
|
495
495
|
};
|
|
496
496
|
}
|
|
497
497
|
|
|
498
|
+
// xAI reports the subscription as a human-readable product name on the billing
|
|
499
|
+
// payload's top level (`subscriptionTier`, a sibling of `config`, not a member
|
|
500
|
+
// of it) -- a Free account reads exactly "Free".
|
|
501
|
+
const GROK_PLAN_TIERS = new Map([
|
|
502
|
+
["supergrokheavy", "SuperGrok Heavy"],
|
|
503
|
+
["supergrokplus", "SuperGrok Plus"],
|
|
504
|
+
["supergroklite", "SuperGrok Lite"],
|
|
505
|
+
["supergrok", "SuperGrok"],
|
|
506
|
+
["xpremiumplus", "X Premium+"],
|
|
507
|
+
["premiumplus", "X Premium+"],
|
|
508
|
+
["xpremium", "X Premium+"],
|
|
509
|
+
["apikey", "API Key"],
|
|
510
|
+
["free", "Free"],
|
|
511
|
+
]);
|
|
512
|
+
|
|
513
|
+
/**
|
|
514
|
+
* Map xAI's subscription tier to the name its own UI shows.
|
|
515
|
+
*
|
|
516
|
+
* Separators are folded away before matching so the same table covers whichever
|
|
517
|
+
* casing the API returns ("SuperGrok Heavy", "SUPER_GROK_HEAVY", "superGrokHeavy").
|
|
518
|
+
* Unknown values return null rather than being passed through: the Limits panel
|
|
519
|
+
* falls back to the bare brand name, which is better than rendering a raw enum
|
|
520
|
+
* (issue #130 shipped "Kimi Type_event" that way).
|
|
521
|
+
*/
|
|
522
|
+
function deriveGrokPlanLabel(rawTier) {
|
|
523
|
+
if (rawTier == null) return null;
|
|
524
|
+
const key = String(rawTier).toLowerCase().replace(/[^a-z0-9]+/g, "");
|
|
525
|
+
if (!key) return null;
|
|
526
|
+
// Exact match only. Prefix matching would read an unseen tier such as
|
|
527
|
+
// "SuperGrok Business" as plain "SuperGrok", and a confidently wrong plan on
|
|
528
|
+
// the card is worse than no plan at all.
|
|
529
|
+
return GROK_PLAN_TIERS.get(key) ?? null;
|
|
530
|
+
}
|
|
531
|
+
|
|
498
532
|
/**
|
|
499
533
|
* Parse either:
|
|
500
534
|
* - Unified billing (`?format=credits`): weekly/monthly period + creditUsagePercent
|
|
@@ -567,6 +601,8 @@ function normalizeGrokBillingResponse(body) {
|
|
|
567
601
|
}
|
|
568
602
|
|
|
569
603
|
return {
|
|
604
|
+
// Read from the response root, not from `config`.
|
|
605
|
+
plan_label: deriveGrokPlanLabel(body?.subscriptionTier),
|
|
570
606
|
period_type: periodType,
|
|
571
607
|
monthly_credits_limit: monthlyLimit,
|
|
572
608
|
monthly_credits_used: used,
|
|
@@ -721,6 +757,7 @@ module.exports = {
|
|
|
721
757
|
normalizeGrokPeriodType,
|
|
722
758
|
inferGrokPeriodTypeFromDates,
|
|
723
759
|
sumProductUsagePercent,
|
|
760
|
+
deriveGrokPlanLabel,
|
|
724
761
|
normalizeGrokBillingResponse,
|
|
725
762
|
fetchGrokBilling,
|
|
726
763
|
fetchGrokLimits,
|
|
@@ -26,7 +26,7 @@ function buildOpencodePlugin({ notifyPath }) {
|
|
|
26
26
|
return (
|
|
27
27
|
`// ${PLUGIN_MARKER}\n` +
|
|
28
28
|
`const notifyPath = ${JSON.stringify(safeNotifyPath)};\n` +
|
|
29
|
-
`
|
|
29
|
+
`const server = async ({ $ }) => {\n` +
|
|
30
30
|
` return {\n` +
|
|
31
31
|
` event: async ({ event }) => {\n` +
|
|
32
32
|
` if (!event || event.type !== ${JSON.stringify(DEFAULT_EVENT)}) return;\n` +
|
|
@@ -40,6 +40,25 @@ function buildOpencodePlugin({ notifyPath }) {
|
|
|
40
40
|
` } catch (_) {}\n` +
|
|
41
41
|
` }\n` +
|
|
42
42
|
` };\n` +
|
|
43
|
+
`};\n` +
|
|
44
|
+
// Three loaders read this one file (issue #646):
|
|
45
|
+
// * older opencode v1 takes the named export;
|
|
46
|
+
// * current v1 (verified on 1.18.30) requires a default export carrying
|
|
47
|
+
// `id` and `server()`, and rejects the file outright without them;
|
|
48
|
+
// * v2 requires a default export carrying `id` and `setup()`/`effect()`,
|
|
49
|
+
// and ignores `server()`.
|
|
50
|
+
// Emitting all three keeps a single generated file valid everywhere. v2's
|
|
51
|
+
// plugin context exposes no event stream and no shell (`@opencode-ai/plugin`
|
|
52
|
+
// v2 PluginContext is agent/aisdk/catalog/command/integration/reference/skill
|
|
53
|
+
// only), so there is nothing for `setup` to subscribe to -- it exists to make
|
|
54
|
+
// the plugin load instead of erroring on every startup. Usage itself does not
|
|
55
|
+
// depend on this hook: opencode rows are parsed from the on-disk storage and
|
|
56
|
+
// opencode.db, and the hook only makes a sync happen sooner.
|
|
57
|
+
`export const TokenTrackerPlugin = server;\n` +
|
|
58
|
+
`export default {\n` +
|
|
59
|
+
` id: "tokentracker",\n` +
|
|
60
|
+
` server,\n` +
|
|
61
|
+
` setup: async () => {},\n` +
|
|
43
62
|
`};\n`
|
|
44
63
|
);
|
|
45
64
|
}
|