tokentracker-cli 0.95.2 → 0.96.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/README.md +2 -0
  2. package/README.zh-CN.md +1 -1
  3. package/dashboard/dist/assets/{AchievementBadge-DtB1MwFe.js → AchievementBadge-DKyElm0T.js} +1 -1
  4. package/dashboard/dist/assets/{AchievementsPage--vddu0dC.js → AchievementsPage-BvCx3wND.js} +2 -2
  5. package/dashboard/dist/assets/{AchievementsSection-CDl9hsbj.js → AchievementsSection-DN69LzXX.js} +1 -1
  6. package/dashboard/dist/assets/{BadgeDetailModal-C7WsIRy9.js → BadgeDetailModal-DGiKdZfz.js} +1 -1
  7. package/dashboard/dist/assets/{BotAnimated-CmXyzIhX.js → BotAnimated-zN8rH7_K.js} +1 -1
  8. package/dashboard/dist/assets/{Card-SUbC3VNS.js → Card-COWo-ClV.js} +1 -1
  9. package/dashboard/dist/assets/{ClawdAnimated-BdEbs8Me.js → ClawdAnimated-BWsB7Eat.js} +2 -2
  10. package/dashboard/dist/assets/{CommandPalette-D1RLLeHB.js → CommandPalette-BfvIwuoJ.js} +1 -1
  11. package/dashboard/dist/assets/{CommunityStatsModal-5ESGJgZQ.js → CommunityStatsModal-BQWg7R_y.js} +1 -1
  12. package/dashboard/dist/assets/{ConfirmModal-DsCd51b2.js → ConfirmModal-C7ABSI-O.js} +1 -1
  13. package/dashboard/dist/assets/{Controls-BVrLC_QD.js → Controls-vMzEZzej.js} +1 -1
  14. package/dashboard/dist/assets/DashboardPage-QBhbCMZF.js +1 -0
  15. package/dashboard/dist/assets/{DevicePage-zYjj-m5V.js → DevicePage-3ejUBLWM.js} +1 -1
  16. package/dashboard/dist/assets/{DialogClose-D66yBqkd.js → DialogClose-D_dvtfGV.js} +1 -1
  17. package/dashboard/dist/assets/DialogDescription-ryGYdQjX.js +1 -0
  18. package/dashboard/dist/assets/{DialogTitle-C4ia00lc.js → DialogTitle-_ahf0z8b.js} +1 -1
  19. package/dashboard/dist/assets/{FadeIn-DF2c8XaR.js → FadeIn-D7Jcfz1N.js} +1 -1
  20. package/dashboard/dist/assets/{HeaderGithubStar-Cnr3aqcX.js → HeaderGithubStar-D--Rx5BS.js} +1 -1
  21. package/dashboard/dist/assets/{HoverTooltip-DBOpxlH7.js → HoverTooltip-n1W0z3Wr.js} +1 -1
  22. package/dashboard/dist/assets/{IpCheckPage-CUY6KBaV.js → IpCheckPage-D202tl9B.js} +1 -1
  23. package/dashboard/dist/assets/{LandingPage-DKL8hZEq.js → LandingPage-D6yL2EZo.js} +2 -2
  24. package/dashboard/dist/assets/{LeaderboardAvatar-DRYeMNlq.js → LeaderboardAvatar-ChFg2mtA.js} +1 -1
  25. package/dashboard/dist/assets/{LeaderboardPage-DpD9Az3k.js → LeaderboardPage-BXHwGs8r.js} +2 -2
  26. package/dashboard/dist/assets/{LeaderboardProfileModal-Dfg0V13F.js → LeaderboardProfileModal-B5LoOpCk.js} +3 -3
  27. package/dashboard/dist/assets/{LeaderboardProfilePage-DH-jcVDu.js → LeaderboardProfilePage-jsukhRz8.js} +1 -1
  28. package/dashboard/dist/assets/LimitsPage-PvqkOOwp.js +6 -0
  29. package/dashboard/dist/assets/{LocalOnlyNotice-Bj_m0hw7.js → LocalOnlyNotice-Du0lz657.js} +1 -1
  30. package/dashboard/dist/assets/{LoginCard-BVKvtx60.js → LoginCard-BFEX9x7-.js} +1 -1
  31. package/dashboard/dist/assets/{LoginModal-mUGiSIJN.js → LoginModal-DqC7_d35.js} +1 -1
  32. package/dashboard/dist/assets/{LoginPage-BORCuCUt.js → LoginPage-Dzx8N7HE.js} +1 -1
  33. package/dashboard/dist/assets/{PetPage-D1JfEOVA.js → PetPage-CNlWHF4z.js} +1 -1
  34. package/dashboard/dist/assets/{PopoverPopup-DK3et-HG.js → PopoverPopup-D9jadD3j.js} +1 -1
  35. package/dashboard/dist/assets/{ProviderIcon-By8FAjxR.js → ProviderIcon-Caz5PuAm.js} +1 -1
  36. package/dashboard/dist/assets/{ResetPasswordPage-DPa81jqa.js → ResetPasswordPage-x_GR79sR.js} +1 -1
  37. package/dashboard/dist/assets/{SegmentedControl-DLzS-2eZ.js → SegmentedControl-BxDiDV4R.js} +1 -1
  38. package/dashboard/dist/assets/{Select-C05W6XEM.js → Select-B5o-1sEl.js} +1 -1
  39. package/dashboard/dist/assets/{SelectItemText-CcfB3blP.js → SelectItemText-CiA6L7Wk.js} +1 -1
  40. package/dashboard/dist/assets/{ServiceStatusPage-ByqLbHv1.js → ServiceStatusPage-BVQuVdjg.js} +1 -1
  41. package/dashboard/dist/assets/SessionsPage-DE39wNIO.js +2 -0
  42. package/dashboard/dist/assets/SettingsPage-DJrb_fsK.js +2 -0
  43. package/dashboard/dist/assets/{SkillsPage-BuuqQuNU.js → SkillsPage-COk-YQQ5.js} +1 -1
  44. package/dashboard/dist/assets/{TokenGalaxy-DzccxkXW.js → TokenGalaxy-BPM779Wb.js} +1 -1
  45. package/dashboard/dist/assets/{ToolbarRootContext-XUDMp5uy.js → ToolbarRootContext-CozJT6Vs.js} +1 -1
  46. package/dashboard/dist/assets/{TrendMonitor-B-yYabbz.js → TrendMonitor-BkNy-o1D.js} +1 -1
  47. package/dashboard/dist/assets/{WidgetsPage-CwUDjEFo.js → WidgetsPage-Bpg6H-ZB.js} +1 -1
  48. package/dashboard/dist/assets/{WrappedPage-Dr9ow3gH.js → WrappedPage-C6-NM-RO.js} +1 -1
  49. package/dashboard/dist/assets/__vite-browser-external-BGnq8Ebm.js +45 -0
  50. package/dashboard/dist/assets/__vite-browser-external-CvMMIjhi.css +1 -0
  51. package/dashboard/dist/assets/{agent-logos-Cqc_suYk.js → agent-logos-DpbkRqXT.js} +1 -1
  52. package/dashboard/dist/assets/{arrow-up-right-DSsR3Ntr.js → arrow-up-right-BjOtWUVs.js} +1 -1
  53. package/dashboard/dist/assets/{check-Cy35lAKh.js → check-BlxnX5jZ.js} +1 -1
  54. package/dashboard/dist/assets/{composite-BDwOlhhX.js → composite-Dxmivlk4.js} +1 -1
  55. package/dashboard/dist/assets/{copy-4szu5cYh.js → copy-CIsWjLY5.js} +1 -1
  56. package/dashboard/dist/assets/{download-DdGW6Krz.js → download-QDaQbQdd.js} +1 -1
  57. package/dashboard/dist/assets/{external-link-DwSt83cq.js → external-link-DPV4VU3m.js} +1 -1
  58. package/dashboard/dist/assets/{flame-DubukWqK.js → flame-B_X-7VNp.js} +1 -1
  59. package/dashboard/dist/assets/{format-tokens-B70EdQcN.js → format-tokens-DEx2TJj8.js} +1 -1
  60. package/dashboard/dist/assets/{icons-B86TLdAj.js → icons-983RyGSl.js} +1 -1
  61. package/dashboard/dist/assets/{index-B_KMoBeK.js → index-BONYA8HZ.js} +1 -1
  62. package/dashboard/dist/assets/{index-DI-W-pun.js → index-Cjs5stC0.js} +1 -1
  63. package/dashboard/dist/assets/{index-DzEMcUwI.js → index-qtonw_x4.js} +1 -1
  64. package/dashboard/dist/assets/{info-BzFpLbl6.js → info-DpVOhXZI.js} +1 -1
  65. package/dashboard/dist/assets/limits-providers-BUoquSA-.js +1 -0
  66. package/dashboard/dist/assets/{link-2-BQp7-3T7.js → link-2-CBro-upz.js} +1 -1
  67. package/dashboard/dist/assets/{loader-circle-lrDmbIg5.js → loader-circle-wYFdSyOd.js} +1 -1
  68. package/dashboard/dist/assets/{maximize-2-Cnd_Oth8.js → maximize-2-DhTyQ4ly.js} +1 -1
  69. package/dashboard/dist/assets/{modifiers.esm-CPTpZdHU.js → modifiers.esm-CPljwVhN.js} +1 -1
  70. package/dashboard/dist/assets/{monitor-smartphone-C7UY1zRx.js → monitor-smartphone-D_wr-HOR.js} +1 -1
  71. package/dashboard/dist/assets/{plus-Bglp9N_7.js → plus-BNjfkBEF.js} +1 -1
  72. package/dashboard/dist/assets/{provider-display-CGsFySs6.js → provider-display-BOBtUyFi.js} +1 -1
  73. package/dashboard/dist/assets/{react-DKXriBSF.js → react-yHv9MTUA.js} +1 -1
  74. package/dashboard/dist/assets/{search-D_LLDRdU.js → search-Dfak92ZA.js} +1 -1
  75. package/dashboard/dist/assets/{skills-api-CJWjKIco.js → skills-api-By2PdNa1.js} +1 -1
  76. package/dashboard/dist/assets/{sortable.esm-zlY09tye.js → sortable.esm-B9xy66_v.js} +1 -1
  77. package/dashboard/dist/assets/{store-8e16Ac2h.js → store-oQZR4d9M.js} +1 -1
  78. package/dashboard/dist/assets/{terminal-CR228ekj.js → terminal-pbXWBmZM.js} +1 -1
  79. package/dashboard/dist/assets/{trash-2-BjLWewOp.js → trash-2-CboDPwbW.js} +1 -1
  80. package/dashboard/dist/assets/{use-community-stats-DhOJPaVg.js → use-community-stats-D6HTdnHq.js} +1 -1
  81. package/dashboard/dist/assets/{use-latest-request-guard-lcGhb-NC.js → use-latest-request-guard-hwSr9Cam.js} +1 -1
  82. package/dashboard/dist/assets/{use-limits-display-prefs-DJIImtLN.js → use-limits-display-prefs-B-pbwUS8.js} +1 -1
  83. package/dashboard/dist/assets/{use-ordered-list-BJZfZuoJ.js → use-ordered-list-OtfOqrNb.js} +1 -1
  84. package/dashboard/dist/assets/use-reduced-motion-DGXcZBX3.js +1 -0
  85. package/dashboard/dist/assets/{use-session-efficiency-pref-C-l4b1cD.js → use-session-efficiency-pref-BScvtS8F.js} +1 -1
  86. package/dashboard/dist/assets/{use-transform-UjIt477N.js → use-transform-Cy1ykjEs.js} +1 -1
  87. package/dashboard/dist/assets/{use-usage-limits-DqoTZrqT.js → use-usage-limits-CSMb2zYW.js} +1 -1
  88. package/dashboard/dist/assets/{useCurrency-CnM8aB4v.js → useCurrency-VqF3cy1C.js} +1 -1
  89. package/dashboard/dist/assets/{useTokenFormat-D4pAK2ld.js → useTokenFormat-Cgub4MXu.js} +1 -1
  90. package/dashboard/dist/assets/{zap-Du1IyEtj.js → zap-DStzvQJI.js} +1 -1
  91. package/dashboard/dist/index.html +2 -2
  92. package/dashboard/dist/ip-check.html +2 -2
  93. package/dashboard/dist/leaderboard.html +2 -2
  94. package/dashboard/dist/share.html +2 -2
  95. package/package.json +1 -1
  96. package/src/commands/status.js +4 -4
  97. package/src/commands/sync.js +5 -3
  98. package/src/lib/ark-agent-plan-limits.js +438 -0
  99. package/src/lib/ark-coding-plan-limits.js +103 -28
  100. package/src/lib/codex-model-attribution.js +128 -0
  101. package/src/lib/codex-rollout-parser.js +98 -4
  102. package/src/lib/command-runner.js +13 -0
  103. package/src/lib/local-api.js +3 -0
  104. package/src/lib/pricing/curated-overrides.json +6 -6
  105. package/src/lib/pricing/index.js +38 -1
  106. package/src/lib/pricing/seed-snapshot.json +1 -1
  107. package/src/lib/rollout.js +67 -14
  108. package/src/lib/session-analytics.js +374 -110
  109. package/src/lib/usage-limits.js +130 -18
  110. package/dashboard/dist/assets/DashboardPage-DtUOG6og.js +0 -1
  111. package/dashboard/dist/assets/DialogDescription-BVlaoajd.js +0 -1
  112. package/dashboard/dist/assets/LimitsPage-CVCKPScf.js +0 -5
  113. package/dashboard/dist/assets/SessionsPage-CEDv1thj.js +0 -2
  114. package/dashboard/dist/assets/SettingsPage-DAcndJZQ.js +0 -2
  115. package/dashboard/dist/assets/__vite-browser-external-CCMdjCX2.css +0 -1
  116. package/dashboard/dist/assets/__vite-browser-external-DPOlUkcY.js +0 -45
  117. package/dashboard/dist/assets/limits-providers-DxZOjiXQ.js +0 -1
  118. package/dashboard/dist/assets/use-reduced-motion-DdpxZQoh.js +0 -1
