@ipv9/tokentracker-cli 0.39.34 → 0.39.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +48 -5
  2. package/dashboard/dist/assets/{ActivityHeatmap-ChFDzpdS.js → ActivityHeatmap-rUm9bSZ9.js} +1 -1
  3. package/dashboard/dist/assets/{Card-ijF07sCs.js → Card-YWr91b5b.js} +1 -1
  4. package/dashboard/dist/assets/{DashboardPage-CSzPtd5f.js → DashboardPage-DdJOVJuw.js} +1 -1
  5. package/dashboard/dist/assets/{DevicePage-C1k0oqsA.js → DevicePage-CQMG1bh8.js} +1 -1
  6. package/dashboard/dist/assets/{DialogTitle-BFFfzcmZ.js → DialogTitle-BM0Hz4Pq.js} +1 -1
  7. package/dashboard/dist/assets/{FadeIn-BgK1lNmX.js → FadeIn-D8xysY3i.js} +1 -1
  8. package/dashboard/dist/assets/{InsforgeUserHeaderControls-2VB98X4S.js → InsforgeUserHeaderControls-CsAafXyj.js} +1 -1
  9. package/dashboard/dist/assets/{IpCheckPage-DzbaCMvc.js → IpCheckPage-Bbg9erkT.js} +1 -1
  10. package/dashboard/dist/assets/{LandingPage-BgG9N4uz.js → LandingPage-BCMsWOwJ.js} +1 -1
  11. package/dashboard/dist/assets/{LeaderboardAvatar-ShOySfzi.js → LeaderboardAvatar-CkQa4EX2.js} +1 -1
  12. package/dashboard/dist/assets/{LeaderboardPage-D2IP8z5a.js → LeaderboardPage-CyDX3tDL.js} +3 -3
  13. package/dashboard/dist/assets/{LeaderboardProfileModal-DsFdGEx3.js → LeaderboardProfileModal-CMctMA-p.js} +1 -1
  14. package/dashboard/dist/assets/{LeaderboardProfilePage-CnZRsiia.js → LeaderboardProfilePage-DTZ_6dBt.js} +1 -1
  15. package/dashboard/dist/assets/LimitsPage-V7939U8b.js +2 -0
  16. package/dashboard/dist/assets/{LocalOnlyNotice-BLIekBBt.js → LocalOnlyNotice-dODOM3SB.js} +1 -1
  17. package/dashboard/dist/assets/{LoginPage-CBGEh6Yy.js → LoginPage-CE5GBEI2.js} +1 -1
  18. package/dashboard/dist/assets/{PopoverPopup-C09O8D7u.js → PopoverPopup-CRzMMFsC.js} +1 -1
  19. package/dashboard/dist/assets/{Select-CCh3LC5S.js → Select-m6edgfye.js} +1 -1
  20. package/dashboard/dist/assets/{SelectItemText-kCuvclJY.js → SelectItemText-DIoTPvZM.js} +1 -1
  21. package/dashboard/dist/assets/{SettingsPage-DoOB-uyq.js → SettingsPage-DObaSleW.js} +1 -1
  22. package/dashboard/dist/assets/{SkillsPage-CVGJm49x.js → SkillsPage-BSi26dZo.js} +1 -1
  23. package/dashboard/dist/assets/{WidgetsPage-DC1wk1qB.js → WidgetsPage-CTl7OtvF.js} +1 -1
  24. package/dashboard/dist/assets/{WrappedPage-ajs88eqx.js → WrappedPage-BXwhD9aq.js} +1 -1
  25. package/dashboard/dist/assets/{arrow-up-right-CjOHnUd-.js → arrow-up-right-DxdoYoxg.js} +1 -1
  26. package/dashboard/dist/assets/{download-aF04AJYI.js → download-BZkwGDg8.js} +1 -1
  27. package/dashboard/dist/assets/{info-D0oZ0eak.js → info-DRaQWOpM.js} +1 -1
  28. package/dashboard/dist/assets/{main-fV3uYMtM.js → main-CuaPRwHu.js} +5 -2
  29. package/dashboard/dist/assets/use-limits-display-prefs-5cj2WfP-.js +1 -0
  30. package/dashboard/dist/assets/{use-native-settings-Bi7E0UR8.js → use-native-settings-BfydbPtC.js} +1 -1
  31. package/dashboard/dist/assets/{use-spring-BOREQ4Dn.js → use-spring-BxDSGjR_.js} +1 -1
  32. package/dashboard/dist/assets/{use-usage-limits-BGYp5WOe.js → use-usage-limits-D_5PMCyF.js} +1 -1
  33. package/dashboard/dist/assets/{useCurrency-VxllGPBM.js → useCurrency-DQhzQX2k.js} +1 -1
  34. package/dashboard/dist/assets/{useOpenInteractionType-CzmlePCG.js → useOpenInteractionType--grUNSll.js} +1 -1
  35. package/dashboard/dist/index.html +1 -1
  36. package/dashboard/dist/share.html +1 -1
  37. package/package.json +1 -1
  38. package/src/cli.js +3 -3
  39. package/src/commands/doctor.js +5 -0
  40. package/src/commands/serve.js +3 -1
  41. package/src/lib/browser-auth.js +40 -13
  42. package/src/lib/doctor.js +104 -1
  43. package/src/lib/pricing/seed-snapshot.json +1 -1
  44. package/src/lib/usage-limits.js +133 -1
  45. package/dashboard/dist/assets/LimitsPage-L68WyhKt.js +0 -2
  46. package/dashboard/dist/assets/use-limits-display-prefs-DGaESD6L.js +0 -1
