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.
- package/README.md +2 -0
- package/README.zh-CN.md +1 -1
- package/dashboard/dist/assets/{AchievementBadge-DtB1MwFe.js → AchievementBadge-DKyElm0T.js} +1 -1
- package/dashboard/dist/assets/{AchievementsPage--vddu0dC.js → AchievementsPage-BvCx3wND.js} +2 -2
- package/dashboard/dist/assets/{AchievementsSection-CDl9hsbj.js → AchievementsSection-DN69LzXX.js} +1 -1
- package/dashboard/dist/assets/{BadgeDetailModal-C7WsIRy9.js → BadgeDetailModal-DGiKdZfz.js} +1 -1
- package/dashboard/dist/assets/{BotAnimated-CmXyzIhX.js → BotAnimated-zN8rH7_K.js} +1 -1
- package/dashboard/dist/assets/{Card-SUbC3VNS.js → Card-COWo-ClV.js} +1 -1
- package/dashboard/dist/assets/{ClawdAnimated-BdEbs8Me.js → ClawdAnimated-BWsB7Eat.js} +2 -2
- package/dashboard/dist/assets/{CommandPalette-D1RLLeHB.js → CommandPalette-BfvIwuoJ.js} +1 -1
- package/dashboard/dist/assets/{CommunityStatsModal-5ESGJgZQ.js → CommunityStatsModal-BQWg7R_y.js} +1 -1
- package/dashboard/dist/assets/{ConfirmModal-DsCd51b2.js → ConfirmModal-C7ABSI-O.js} +1 -1
- package/dashboard/dist/assets/{Controls-BVrLC_QD.js → Controls-vMzEZzej.js} +1 -1
- package/dashboard/dist/assets/DashboardPage-QBhbCMZF.js +1 -0
- package/dashboard/dist/assets/{DevicePage-zYjj-m5V.js → DevicePage-3ejUBLWM.js} +1 -1
- package/dashboard/dist/assets/{DialogClose-D66yBqkd.js → DialogClose-D_dvtfGV.js} +1 -1
- package/dashboard/dist/assets/DialogDescription-ryGYdQjX.js +1 -0
- package/dashboard/dist/assets/{DialogTitle-C4ia00lc.js → DialogTitle-_ahf0z8b.js} +1 -1
- package/dashboard/dist/assets/{FadeIn-DF2c8XaR.js → FadeIn-D7Jcfz1N.js} +1 -1
- package/dashboard/dist/assets/{HeaderGithubStar-Cnr3aqcX.js → HeaderGithubStar-D--Rx5BS.js} +1 -1
- package/dashboard/dist/assets/{HoverTooltip-DBOpxlH7.js → HoverTooltip-n1W0z3Wr.js} +1 -1
- package/dashboard/dist/assets/{IpCheckPage-CUY6KBaV.js → IpCheckPage-D202tl9B.js} +1 -1
- package/dashboard/dist/assets/{LandingPage-DKL8hZEq.js → LandingPage-D6yL2EZo.js} +2 -2
- package/dashboard/dist/assets/{LeaderboardAvatar-DRYeMNlq.js → LeaderboardAvatar-ChFg2mtA.js} +1 -1
- package/dashboard/dist/assets/{LeaderboardPage-DpD9Az3k.js → LeaderboardPage-BXHwGs8r.js} +2 -2
- package/dashboard/dist/assets/{LeaderboardProfileModal-Dfg0V13F.js → LeaderboardProfileModal-B5LoOpCk.js} +3 -3
- package/dashboard/dist/assets/{LeaderboardProfilePage-DH-jcVDu.js → LeaderboardProfilePage-jsukhRz8.js} +1 -1
- package/dashboard/dist/assets/LimitsPage-PvqkOOwp.js +6 -0
- package/dashboard/dist/assets/{LocalOnlyNotice-Bj_m0hw7.js → LocalOnlyNotice-Du0lz657.js} +1 -1
- package/dashboard/dist/assets/{LoginCard-BVKvtx60.js → LoginCard-BFEX9x7-.js} +1 -1
- package/dashboard/dist/assets/{LoginModal-mUGiSIJN.js → LoginModal-DqC7_d35.js} +1 -1
- package/dashboard/dist/assets/{LoginPage-BORCuCUt.js → LoginPage-Dzx8N7HE.js} +1 -1
- package/dashboard/dist/assets/{PetPage-D1JfEOVA.js → PetPage-CNlWHF4z.js} +1 -1
- package/dashboard/dist/assets/{PopoverPopup-DK3et-HG.js → PopoverPopup-D9jadD3j.js} +1 -1
- package/dashboard/dist/assets/{ProviderIcon-By8FAjxR.js → ProviderIcon-Caz5PuAm.js} +1 -1
- package/dashboard/dist/assets/{ResetPasswordPage-DPa81jqa.js → ResetPasswordPage-x_GR79sR.js} +1 -1
- package/dashboard/dist/assets/{SegmentedControl-DLzS-2eZ.js → SegmentedControl-BxDiDV4R.js} +1 -1
- package/dashboard/dist/assets/{Select-C05W6XEM.js → Select-B5o-1sEl.js} +1 -1
- package/dashboard/dist/assets/{SelectItemText-CcfB3blP.js → SelectItemText-CiA6L7Wk.js} +1 -1
- package/dashboard/dist/assets/{ServiceStatusPage-ByqLbHv1.js → ServiceStatusPage-BVQuVdjg.js} +1 -1
- package/dashboard/dist/assets/SessionsPage-DE39wNIO.js +2 -0
- package/dashboard/dist/assets/SettingsPage-DJrb_fsK.js +2 -0
- package/dashboard/dist/assets/{SkillsPage-BuuqQuNU.js → SkillsPage-COk-YQQ5.js} +1 -1
- package/dashboard/dist/assets/{TokenGalaxy-DzccxkXW.js → TokenGalaxy-BPM779Wb.js} +1 -1
- package/dashboard/dist/assets/{ToolbarRootContext-XUDMp5uy.js → ToolbarRootContext-CozJT6Vs.js} +1 -1
- package/dashboard/dist/assets/{TrendMonitor-B-yYabbz.js → TrendMonitor-BkNy-o1D.js} +1 -1
- package/dashboard/dist/assets/{WidgetsPage-CwUDjEFo.js → WidgetsPage-Bpg6H-ZB.js} +1 -1
- package/dashboard/dist/assets/{WrappedPage-Dr9ow3gH.js → WrappedPage-C6-NM-RO.js} +1 -1
- package/dashboard/dist/assets/__vite-browser-external-BGnq8Ebm.js +45 -0
- package/dashboard/dist/assets/__vite-browser-external-CvMMIjhi.css +1 -0
- package/dashboard/dist/assets/{agent-logos-Cqc_suYk.js → agent-logos-DpbkRqXT.js} +1 -1
- package/dashboard/dist/assets/{arrow-up-right-DSsR3Ntr.js → arrow-up-right-BjOtWUVs.js} +1 -1
- package/dashboard/dist/assets/{check-Cy35lAKh.js → check-BlxnX5jZ.js} +1 -1
- package/dashboard/dist/assets/{composite-BDwOlhhX.js → composite-Dxmivlk4.js} +1 -1
- package/dashboard/dist/assets/{copy-4szu5cYh.js → copy-CIsWjLY5.js} +1 -1
- package/dashboard/dist/assets/{download-DdGW6Krz.js → download-QDaQbQdd.js} +1 -1
- package/dashboard/dist/assets/{external-link-DwSt83cq.js → external-link-DPV4VU3m.js} +1 -1
- package/dashboard/dist/assets/{flame-DubukWqK.js → flame-B_X-7VNp.js} +1 -1
- package/dashboard/dist/assets/{format-tokens-B70EdQcN.js → format-tokens-DEx2TJj8.js} +1 -1
- package/dashboard/dist/assets/{icons-B86TLdAj.js → icons-983RyGSl.js} +1 -1
- package/dashboard/dist/assets/{index-B_KMoBeK.js → index-BONYA8HZ.js} +1 -1
- package/dashboard/dist/assets/{index-DI-W-pun.js → index-Cjs5stC0.js} +1 -1
- package/dashboard/dist/assets/{index-DzEMcUwI.js → index-qtonw_x4.js} +1 -1
- package/dashboard/dist/assets/{info-BzFpLbl6.js → info-DpVOhXZI.js} +1 -1
- package/dashboard/dist/assets/limits-providers-BUoquSA-.js +1 -0
- package/dashboard/dist/assets/{link-2-BQp7-3T7.js → link-2-CBro-upz.js} +1 -1
- package/dashboard/dist/assets/{loader-circle-lrDmbIg5.js → loader-circle-wYFdSyOd.js} +1 -1
- package/dashboard/dist/assets/{maximize-2-Cnd_Oth8.js → maximize-2-DhTyQ4ly.js} +1 -1
- package/dashboard/dist/assets/{modifiers.esm-CPTpZdHU.js → modifiers.esm-CPljwVhN.js} +1 -1
- package/dashboard/dist/assets/{monitor-smartphone-C7UY1zRx.js → monitor-smartphone-D_wr-HOR.js} +1 -1
- package/dashboard/dist/assets/{plus-Bglp9N_7.js → plus-BNjfkBEF.js} +1 -1
- package/dashboard/dist/assets/{provider-display-CGsFySs6.js → provider-display-BOBtUyFi.js} +1 -1
- package/dashboard/dist/assets/{react-DKXriBSF.js → react-yHv9MTUA.js} +1 -1
- package/dashboard/dist/assets/{search-D_LLDRdU.js → search-Dfak92ZA.js} +1 -1
- package/dashboard/dist/assets/{skills-api-CJWjKIco.js → skills-api-By2PdNa1.js} +1 -1
- package/dashboard/dist/assets/{sortable.esm-zlY09tye.js → sortable.esm-B9xy66_v.js} +1 -1
- package/dashboard/dist/assets/{store-8e16Ac2h.js → store-oQZR4d9M.js} +1 -1
- package/dashboard/dist/assets/{terminal-CR228ekj.js → terminal-pbXWBmZM.js} +1 -1
- package/dashboard/dist/assets/{trash-2-BjLWewOp.js → trash-2-CboDPwbW.js} +1 -1
- package/dashboard/dist/assets/{use-community-stats-DhOJPaVg.js → use-community-stats-D6HTdnHq.js} +1 -1
- package/dashboard/dist/assets/{use-latest-request-guard-lcGhb-NC.js → use-latest-request-guard-hwSr9Cam.js} +1 -1
- package/dashboard/dist/assets/{use-limits-display-prefs-DJIImtLN.js → use-limits-display-prefs-B-pbwUS8.js} +1 -1
- package/dashboard/dist/assets/{use-ordered-list-BJZfZuoJ.js → use-ordered-list-OtfOqrNb.js} +1 -1
- package/dashboard/dist/assets/use-reduced-motion-DGXcZBX3.js +1 -0
- package/dashboard/dist/assets/{use-session-efficiency-pref-C-l4b1cD.js → use-session-efficiency-pref-BScvtS8F.js} +1 -1
- package/dashboard/dist/assets/{use-transform-UjIt477N.js → use-transform-Cy1ykjEs.js} +1 -1
- package/dashboard/dist/assets/{use-usage-limits-DqoTZrqT.js → use-usage-limits-CSMb2zYW.js} +1 -1
- package/dashboard/dist/assets/{useCurrency-CnM8aB4v.js → useCurrency-VqF3cy1C.js} +1 -1
- package/dashboard/dist/assets/{useTokenFormat-D4pAK2ld.js → useTokenFormat-Cgub4MXu.js} +1 -1
- package/dashboard/dist/assets/{zap-Du1IyEtj.js → zap-DStzvQJI.js} +1 -1
- package/dashboard/dist/index.html +2 -2
- package/dashboard/dist/ip-check.html +2 -2
- package/dashboard/dist/leaderboard.html +2 -2
- package/dashboard/dist/share.html +2 -2
- package/package.json +1 -1
- package/src/commands/status.js +4 -4
- package/src/commands/sync.js +5 -3
- package/src/lib/ark-agent-plan-limits.js +438 -0
- package/src/lib/ark-coding-plan-limits.js +103 -28
- package/src/lib/codex-model-attribution.js +128 -0
- package/src/lib/codex-rollout-parser.js +98 -4
- package/src/lib/command-runner.js +13 -0
- package/src/lib/local-api.js +3 -0
- package/src/lib/pricing/curated-overrides.json +6 -6
- package/src/lib/pricing/index.js +38 -1
- package/src/lib/pricing/seed-snapshot.json +1 -1
- package/src/lib/rollout.js +67 -14
- package/src/lib/session-analytics.js +374 -110
- package/src/lib/usage-limits.js +130 -18
- package/dashboard/dist/assets/DashboardPage-DtUOG6og.js +0 -1
- package/dashboard/dist/assets/DialogDescription-BVlaoajd.js +0 -1
- package/dashboard/dist/assets/LimitsPage-CVCKPScf.js +0 -5
- package/dashboard/dist/assets/SessionsPage-CEDv1thj.js +0 -2
- package/dashboard/dist/assets/SettingsPage-DAcndJZQ.js +0 -2
- package/dashboard/dist/assets/__vite-browser-external-CCMdjCX2.css +0 -1
- package/dashboard/dist/assets/__vite-browser-external-DPOlUkcY.js +0 -45
- package/dashboard/dist/assets/limits-providers-DxZOjiXQ.js +0 -1
- package/dashboard/dist/assets/use-reduced-motion-DdpxZQoh.js +0 -1
package/src/lib/usage-limits.js
CHANGED
|
@@ -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
|
-
|
|
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 (
|
|
2656
|
-
|
|
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
|
-
|
|
2659
|
-
|
|
2660
|
-
|
|
2661
|
-
|
|
2662
|
-
|
|
2663
|
-
|
|
2664
|
-
|
|
2665
|
-
|
|
2666
|
-
|
|
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
|
-
|
|
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 (火山方舟):
|
|
3696
|
-
// arkcli binary. No token-consumption source —
|
|
3697
|
-
// compatible CLIs is already counted from their
|
|
3698
|
-
//
|
|
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,
|