@@ -32,6 +32,7 @@ const { fetchZcodeLimits } = require("./zcode-limits");
32
32
  const { fetchOpencodeGoLimits } = require("./opencode-go-limits");
33
33
  const { fetchQoderLimits, fetchQoderCnLimits } = require("./qoder-limits");
34
34
  const { fetchArkCodingPlanLimits } = require("./ark-coding-plan-limits");
35
+ const { fetchArkAgentPlanLimits } = require("./ark-agent-plan-limits");
35
36
  const { fetchProviderServiceStatus } = require("./provider-status");
36
37
  const { readSqliteJsonRows, readSqliteJsonRowsAsync } = require("./sqlite-reader");
37
38
  const {
@@ -2166,10 +2167,19 @@ async function detectAntigravityProcess({
2166
2167
  );
2167
2168
  processes = parseWindowsProcesses(result?.stdout);
2168
2169
  } else {
2169
- const result = await runCommand(commandRunner, "/bin/ps", ["-ax", "-o", "pid=,command="], {
2170
+ let result = await runCommand(commandRunner, "/bin/ps", ["-ax", "-o", "pid=,command="], {
2170
2171
  timeout: timeoutMs,
2171
2172
  signal,
2172
2173
  });
2174
+ const isSpawnFailure = result?.error
2175
+ && result.error.code !== "ETIMEDOUT"
2176
+ && result.error.name !== "AbortError";
2177
+ if (isSpawnFailure && !result?.stdout) {
2178
+ result = await runCommand(commandRunner, "ps", ["-ax", "-o", "pid=,command="], {
2179
+ timeout: timeoutMs,
2180
+ signal,
2181
+ });
2182
+ }
2173
2183
  processes = String(result?.stdout || "")
2174
2184
  .split("\n")
2175
2185
  .map(parseProcessLine)
@@ -2632,10 +2642,70 @@ function parseWindowsListeningPorts(output, pid) {
2632
2642
  return Array.from(ports).sort((a, b) => a - b);
2633
2643
  }
2634
2644
 
2645
+ function parseLinuxProcListeningPorts(pid, { procRoot = "/proc" } = {}) {
2646
+ const numPid = Number(pid);
2647
+ if (!Number.isFinite(numPid) || numPid <= 0) return [];
2648
+ const inodes = new Set();
2649
+ try {
2650
+ const fds = fs.readdirSync(path.join(procRoot, String(numPid), "fd"));
2651
+ for (const fd of fds) {
2652
+ try {
2653
+ const link = fs.readlinkSync(path.join(procRoot, String(numPid), "fd", fd));
2654
+ const m = link.match(/^socket:\[(\d+)\]$/);
2655
+ if (m) inodes.add(m[1]);
2656
+ } catch {}
2657
+ }
2658
+ } catch {
2659
+ return [];
2660
+ }
2661
+ if (inodes.size === 0) return [];
2662
+
2663
+ const ports = new Set();
2664
+ for (const table of [path.join(procRoot, "net", "tcp"), path.join(procRoot, "net", "tcp6")]) {
2665
+ try {
2666
+ const content = fs.readFileSync(table, "utf8");
2667
+ for (const line of content.split("\n")) {
2668
+ const parts = line.trim().split(/\s+/);
2669
+ if (parts.length > 9 && parts[3] === "0A") {
2670
+ const inode = parts[9];
2671
+ if (inodes.has(inode)) {
2672
+ const portHex = parts[1]?.split(":")[1];
2673
+ if (portHex) {
2674
+ const port = parseInt(portHex, 16);
2675
+ if (Number.isInteger(port) && port > 0 && port <= 65535) {
2676
+ ports.add(port);
2677
+ }
2678
+ }
2679
+ }
2680
+ }
2681
+ }
2682
+ } catch {}
2683
+ }
2684
+ return Array.from(ports).sort((a, b) => a - b);
2685
+ }
2686
+
2687
+ function parseSsListeningPorts(output, pid) {
2688
+ const ports = new Set();
2689
+ const pidPattern = pid ? new RegExp(`\\bpid=${pid}\\b`) : null;
2690
+ for (const line of String(output || "").split("\n")) {
2691
+ if (!line.includes("LISTEN")) continue;
2692
+ if (pidPattern && !pidPattern.test(line)) continue;
2693
+ const match = line.match(/:(\d+)\s+/);
2694
+ if (match) {
2695
+ const port = Number(match[1]);
2696
+ if (Number.isInteger(port) && port > 0 && port <= 65535) {
2697
+ ports.add(port);
2698
+ }
2699
+ }
2700
+ }
2701
+ return Array.from(ports).sort((a, b) => a - b);
2702
+ }
2703
+
2635
2704
  async function listAntigravityPorts(pid, {
2636
2705
  commandRunner,
2637
2706
  platform = process.platform,
2638
2707
  timeoutMs = ANTIGRAVITY_PROCESS_SCAN_TIMEOUT_MS,
2708
+ procRoot = "/proc",
2639
2709
  signal,
2640
2710
  } = {}) {
2641
2711
  if (platform === "win32") {
@@ -2651,21 +2721,48 @@ async function listAntigravityPorts(pid, {
2651
2721
  }
2652
2722
  return ports;
2653
2723
  }
2724
+
2725
+ // On Linux, try procfs first when no mock command runner is provided (zero-spawn, no dependencies).
2726
+ if (platform === "linux" && !commandRunner) {
2727
+ const procPorts = parseLinuxProcListeningPorts(pid, { procRoot });
2728
+ if (procPorts.length > 0) return procPorts;
2729
+ }
2730
+
2654
2731
  const lsof = await resolveLsofBinary({ commandRunner });
2655
- if (!lsof) {
2656
- throw new Error("Antigravity port detection needs lsof. Install it, then retry.");
2732
+ if (lsof) {
2733
+ const result = await runCommand(
2734
+ commandRunner,
2735
+ lsof,
2736
+ ["-nP", "-iTCP", "-sTCP:LISTEN", "-a", "-p", String(pid)],
2737
+ { timeout: timeoutMs, signal },
2738
+ );
2739
+ const ports = parseListeningPorts(result?.stdout);
2740
+ if (ports.length > 0) return ports;
2657
2741
  }
2658
- const result = await runCommand(
2659
- commandRunner,
2660
- lsof,
2661
- ["-nP", "-iTCP", "-sTCP:LISTEN", "-a", "-p", String(pid)],
2662
- { timeout: timeoutMs, signal },
2663
- );
2664
- const ports = parseListeningPorts(result?.stdout);
2665
- if (!ports.length) {
2666
- throw new Error("Antigravity is running but not exposing ports yet. Try again in a few seconds.");
2742
+
2743
+ // On Linux, fall back to procfs (honoring procRoot) or ss if lsof is absent or yielded no ports.
2744
+ if (platform === "linux") {
2745
+ const procPorts = parseLinuxProcListeningPorts(pid, { procRoot });
2746
+ if (procPorts.length > 0) return procPorts;
2747
+
2748
+ const ss = await whichBinary("ss", { commandRunner });
2749
+ if (ss) {
2750
+ const result = await runCommand(
2751
+ commandRunner,
2752
+ ss,
2753
+ ["-H", "-tlpn"],
2754
+ { timeout: timeoutMs, signal },
2755
+ );
2756
+ const ssPorts = parseSsListeningPorts(result?.stdout, pid);
2757
+ if (ssPorts.length > 0) return ssPorts;
2758
+ }
2667
2759
  }
2668
- return ports;
2760
+
2761
+ if (!lsof && platform !== "linux") {
2762
+ throw new Error("Antigravity port detection needs lsof. Install it, then retry.");
2763
+ }
2764
+
2765
+ throw new Error("Antigravity is running but not exposing ports yet. Try again in a few seconds.");
2669
2766
  }
2670
2767
 
2671
2768
  function antigravityDefaultBody() {
@@ -3619,7 +3716,7 @@ async function fetchUsageLimitsUncached({
3619
3716
  : null;
3620
3717
 
3621
3718
  const providerFetch = withFetchTimeout(fetchImpl, providerTimeoutMs);
3622
- const [claudeResult, codexResult, cursor, kimi, gemini, kiro, antigravity, copilot, grok, zcode, opencodeGoRaw, qoder, qoderCn, codingPlan, claudeServiceStatus] = await Promise.all([
3719
+ const [claudeResult, codexResult, cursor, kimi, gemini, kiro, antigravity, copilot, grok, zcode, opencodeGoRaw, qoder, qoderCn, codingPlan, agentPlan, claudeServiceStatus] = await Promise.all([
3623
3720
  claudeToken && !freshClaudeCache && !claudeRetryAtMs
3624
3721
  ? withProviderTimeout(fetchClaudeUsageLimits(claudeToken, { fetchImpl: providerFetch, maxAttempts: 1 }), "Claude", providerTimeoutMs).then(
3625
3722
  (value) => ({ status: "fulfilled", value }),
@@ -3692,10 +3789,10 @@ async function fetchUsageLimitsUncached({
3692
3789
  "Qoder CN",
3693
3790
  providerTimeoutMs,
3694
3791
  ).catch((reason) => ({ configured: true, error: reason?.message || "Unknown error" })),
3695
- // Ark Coding Plan (火山方舟): subscription quota via the user's own
3696
- // arkcli binary. No token-consumption source — consumption for the
3697
- // compatible CLIs is already counted from their local files; this only
3698
- // surfaces the 5h/week/month quota percentages.
3792
+ // Ark Coding Plan / Agent Plan (火山方舟): two parallel subscription
3793
+ // products sharing the same arkcli binary. No token-consumption source —
3794
+ // consumption for the compatible CLIs is already counted from their
3795
+ // local files; these only surface the 5h/week/month quota percentages.
3699
3796
  withAbortableProviderTimeout(
3700
3797
  (signal) => fetchArkCodingPlanLimits({
3701
3798
  commandRunner,
@@ -3708,6 +3805,18 @@ async function fetchUsageLimitsUncached({
3708
3805
  "Ark Coding Plan",
3709
3806
  providerTimeoutMs,
3710
3807
  ).catch((reason) => ({ configured: true, error: reason?.message || "Unknown error" })),
3808
+ withAbortableProviderTimeout(
3809
+ (signal) => fetchArkAgentPlanLimits({
3810
+ commandRunner,
3811
+ home,
3812
+ nowMs,
3813
+ platform,
3814
+ signal,
3815
+ providerTimeoutMs,
3816
+ }),
3817
+ "Ark Agent Plan",
3818
+ providerTimeoutMs,
3819
+ ).catch((reason) => ({ configured: true, error: reason?.message || "Unknown error" })),
3711
3820
  // Public status-page probe (fail-soft, own 5-min cache in provider-status.js).
3712
3821
  // Only probed for configured accounts — without a token the Claude section
3713
3822
  // never renders, so the reading would have nowhere to go.
@@ -3904,6 +4013,7 @@ async function fetchUsageLimitsUncached({
3904
4013
  qoder: withPlanLabel(qoder, qoder?.plan_label, "Qoder"),
3905
4014
  qoderCn: withPlanLabel(qoderCn, qoderCn?.plan_label, "Qoder CN"),
3906
4015
  codingPlan: withPlanLabel(codingPlan, codingPlan?.plan_label, "Ark Coding Plan"),
4016
+ agentPlan: withPlanLabel(agentPlan, agentPlan?.plan_label, "Ark Agent Plan"),
3907
4017
  };
3908
4018
 
3909
4019
  for (const [providerName, provider] of Object.entries(data)) {
@@ -3955,6 +4065,8 @@ module.exports = {
3955
4065
  loadAntigravityCredentials,
3956
4066
  parseListeningPorts,
3957
4067
  parseWindowsListeningPorts,
4068
+ parseLinuxProcListeningPorts,
4069
+ parseSsListeningPorts,
3958
4070
  listAntigravityPorts,
3959
4071
  detectAntigravityProcess,
3960
4072
  fetchAntigravityLimits,