@@ -494,6 +494,133 @@ async function fetchKimiLimits({ home, env, fetchImpl = fetch } = {}) {
494
494
  }
495
495
  }
496
496
 
497
+ function resolveZaiAuth({ env = process.env } = {}) {
498
+ const anthropicBaseUrl = typeof env?.ANTHROPIC_BASE_URL === "string" ? env.ANTHROPIC_BASE_URL.trim() : "";
499
+ const anthropicToken = typeof env?.ANTHROPIC_AUTH_TOKEN === "string" ? env.ANTHROPIC_AUTH_TOKEN.trim() : "";
500
+ if (anthropicBaseUrl && anthropicToken) {
501
+ try {
502
+ const host = new URL(anthropicBaseUrl).hostname.toLowerCase();
503
+ if (host === "api.z.ai" || host === "open.bigmodel.cn") {
504
+ return {
505
+ endpoint: `${new URL(anthropicBaseUrl).origin}/api/monitor/usage/quota/limit`,
506
+ authorization: anthropicToken,
507
+ };
508
+ }
509
+ } catch (_error) {}
510
+ }
511
+
512
+ const apiKey = [
513
+ env?.TOKENTRACKER_ZAI_API_KEY,
514
+ env?.ZAI_API_KEY,
515
+ env?.ZHIPU_API_KEY,
516
+ ].find((value) => typeof value === "string" && value.trim());
517
+ if (!apiKey) return null;
518
+ const trimmed = apiKey.trim();
519
+ return {
520
+ endpoint: "https://api.z.ai/api/monitor/usage/quota/limit",
521
+ authorization: /^Bearer\s+/i.test(trimmed) ? trimmed : `Bearer ${trimmed}`,
522
+ };
523
+ }
524
+
525
+ function zaiResetTime(value) {
526
+ if (value === null || value === undefined || value === "") return null;
527
+ const n = Number(value);
528
+ if (Number.isFinite(n) && n > 0) {
529
+ const ms = n > 10_000_000_000 ? n : n * 1000;
530
+ const date = new Date(ms);
531
+ return Number.isFinite(date.getTime()) ? date.toISOString() : null;
532
+ }
533
+ const ts = Date.parse(String(value));
534
+ return Number.isFinite(ts) ? new Date(ts).toISOString() : null;
535
+ }
536
+
537
+ function zaiWindowFromLimit(limit) {
538
+ if (!limit || typeof limit !== "object") return null;
539
+ let usedPercent = clampPercent(limit.percentage);
540
+ if (usedPercent === null) {
541
+ const current = Number(limit.currentValue ?? limit.usage);
542
+ const remaining = Number(limit.remaining);
543
+ if (Number.isFinite(current) && current >= 0 && Number.isFinite(remaining) && remaining >= 0) {
544
+ usedPercent = clampPercent((current / (current + remaining)) * 100);
545
+ }
546
+ }
547
+ return buildWindow({
548
+ usedPercent,
549
+ resetAt: zaiResetTime(limit.nextResetTime),
550
+ });
551
+ }
552
+
553
+ function normalizeZaiUsageResponse(body) {
554
+ const data = body?.data && typeof body.data === "object" ? body.data : {};
555
+ const limits = Array.isArray(data.limits) ? data.limits : [];
556
+ let fiveHour = null;
557
+ let weekly = null;
558
+ let monthly = null;
559
+
560
+ for (const limit of limits) {
561
+ const type = typeof limit?.type === "string" ? limit.type : "";
562
+ const unit = Number(limit?.unit);
563
+ const number = Number(limit?.number);
564
+ if (type === "TOKENS_LIMIT" && unit === 3 && number === 5 && !fiveHour) {
565
+ fiveHour = zaiWindowFromLimit(limit);
566
+ } else if (type === "TOKENS_LIMIT" && unit === 6 && !weekly) {
567
+ weekly = zaiWindowFromLimit(limit);
568
+ } else if (type === "TIME_LIMIT" && !monthly) {
569
+ monthly = zaiWindowFromLimit(limit);
570
+ }
571
+ }
572
+
573
+ return {
574
+ account_plan: typeof data.planName === "string"
575
+ ? data.planName
576
+ : typeof data.plan === "string"
577
+ ? data.plan
578
+ : typeof data.level === "string"
579
+ ? data.level
580
+ : data.level != null
581
+ ? String(data.level)
582
+ : null,
583
+ primary_window: fiveHour,
584
+ secondary_window: weekly,
585
+ tertiary_window: monthly,
586
+ };
587
+ }
588
+
589
+ async function fetchZaiLimits({ env = process.env, fetchImpl = fetch } = {}) {
590
+ const auth = resolveZaiAuth({ env });
591
+ if (!auth) return { configured: false };
592
+
593
+ try {
594
+ const res = await fetchImpl(auth.endpoint, {
595
+ method: "GET",
596
+ headers: {
597
+ Authorization: auth.authorization,
598
+ Accept: "application/json",
599
+ },
600
+ });
601
+ if (res.status === 401 || res.status === 403) {
602
+ throw new Error("Z.AI token rejected. Check ZAI_API_KEY or ZHIPU_API_KEY.");
603
+ }
604
+ if (!res.ok) {
605
+ throw new Error(`Z.AI API returned ${res.status}`);
606
+ }
607
+ const json = await res.json();
608
+ if (json?.success === false) {
609
+ throw new Error(json?.msg || "Z.AI API returned an unsuccessful response.");
610
+ }
611
+ return {
612
+ configured: true,
613
+ error: null,
614
+ ...normalizeZaiUsageResponse(json),
615
+ };
616
+ } catch (error) {
617
+ return {
618
+ configured: true,
619
+ error: error?.message || "Unknown error",
620
+ };
621
+ }
622
+ }
623
+
497
624
  function resolveGeminiHome({ home, env } = {}) {
498
625
  const explicit = typeof env?.GEMINI_HOME === "string" ? env.GEMINI_HOME.trim() : "";
499
626
  return explicit ? path.resolve(explicit) : path.join(home, ".gemini");
@@ -1698,7 +1825,7 @@ async function getUsageLimits({
1698
1825
  const codexPlanType = codexAuthRefreshed?.planType || null;
1699
1826
 
1700
1827
  const providerFetch = withFetchTimeout(fetchImpl, providerTimeoutMs);
1701
- const [claudeResult, codexResult, cursor, kimi, gemini, kiro, antigravity, copilot] = await Promise.all([
1828
+ const [claudeResult, codexResult, cursor, kimi, zai, gemini, kiro, antigravity, copilot] = await Promise.all([
1702
1829
  claudeToken
1703
1830
  ? withProviderTimeout(fetchClaudeUsageLimits(claudeToken, { fetchImpl: providerFetch, maxAttempts: 1 }), "Claude", providerTimeoutMs).then(
1704
1831
  (value) => ({ status: "fulfilled", value }),
@@ -1719,6 +1846,8 @@ async function getUsageLimits({
1719
1846
  .catch((reason) => ({ configured: true, error: reason?.message || "Unknown error" })),
1720
1847
  withProviderTimeout(fetchKimiLimits({ home, env, fetchImpl: providerFetch }), "Kimi", providerTimeoutMs)
1721
1848
  .catch((reason) => ({ configured: true, error: reason?.message || "Unknown error" })),
1849
+ withProviderTimeout(fetchZaiLimits({ env, fetchImpl: providerFetch }), "Z.AI", providerTimeoutMs)
1850
+ .catch((reason) => ({ configured: true, error: reason?.message || "Unknown error" })),
1722
1851
  withProviderTimeout(fetchGeminiLimits({ home, env, fetchImpl: providerFetch, commandRunner }), "Gemini", providerTimeoutMs)
1723
1852
  .catch((reason) => ({ configured: true, error: reason?.message || "Unknown error" })),
1724
1853
  Promise.resolve().then(() => fetchKiroLimits({ commandRunner, now })),
@@ -1772,6 +1901,7 @@ async function getUsageLimits({
1772
1901
  codex: withPlanLabel(codex, codex.plan_type, "Codex"),
1773
1902
  cursor: withPlanLabel(cursor, cursor.membership_type, "Cursor"),
1774
1903
  kimi: withPlanLabel(kimi, kimi.subscription_type || kimi.membership_level, "Kimi"),
1904
+ zai: withPlanLabel(zai, zai.account_plan, "Z.AI"),
1775
1905
  gemini: withPlanLabel(gemini, gemini.account_plan, "Gemini"),
1776
1906
  kiro: withPlanLabel(kiro, kiro.plan_name, "Kiro"),
1777
1907
  antigravity: withPlanLabel(antigravity, antigravity.account_plan, "Antigravity"),
@@ -1795,6 +1925,8 @@ module.exports = {
1795
1925
  normalizeCursorUsageSummary,
1796
1926
  normalizeGeminiQuotaResponse,
1797
1927
  normalizeKimiUsageResponse,
1928
+ normalizeZaiUsageResponse,
1929
+ fetchZaiLimits,
1798
1930
  parseKiroUsageOutput,
1799
1931
  normalizeAntigravityResponse,
1800
1932
  parseListeningPorts,
@@ -1,2 +0,0 @@
1
- import{j as i,O as f,A as s,r as E,az as I,i as P,L as O,aA as R}from"./main-fV3uYMtM.js";import{u as C}from"./use-usage-limits-BGYp5WOe.js";import{L as u,u as M}from"./use-limits-display-prefs-DGaESD6L.js";import{C as j}from"./Card-ijF07sCs.js";import{F as T}from"./FadeIn-BgK1lNmX.js";import{L as A}from"./LocalOnlyNotice-BLIekBBt.js";import"./arrow-up-right-CjOHnUd-.js";import"./download-aF04AJYI.js";const S=[3,2,3,3,2,2,3];function x({className:n}){return i.jsx("div",{className:f("rounded bg-oai-gray-200/70 dark:bg-oai-gray-800/70 animate-pulse",n)})}function D(){return i.jsxs("div",{className:"flex items-center gap-2",children:[i.jsx(x,{className:"h-3 w-12 shrink-0"}),i.jsx(x,{className:"flex-1 h-1.5 rounded-full min-w-0"}),i.jsx(x,{className:"h-3 w-[30px] shrink-0"}),i.jsx(x,{className:"h-3 w-6 shrink-0"})]})}function $({bars:n,index:e}){const r=e%3===0?"w-24":e%3===1?"w-20":"w-[4.5rem]";return i.jsxs("div",{className:"flex flex-col gap-1.5",children:[i.jsxs("div",{className:"flex items-center gap-1.5",children:[i.jsx(x,{className:"h-[14px] w-[14px] rounded shrink-0"}),i.jsx(x,{className:f("h-4",r)})]}),Array.from({length:n},(t,o)=>i.jsx(D,{},o))]})}function G(){return i.jsx(j,{children:i.jsxs("div",{className:"flex flex-col gap-3",children:[i.jsx(x,{className:"h-3.5 w-28"}),S.map((n,e)=>i.jsx($,{bars:n,index:e},e))]})})}function l(n){if(!n)return null;const e=typeof n=="number"?n*1e3:Date.parse(n);if(!Number.isFinite(e))return null;const r=e-Date.now();if(r<=0)return s("shared.time.now");const t=Math.floor(r/6e4);if(t<60)return`${t}m`;const o=Math.floor(t/60);return o<24?`${o}h`:`${Math.floor(o/24)}d`}function H(n,e){const r=e===u.REMAINING?100-n:n;return r>=90?"bg-red-500":r>=70?"bg-amber-500":"bg-emerald-500"}function a({label:n,pct:e,reset:r,mode:t=u.USED}){const o=Math.max(0,Math.min(100,Number(e)||0)),d=t===u.REMAINING?100-o:o,p=Math.round(d),y=d>0&&p===0?Math.max(d,.35):d,w=d>0&&p===0?"<1":String(p);return i.jsxs("div",{className:"flex items-center gap-2",children:[i.jsx("span",{className:"text-[11px] text-oai-gray-500 dark:text-oai-gray-400 w-12 shrink-0",children:n}),i.jsx("div",{className:"flex-1 bg-oai-gray-100 dark:bg-oai-gray-700/50 rounded-full h-1.5 overflow-hidden",children:i.jsx("div",{className:`${H(d,t)} rounded-full h-full transition-[width] duration-500 ease-out`,style:{width:`${y}%`,minWidth:d>0?"3px":0}})}),i.jsxs("span",{className:"text-[11px] tabular-nums text-oai-gray-500 dark:text-oai-gray-400 w-9 text-right shrink-0 whitespace-nowrap",children:[w,"%"]}),r?i.jsx("span",{className:"text-[10px] text-oai-gray-400 dark:text-oai-gray-500 w-6 text-right shrink-0",children:r}):null]})}function m({name:n,icon:e,children:r}){const o=e==="/brand-logos/cursor.svg"||e==="/brand-logos/kiro.svg"||e==="/brand-logos/copilot.svg"||e==="/brand-logos/kimi.svg"?"w-[14px] h-[14px] dark:invert":"w-[14px] h-[14px]";return i.jsxs("div",{className:"flex flex-col gap-1.5",children:[i.jsxs("div",{className:"flex items-center gap-1.5",children:[e?i.jsx("img",{src:e,alt:"",className:o}):null,i.jsx("span",{className:"text-sm font-medium text-oai-black dark:text-oai-white",children:n})]}),r]})}const F=["claude","codex","cursor","gemini","kimi","kiro","copilot","antigravity"],B={claude:{name:"Claude",icon:"/brand-logos/claude-code.svg"},codex:{name:"Codex",icon:"/brand-logos/codex.svg"},cursor:{name:"Cursor",icon:"/brand-logos/cursor.svg"},gemini:{name:"Gemini",icon:"/brand-logos/gemini.svg"},kimi:{name:"Kimi",icon:"/brand-logos/kimi.svg"},kiro:{name:"Kiro",icon:"/brand-logos/kiro.svg"},copilot:{name:"GitHub Copilot",icon:"/brand-logos/copilot.svg"},antigravity:{name:"Antigravity",icon:"/brand-logos/antigravity.svg"}};function c({children:n,tone:e="neutral"}){const r=e==="error"?"text-red-600 dark:text-red-400":"text-oai-gray-500 dark:text-oai-gray-400";return i.jsx("div",{className:`text-[11px] leading-snug ${r}`,children:n})}function U(n,e,r){const t=B[n];if(!t)return null;if(!e?.configured)return i.jsx(m,{name:t.name,icon:t.icon,children:i.jsx(c,{children:s("limits.status.not_connected")})},n);if(e.error)return i.jsx(m,{name:t.name,icon:t.icon,children:i.jsx(c,{tone:"error",children:s("shared.error.prefix",{error:e.error})})},n);const o=e.plan_label?`${t.name} ${e.plan_label}`:t.name;switch(n){case"claude":return i.jsxs(m,{name:o,icon:t.icon,children:[e.five_hour?i.jsx(a,{label:"5h",pct:e.five_hour.utilization,reset:l(e.five_hour.resets_at),mode:r}):null,e.seven_day?i.jsx(a,{label:"7d",pct:e.seven_day.utilization,reset:l(e.seven_day.resets_at),mode:r}):null,e.seven_day_opus?i.jsx(a,{label:"Opus",pct:e.seven_day_opus.utilization,reset:l(e.seven_day_opus.resets_at),mode:r}):null,!e.five_hour&&!e.seven_day&&!e.seven_day_opus?i.jsx(c,{children:s("limits.status.no_data")}):null]},"claude");case"codex":return i.jsxs(m,{name:o,icon:t.icon,children:[e.primary_window?i.jsx(a,{label:"5h",pct:e.primary_window.used_percent,reset:l(e.primary_window.reset_at),mode:r}):null,e.secondary_window?i.jsx(a,{label:"7d",pct:e.secondary_window.used_percent,reset:l(e.secondary_window.reset_at),mode:r}):null,!e.primary_window&&!e.secondary_window?i.jsx(c,{children:s("limits.status.no_data")}):null]},"codex");case"cursor":return i.jsxs(m,{name:o,icon:t.icon,children:[e.primary_window?i.jsx(a,{label:s("limits.label.cursor_plan"),pct:e.primary_window.used_percent,reset:l(e.primary_window.reset_at),mode:r}):null,e.secondary_window?i.jsx(a,{label:s("limits.label.cursor_auto"),pct:e.secondary_window.used_percent,reset:l(e.secondary_window.reset_at),mode:r}):null,e.tertiary_window?i.jsx(a,{label:s("limits.label.cursor_api"),pct:e.tertiary_window.used_percent,reset:l(e.tertiary_window.reset_at),mode:r}):null,!e.primary_window&&!e.secondary_window&&!e.tertiary_window?i.jsx(c,{children:s("limits.status.no_data")}):null]},"cursor");case"gemini":return i.jsxs(m,{name:o,icon:t.icon,children:[e.primary_window?i.jsx(a,{label:"Pro",pct:e.primary_window.used_percent,reset:l(e.primary_window.reset_at),mode:r}):null,e.secondary_window?i.jsx(a,{label:"Flash",pct:e.secondary_window.used_percent,reset:l(e.secondary_window.reset_at),mode:r}):null,e.tertiary_window?i.jsx(a,{label:"Lite",pct:e.tertiary_window.used_percent,reset:l(e.tertiary_window.reset_at),mode:r}):null,!e.primary_window&&!e.secondary_window&&!e.tertiary_window?i.jsx(c,{children:s("limits.status.no_data")}):null]},"gemini");case"kimi":return i.jsxs(m,{name:o,icon:t.icon,children:[e.primary_window?i.jsx(a,{label:s("limits.label.kimi_weekly"),pct:e.primary_window.used_percent,reset:l(e.primary_window.reset_at),mode:r}):null,e.secondary_window?i.jsx(a,{label:s("limits.label.kimi_5h"),pct:e.secondary_window.used_percent,reset:l(e.secondary_window.reset_at),mode:r}):null,e.tertiary_window?i.jsx(a,{label:s("limits.label.kimi_total"),pct:e.tertiary_window.used_percent,reset:l(e.tertiary_window.reset_at),mode:r}):null,e.parallel_limit?i.jsx(c,{children:s("limits.label.kimi_parallel",{count:e.parallel_limit})}):null,!e.primary_window&&!e.secondary_window&&!e.tertiary_window?i.jsx(c,{children:s("limits.status.no_data")}):null]},"kimi");case"kiro":return i.jsxs(m,{name:o,icon:t.icon,children:[e.primary_window?i.jsx(a,{label:s("limits.label.kiro_month"),pct:e.primary_window.used_percent,reset:l(e.primary_window.reset_at),mode:r}):null,e.secondary_window?i.jsx(a,{label:s("limits.label.kiro_bonus"),pct:e.secondary_window.used_percent,reset:l(e.secondary_window.reset_at),mode:r}):null,!e.primary_window&&!e.secondary_window?i.jsx(c,{children:s("limits.status.no_data")}):null]},"kiro");case"antigravity":return i.jsxs(m,{name:o,icon:t.icon,children:[e.primary_window?i.jsx(a,{label:"Claude",pct:e.primary_window.used_percent,reset:l(e.primary_window.reset_at),mode:r}):null,e.secondary_window?i.jsx(a,{label:"G Pro",pct:e.secondary_window.used_percent,reset:l(e.secondary_window.reset_at),mode:r}):null,e.tertiary_window?i.jsx(a,{label:"Flash",pct:e.tertiary_window.used_percent,reset:l(e.tertiary_window.reset_at),mode:r}):null,!e.primary_window&&!e.secondary_window&&!e.tertiary_window?i.jsx(c,{children:s("limits.status.no_data")}):null]},"antigravity");case"copilot":return i.jsxs(m,{name:o,icon:t.icon,children:[e.primary_window?i.jsx(a,{label:s("limits.label.copilot_premium"),pct:e.primary_window.used_percent,reset:l(e.primary_window.reset_at),mode:r}):null,e.secondary_window?i.jsx(a,{label:s("limits.label.copilot_chat"),pct:e.secondary_window.used_percent,reset:l(e.secondary_window.reset_at),mode:r}):null,!e.primary_window&&!e.secondary_window?i.jsx(c,{children:s("limits.status.no_data")}):null,e.otel_has_files||e.otel_enabled?null:i.jsx(z,{defaultDir:e.otel_default_dir})]},"copilot");default:return null}}function z({defaultDir:n}){const[e,r]=E.useState(!1),o=["export COPILOT_OTEL_ENABLED=true","export COPILOT_OTEL_EXPORTER_TYPE=file",`export COPILOT_OTEL_FILE_EXPORTER_PATH="${n||"$HOME/.copilot/otel"}/copilot-otel-$(date +%Y%m%d).jsonl"`].join(`
2
- `),d=async()=>{try{await navigator.clipboard.writeText(o),r(!0),setTimeout(()=>r(!1),1600)}catch{}};return i.jsxs("div",{className:"mt-1 rounded-md border border-amber-300/60 dark:border-amber-700/40 bg-amber-50/50 dark:bg-amber-900/10 px-2.5 py-2 text-[11px] text-oai-gray-600 dark:text-oai-gray-300",children:[i.jsx("div",{className:"font-medium text-oai-gray-700 dark:text-oai-gray-200",children:s("limits.copilot.otelHint.title")}),i.jsx("div",{className:"mt-0.5 leading-snug",children:s("limits.copilot.otelHint.body")}),i.jsx("pre",{className:"mt-1.5 overflow-x-auto rounded bg-oai-gray-100 dark:bg-oai-gray-900/60 px-2 py-1.5 font-mono text-[10.5px] leading-tight whitespace-pre",children:o}),i.jsx("button",{type:"button",onClick:d,className:"mt-1 inline-flex items-center gap-1 rounded border border-oai-gray-300 dark:border-oai-gray-700 px-1.5 py-0.5 text-[10.5px] text-oai-gray-700 dark:text-oai-gray-200 hover:bg-oai-gray-100 dark:hover:bg-oai-gray-800 transition-colors",children:e?s("limits.copilot.otelHint.copied"):s("limits.copilot.otelHint.copy")})]})}function Y({claude:n,codex:e,cursor:r,gemini:t,kimi:o,kiro:d,antigravity:p,copilot:y,order:w,visibility:h,displayMode:v}){const k={claude:n,codex:e,cursor:r,gemini:t,kimi:o,kiro:d,antigravity:p,copilot:y},N=Array.isArray(w)&&w.length>0?w:F,g=v===u.REMAINING?u.REMAINING:u.USED,L=g===u.REMAINING?s("limits.settings.display_mode_remaining"):s("limits.settings.display_mode_used"),b=N.filter(_=>!h||h[_]!==!1).map(_=>U(_,k[_],g)).filter(Boolean);return i.jsx(T,{delay:.15,children:i.jsx(j,{children:i.jsxs("div",{className:"flex flex-col gap-3",children:[i.jsxs("h3",{className:"text-sm font-medium text-oai-gray-500 dark:text-oai-gray-300 uppercase tracking-wide",children:[s("limits.panel.title"),s("limits.panel.mode_separator"),L]}),b.length>0?b:i.jsx(c,{children:s("limits.status.all_hidden")})]})})})}const K=typeof window<"u"&&(window.location.hostname==="localhost"||window.location.hostname==="127.0.0.1");function ie(){const n=I(),{data:e,error:r,isLoading:t}=C(n?{initialRefresh:!0,initialState:n,publishToPreloadCache:!0}:{initialRefresh:!0,publishToPreloadCache:!0}),o=M();return!K&&!P()?i.jsx("div",{className:"flex flex-col flex-1 text-oai-black dark:text-oai-white font-oai antialiased",children:i.jsx(A,{})}):i.jsx("div",{className:"flex flex-col flex-1 text-oai-black dark:text-oai-white font-oai antialiased",children:i.jsx("main",{className:"flex-1 pt-8 sm:pt-10 pb-12 sm:pb-16",children:i.jsxs("div",{className:"mx-auto max-w-6xl px-4 sm:px-6",children:[i.jsxs("div",{className:"flex flex-row items-start justify-between gap-4 mb-8",children:[i.jsxs("div",{className:"min-w-0",children:[i.jsx("h1",{className:"text-3xl sm:text-4xl font-semibold tracking-tight text-oai-black dark:text-white mb-3",children:s("nav.limits")}),i.jsx("p",{className:"text-oai-gray-500 dark:text-oai-gray-400 text-sm sm:text-base",children:s("limits.page.subtitle")})]}),i.jsx(O,{to:"/settings","aria-label":s("limits.page.openSettings"),title:s("limits.page.openSettings"),className:"shrink-0 inline-flex h-9 w-9 items-center justify-center rounded-lg border border-oai-gray-200 dark:border-oai-gray-800 text-oai-gray-600 dark:text-oai-gray-400 hover:bg-oai-gray-100 dark:hover:bg-oai-gray-800 hover:text-oai-black dark:hover:text-white transition-colors no-underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-oai-brand-500",children:i.jsx(R,{className:"h-4 w-4","aria-hidden":!0})})]}),t?i.jsx(G,{}):i.jsxs(i.Fragment,{children:[r?i.jsx("p",{className:"mb-4 text-sm text-red-500 dark:text-red-400",children:s("shared.error.prefix",{error:r})}):null,i.jsx(Y,{claude:e?.claude,codex:e?.codex,cursor:e?.cursor,gemini:e?.gemini,kimi:e?.kimi,kiro:e?.kiro,antigravity:e?.antigravity,copilot:e?.copilot,order:o.order,visibility:o.visibility,displayMode:o.displayMode})]})]})})})}export{ie as LimitsPage};
@@ -1 +0,0 @@
1
- import{r as o,aS as I,aT as h,aU as C,aV as V}from"./main-fV3uYMtM.js";const d=["claude","codex","cursor","gemini","kimi","kiro","copilot","antigravity"],Y={claude:"Claude",codex:"Codex",cursor:"Cursor",gemini:"Gemini",kimi:"Kimi",kiro:"Kiro",copilot:"GitHub Copilot",antigravity:"Antigravity"},P={claude:"/brand-logos/claude-code.svg",codex:"/brand-logos/codex.svg",cursor:"/brand-logos/cursor.svg",gemini:"/brand-logos/gemini.svg",kimi:"/brand-logos/kimi.svg",kiro:"/brand-logos/kiro.svg",copilot:"/brand-logos/copilot.svg",antigravity:"/brand-logos/antigravity.svg"},w="tt.limits.providerOrder",m="tt.limits.providerVisibility",S="tt.limits.displayMode",p="limitsDisplayMode",f=Object.freeze({USED:"used",REMAINING:"remaining"}),E=new Set(Object.values(f));function O(){if(typeof window>"u")return[...d];try{const n=window.localStorage.getItem(w);if(!n)return[...d];const a=JSON.parse(n);if(!Array.isArray(a))return[...d];const r=a.filter(c=>d.includes(c));for(const c of d)r.includes(c)||r.push(c);return r}catch{return[...d]}}function D(){const n=Object.fromEntries(d.map(a=>[a,!0]));if(typeof window>"u")return n;try{const a=window.localStorage.getItem(m);if(!a)return n;const r=JSON.parse(a);if(!r||typeof r!="object")return n;const c={...n};for(const u of d)typeof r[u]=="boolean"&&(c[u]=r[u]);return c}catch{return n}}function v(){if(typeof window>"u")return f.USED;try{const n=window.localStorage.getItem(S);return E.has(n)?n:f.USED}catch{return f.USED}}function T(){const[n,a]=o.useState(O),[r,c]=o.useState(D),[u,l]=o.useState(v),g=o.useCallback(t=>{E.has(t)&&(l(t),I()&&h(p,t))},[]);o.useEffect(()=>{if(!(typeof window>"u"))try{window.localStorage.setItem(w,JSON.stringify(n))}catch{}},[n]),o.useEffect(()=>{if(!(typeof window>"u"))try{window.localStorage.setItem(m,JSON.stringify(r))}catch{}},[r]),o.useEffect(()=>{if(!(typeof window>"u"))try{window.localStorage.setItem(S,u)}catch{}},[u]),o.useEffect(()=>{if(!I())return;const t=C(e=>{const i=e?.[p];E.has(i)&&l(i)});return V(),t},[]),o.useEffect(()=>{if(typeof window>"u")return;const t=e=>{e.key===w&&a(O()),e.key===m&&c(D()),e.key===S&&l(v())};return window.addEventListener("storage",t),()=>window.removeEventListener("storage",t)},[]);const k=o.useCallback(t=>{c(e=>({...e,[t]:!e[t]}))},[]),x=o.useCallback(t=>{a(e=>{const i=e.indexOf(t);if(i<=0)return e;const s=[...e];return[s[i-1],s[i]]=[s[i],s[i-1]],s})},[]),M=o.useCallback(t=>{a(e=>{const i=e.indexOf(t);if(i<0||i>=e.length-1)return e;const s=[...e];return[s[i],s[i+1]]=[s[i+1],s[i]],s})},[]),_=o.useCallback((t,e)=>{t!==e&&a(i=>{const s=i.indexOf(t),b=i.indexOf(e);if(s<0||b<0)return i;const y=[...i],[A]=y.splice(s,1);return y.splice(b,0,A),y})},[]),L=o.useCallback(()=>{a([...d]),c(Object.fromEntries(d.map(t=>[t,!0]))),g(f.USED)},[g]),N=o.useMemo(()=>n.filter(t=>r[t]!==!1),[n,r]);return{order:n,visibility:r,displayMode:u,setDisplayMode:g,visibleOrdered:N,toggle:k,moveUp:x,moveDown:M,moveToward:_,reset:L}}export{f as L,P as a,Y as b,T as u};