tokentracker-cli 0.96.1 → 0.96.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.de.md +2 -2
- package/README.ja.md +2 -2
- package/README.ko.md +2 -2
- package/README.md +2 -2
- package/README.zh-CN.md +2 -2
- package/dashboard/dist/assets/{AchievementBadge-DKyElm0T.js → AchievementBadge-CgEitoX1.js} +1 -1
- package/dashboard/dist/assets/{AchievementsPage-BvCx3wND.js → AchievementsPage-dnnea0JH.js} +2 -2
- package/dashboard/dist/assets/{AchievementsSection-DN69LzXX.js → AchievementsSection-CJqG0UP7.js} +1 -1
- package/dashboard/dist/assets/{BadgeDetailModal-DGiKdZfz.js → BadgeDetailModal-BLV6SJoI.js} +1 -1
- package/dashboard/dist/assets/{BotAnimated-zN8rH7_K.js → BotAnimated-Cm78yEbz.js} +1 -1
- package/dashboard/dist/assets/{Card-COWo-ClV.js → Card-IPGSYT6O.js} +1 -1
- package/dashboard/dist/assets/{ClawdAnimated-BWsB7Eat.js → ClawdAnimated-04w1U1sm.js} +2 -2
- package/dashboard/dist/assets/{CommandPalette-BfvIwuoJ.js → CommandPalette-gSSa1V_s.js} +1 -1
- package/dashboard/dist/assets/{CommunityStatsModal-BQWg7R_y.js → CommunityStatsModal-CICwUz14.js} +1 -1
- package/dashboard/dist/assets/{ConfirmModal-C7ABSI-O.js → ConfirmModal-DaWC0cY7.js} +1 -1
- package/dashboard/dist/assets/{Controls-vMzEZzej.js → Controls-BDihA03F.js} +1 -1
- package/dashboard/dist/assets/{DashboardPage-QBhbCMZF.js → DashboardPage-hV7wncKF.js} +1 -1
- package/dashboard/dist/assets/{DevicePage-3ejUBLWM.js → DevicePage-BPpo_eiY.js} +1 -1
- package/dashboard/dist/assets/{DialogClose-D_dvtfGV.js → DialogClose-C_dF-r3s.js} +1 -1
- package/dashboard/dist/assets/DialogDescription-GClOSCaE.js +1 -0
- package/dashboard/dist/assets/{DialogTitle-_ahf0z8b.js → DialogTitle-Buh_5688.js} +1 -1
- package/dashboard/dist/assets/{FadeIn-D7Jcfz1N.js → FadeIn-DmI9PRLa.js} +1 -1
- package/dashboard/dist/assets/{HeaderGithubStar-D--Rx5BS.js → HeaderGithubStar-CBO4cY7i.js} +1 -1
- package/dashboard/dist/assets/{HoverTooltip-n1W0z3Wr.js → HoverTooltip-CPFGhi9K.js} +1 -1
- package/dashboard/dist/assets/{IpCheckPage-D202tl9B.js → IpCheckPage-Do7w_6z6.js} +1 -1
- package/dashboard/dist/assets/{LandingPage-D6yL2EZo.js → LandingPage-at_Ti1ZE.js} +2 -2
- package/dashboard/dist/assets/{LeaderboardAvatar-ChFg2mtA.js → LeaderboardAvatar-BH1cnKPp.js} +1 -1
- package/dashboard/dist/assets/{LeaderboardPage-BXHwGs8r.js → LeaderboardPage-Cd30aXwL.js} +2 -2
- package/dashboard/dist/assets/{LeaderboardProfileModal-B5LoOpCk.js → LeaderboardProfileModal-CVsti_HN.js} +3 -3
- package/dashboard/dist/assets/{LeaderboardProfilePage-jsukhRz8.js → LeaderboardProfilePage-BfSpDM9e.js} +1 -1
- package/dashboard/dist/assets/LimitsPage-_-BadDAj.js +8 -0
- package/dashboard/dist/assets/{LocalOnlyNotice-Du0lz657.js → LocalOnlyNotice-9-vRgsdn.js} +1 -1
- package/dashboard/dist/assets/{LoginCard-BFEX9x7-.js → LoginCard-DM_ZdFNl.js} +1 -1
- package/dashboard/dist/assets/{LoginModal-DqC7_d35.js → LoginModal-BaNMznwh.js} +1 -1
- package/dashboard/dist/assets/{LoginPage-Dzx8N7HE.js → LoginPage-BMMthUf4.js} +1 -1
- package/dashboard/dist/assets/{PetPage-CNlWHF4z.js → PetPage-Iq8Hswai.js} +1 -1
- package/dashboard/dist/assets/{PopoverPopup-D9jadD3j.js → PopoverPopup-DXr3JxVV.js} +1 -1
- package/dashboard/dist/assets/{ProviderIcon-Caz5PuAm.js → ProviderIcon-sb2keSY2.js} +1 -1
- package/dashboard/dist/assets/{ResetPasswordPage-x_GR79sR.js → ResetPasswordPage-Ca4SULSV.js} +1 -1
- package/dashboard/dist/assets/{SegmentedControl-BxDiDV4R.js → SegmentedControl-Bbsn-qvZ.js} +1 -1
- package/dashboard/dist/assets/{Select-B5o-1sEl.js → Select-vD-yj-qa.js} +1 -1
- package/dashboard/dist/assets/{SelectItemText-CiA6L7Wk.js → SelectItemText-CRtFEuvg.js} +1 -1
- package/dashboard/dist/assets/{ServiceStatusPage-BVQuVdjg.js → ServiceStatusPage-BPS8KJ3a.js} +1 -1
- package/dashboard/dist/assets/{SessionsPage-DE39wNIO.js → SessionsPage-C1yt3TMZ.js} +1 -1
- package/dashboard/dist/assets/SettingsPage-CWVHrMer.js +2 -0
- package/dashboard/dist/assets/{SkillsPage-COk-YQQ5.js → SkillsPage-DGWEH1xm.js} +1 -1
- package/dashboard/dist/assets/{TokenGalaxy-BPM779Wb.js → TokenGalaxy-DKvbJbnv.js} +1 -1
- package/dashboard/dist/assets/{ToolbarRootContext-CozJT6Vs.js → ToolbarRootContext-D8yov1dW.js} +1 -1
- package/dashboard/dist/assets/{TrendMonitor-BkNy-o1D.js → TrendMonitor-YF5C_-L1.js} +1 -1
- package/dashboard/dist/assets/{WidgetsPage-Bpg6H-ZB.js → WidgetsPage-BKV3DgXg.js} +1 -1
- package/dashboard/dist/assets/{WrappedPage-C6-NM-RO.js → WrappedPage-s4IRoLf7.js} +1 -1
- package/dashboard/dist/assets/__vite-browser-external-_LUatzwU.js +45 -0
- package/dashboard/dist/assets/{agent-logos-DpbkRqXT.js → agent-logos-Hbt-wyl2.js} +1 -1
- package/dashboard/dist/assets/{arrow-up-right-BjOtWUVs.js → arrow-up-right-KeIpKlw3.js} +1 -1
- package/dashboard/dist/assets/{check-BlxnX5jZ.js → check-_QKyY1v_.js} +1 -1
- package/dashboard/dist/assets/{composite-Dxmivlk4.js → composite-BidfcMeb.js} +1 -1
- package/dashboard/dist/assets/{copy-CIsWjLY5.js → copy-DpLM3QMD.js} +1 -1
- package/dashboard/dist/assets/{download-QDaQbQdd.js → download-C4NX-JnW.js} +1 -1
- package/dashboard/dist/assets/{external-link-DPV4VU3m.js → external-link-CG-7FcOF.js} +1 -1
- package/dashboard/dist/assets/{flame-B_X-7VNp.js → flame-CkWid7Ji.js} +1 -1
- package/dashboard/dist/assets/{format-tokens-DEx2TJj8.js → format-tokens-CbwWhioZ.js} +1 -1
- package/dashboard/dist/assets/{icons-983RyGSl.js → icons-BZq17rU3.js} +1 -1
- package/dashboard/dist/assets/{index-Cjs5stC0.js → index-CR9tDiiC.js} +1 -1
- package/dashboard/dist/assets/{index-BONYA8HZ.js → index-CSwEiUn4.js} +1 -1
- package/dashboard/dist/assets/{index-qtonw_x4.js → index-DDGLE0dz.js} +1 -1
- package/dashboard/dist/assets/{info-DpVOhXZI.js → info-mkeRjzqc.js} +1 -1
- package/dashboard/dist/assets/limits-providers-DRkcWQup.js +1 -0
- package/dashboard/dist/assets/{link-2-CBro-upz.js → link-2-BjMw8csC.js} +1 -1
- package/dashboard/dist/assets/{loader-circle-wYFdSyOd.js → loader-circle-cGWOJnWn.js} +1 -1
- package/dashboard/dist/assets/{maximize-2-DhTyQ4ly.js → maximize-2-Cg_S73tD.js} +1 -1
- package/dashboard/dist/assets/{modifiers.esm-CPljwVhN.js → modifiers.esm-DNxTWxId.js} +1 -1
- package/dashboard/dist/assets/{monitor-smartphone-D_wr-HOR.js → monitor-smartphone-BvE9Tt2U.js} +1 -1
- package/dashboard/dist/assets/{plus-BNjfkBEF.js → plus-BC2wdPRr.js} +1 -1
- package/dashboard/dist/assets/{provider-display-BOBtUyFi.js → provider-display-B7GggHQy.js} +1 -1
- package/dashboard/dist/assets/{react-yHv9MTUA.js → react-D0kcslTz.js} +1 -1
- package/dashboard/dist/assets/{search-Dfak92ZA.js → search-BuBNF3E3.js} +1 -1
- package/dashboard/dist/assets/{skills-api-By2PdNa1.js → skills-api-DxAN5pNx.js} +1 -1
- package/dashboard/dist/assets/{sortable.esm-B9xy66_v.js → sortable.esm-DoqMcEX-.js} +1 -1
- package/dashboard/dist/assets/{store-oQZR4d9M.js → store-Cg1HeUFM.js} +1 -1
- package/dashboard/dist/assets/{terminal-pbXWBmZM.js → terminal-COWFUJdU.js} +1 -1
- package/dashboard/dist/assets/{trash-2-CboDPwbW.js → trash-2-Cqjki3RI.js} +1 -1
- package/dashboard/dist/assets/{use-community-stats-D6HTdnHq.js → use-community-stats-DsrlOPDM.js} +1 -1
- package/dashboard/dist/assets/{use-latest-request-guard-hwSr9Cam.js → use-latest-request-guard-ryRFL2gx.js} +1 -1
- package/dashboard/dist/assets/{use-limits-display-prefs-B-pbwUS8.js → use-limits-display-prefs-DkSuu12m.js} +1 -1
- package/dashboard/dist/assets/{use-ordered-list-OtfOqrNb.js → use-ordered-list-D-Q86R1b.js} +1 -1
- package/dashboard/dist/assets/use-reduced-motion-D7NNqavo.js +1 -0
- package/dashboard/dist/assets/{use-session-efficiency-pref-BScvtS8F.js → use-session-efficiency-pref-CrNz45y7.js} +1 -1
- package/dashboard/dist/assets/{use-transform-Cy1ykjEs.js → use-transform-CoGM21px.js} +1 -1
- package/dashboard/dist/assets/{use-usage-limits-CSMb2zYW.js → use-usage-limits-C_6L1sO5.js} +1 -1
- package/dashboard/dist/assets/{useCurrency-VqF3cy1C.js → useCurrency-CgCfDktb.js} +1 -1
- package/dashboard/dist/assets/{useTokenFormat-Cgub4MXu.js → useTokenFormat-QKtzCKTL.js} +1 -1
- package/dashboard/dist/assets/{zap-DStzvQJI.js → zap-CTIobzgU.js} +1 -1
- package/dashboard/dist/brand-logos/commandcode.svg +1 -0
- package/dashboard/dist/index.html +4 -4
- 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/lib/codex-rollout-parser.js +2 -2
- package/src/lib/commandcode-limits.js +317 -0
- package/src/lib/pricing/curated-overrides.json +11 -0
- package/src/lib/pricing/index.js +6 -7
- package/src/lib/pricing/seed-snapshot.json +1 -1
- package/src/lib/rollout.js +166 -6
- package/src/lib/session-analytics.js +2 -2
- package/src/lib/usage-limits.js +42 -1
- package/dashboard/dist/assets/DialogDescription-ryGYdQjX.js +0 -1
- package/dashboard/dist/assets/LimitsPage-PvqkOOwp.js +0 -6
- package/dashboard/dist/assets/SettingsPage-DJrb_fsK.js +0 -2
- package/dashboard/dist/assets/__vite-browser-external-BGnq8Ebm.js +0 -45
- package/dashboard/dist/assets/limits-providers-BUoquSA-.js +0 -1
- package/dashboard/dist/assets/use-reduced-motion-DGXcZBX3.js +0 -1
package/src/lib/rollout.js
CHANGED
|
@@ -4458,6 +4458,9 @@ function claudeMessageDedupKey(obj) {
|
|
|
4458
4458
|
function normalizeClaudeUsage(u) {
|
|
4459
4459
|
const inputTokens = toNonNegativeInt(u?.input_tokens);
|
|
4460
4460
|
const outputTokens = toNonNegativeInt(u?.output_tokens);
|
|
4461
|
+
const reasoningTokens = Math.min(outputTokens, toNonNegativeInt(
|
|
4462
|
+
u?.output_tokens_details?.thinking_tokens ?? u?.output_tokens_details?.reasoning_tokens,
|
|
4463
|
+
));
|
|
4461
4464
|
const cacheCreation = toNonNegativeInt(u?.cache_creation_input_tokens);
|
|
4462
4465
|
const cacheRead = toNonNegativeInt(u?.cache_read_input_tokens);
|
|
4463
4466
|
const totalTokens = inputTokens + outputTokens + cacheCreation + cacheRead;
|
|
@@ -4465,8 +4468,9 @@ function normalizeClaudeUsage(u) {
|
|
|
4465
4468
|
input_tokens: inputTokens,
|
|
4466
4469
|
cached_input_tokens: cacheRead,
|
|
4467
4470
|
cache_creation_input_tokens: cacheCreation,
|
|
4468
|
-
output_tokens
|
|
4469
|
-
|
|
4471
|
+
// Claude rows price reasoning separately; it is already included in usage.output_tokens.
|
|
4472
|
+
output_tokens: outputTokens - reasoningTokens,
|
|
4473
|
+
reasoning_output_tokens: reasoningTokens,
|
|
4470
4474
|
total_tokens: totalTokens,
|
|
4471
4475
|
};
|
|
4472
4476
|
}
|
|
@@ -18666,6 +18670,9 @@ async function parseAntigravityIncremental({
|
|
|
18666
18670
|
const initialContextTokens = sameFile ? Number(prev.contextTokens || 0) : 0;
|
|
18667
18671
|
const initialPrevContext = sameFile ? Number(prev.previousContextTokens || 0) : 0;
|
|
18668
18672
|
const initialModel = sameFile && typeof prev.currentModel === "string" ? prev.currentModel : null;
|
|
18673
|
+
const initialLastPlannerModel =
|
|
18674
|
+
sameFile && typeof prev.lastPlannerModel === "string" ? prev.lastPlannerModel : null;
|
|
18675
|
+
const initialUsageSource = sameFile && typeof prev.usageSource === "string" ? prev.usageSource : null;
|
|
18669
18676
|
|
|
18670
18677
|
const projectContext = projectEnabled
|
|
18671
18678
|
? await resolveProjectContextForFile({
|
|
@@ -18685,6 +18692,8 @@ async function parseAntigravityIncremental({
|
|
|
18685
18692
|
initialContextTokens,
|
|
18686
18693
|
initialPrevContext,
|
|
18687
18694
|
initialModel,
|
|
18695
|
+
initialLastPlannerModel,
|
|
18696
|
+
initialUsageSource,
|
|
18688
18697
|
hourlyState,
|
|
18689
18698
|
touchedBuckets,
|
|
18690
18699
|
source: fileSource,
|
|
@@ -18702,6 +18711,8 @@ async function parseAntigravityIncremental({
|
|
|
18702
18711
|
contextTokens: result.contextTokens,
|
|
18703
18712
|
previousContextTokens: result.previousContextTokens,
|
|
18704
18713
|
currentModel: result.currentModel,
|
|
18714
|
+
lastPlannerModel: result.lastPlannerModel,
|
|
18715
|
+
usageSource: result.usageSource,
|
|
18705
18716
|
updatedAt: new Date().toISOString(),
|
|
18706
18717
|
};
|
|
18707
18718
|
|
|
@@ -18734,12 +18745,121 @@ async function parseAntigravityIncremental({
|
|
|
18734
18745
|
return { filesProcessed, eventsAggregated, bucketsQueued, projectBucketsQueued };
|
|
18735
18746
|
}
|
|
18736
18747
|
|
|
18748
|
+
function decodeAntigravityVarint(buf, offset) {
|
|
18749
|
+
let res = 0;
|
|
18750
|
+
let shift = 0;
|
|
18751
|
+
while (offset < buf.length) {
|
|
18752
|
+
const b = buf[offset++];
|
|
18753
|
+
res += (b & 0x7f) * 2 ** shift;
|
|
18754
|
+
if (!(b & 0x80)) break;
|
|
18755
|
+
shift += 7;
|
|
18756
|
+
}
|
|
18757
|
+
return [res, offset];
|
|
18758
|
+
}
|
|
18759
|
+
|
|
18760
|
+
function findAntigravityProtoFields(buf) {
|
|
18761
|
+
const fields = [];
|
|
18762
|
+
let offset = 0;
|
|
18763
|
+
while (offset < buf.length) {
|
|
18764
|
+
const [tag, next] = decodeAntigravityVarint(buf, offset);
|
|
18765
|
+
offset = next;
|
|
18766
|
+
const fieldNum = tag >> 3;
|
|
18767
|
+
const wireType = tag & 7;
|
|
18768
|
+
if (wireType === 0) {
|
|
18769
|
+
const [val, vNext] = decodeAntigravityVarint(buf, offset);
|
|
18770
|
+
offset = vNext;
|
|
18771
|
+
fields.push({ num: fieldNum, val });
|
|
18772
|
+
} else if (wireType === 2) {
|
|
18773
|
+
const [len, lNext] = decodeAntigravityVarint(buf, offset);
|
|
18774
|
+
offset = lNext;
|
|
18775
|
+
fields.push({ num: fieldNum, val: buf.subarray(offset, offset + len) });
|
|
18776
|
+
offset += len;
|
|
18777
|
+
} else if (wireType === 1) {
|
|
18778
|
+
offset += 8;
|
|
18779
|
+
} else if (wireType === 5) {
|
|
18780
|
+
offset += 4;
|
|
18781
|
+
} else {
|
|
18782
|
+
break;
|
|
18783
|
+
}
|
|
18784
|
+
}
|
|
18785
|
+
return fields;
|
|
18786
|
+
}
|
|
18787
|
+
|
|
18788
|
+
function extractAntigravityGenInfo(buf) {
|
|
18789
|
+
const root = findAntigravityProtoFields(buf);
|
|
18790
|
+
const f1 = root.find((f) => f.num === 1)?.val;
|
|
18791
|
+
if (!f1) return null;
|
|
18792
|
+
|
|
18793
|
+
const inner = findAntigravityProtoFields(f1);
|
|
18794
|
+
let model = null;
|
|
18795
|
+
const f19 = inner.find((f) => f.num === 19)?.val;
|
|
18796
|
+
if (f19) model = Buffer.from(f19).toString("utf8").trim();
|
|
18797
|
+
|
|
18798
|
+
let contextTokens = 0;
|
|
18799
|
+
const f9 = inner.find((f) => f.num === 9)?.val;
|
|
18800
|
+
if (f9) {
|
|
18801
|
+
const f10 = findAntigravityProtoFields(f9).find((f) => f.num === 10)?.val;
|
|
18802
|
+
if (f10) {
|
|
18803
|
+
const tok = findAntigravityProtoFields(f10).find((f) => f.num === 1)?.val;
|
|
18804
|
+
if (Number.isFinite(tok)) contextTokens = tok;
|
|
18805
|
+
}
|
|
18806
|
+
}
|
|
18807
|
+
|
|
18808
|
+
let lastStepIndex = null;
|
|
18809
|
+
for (const f of inner) {
|
|
18810
|
+
if (f.num !== 20 || !f.val) continue;
|
|
18811
|
+
const kv = findAntigravityProtoFields(f.val);
|
|
18812
|
+
const k = kv.find((x) => x.num === 1)?.val;
|
|
18813
|
+
const v = kv.find((x) => x.num === 2)?.val;
|
|
18814
|
+
if (k && Buffer.from(k).toString("utf8") === "last_step_index" && v) {
|
|
18815
|
+
const parsed = parseInt(Buffer.from(v).toString("utf8"), 10);
|
|
18816
|
+
if (Number.isFinite(parsed)) lastStepIndex = parsed;
|
|
18817
|
+
}
|
|
18818
|
+
}
|
|
18819
|
+
|
|
18820
|
+
return { model, contextTokens, lastStepIndex };
|
|
18821
|
+
}
|
|
18822
|
+
|
|
18823
|
+
function resolveAntigravityDbPath(transcriptPath) {
|
|
18824
|
+
if (!transcriptPath || typeof transcriptPath !== "string") return null;
|
|
18825
|
+
const m = transcriptPath.match(/^(.*)[/\\]brain[/\\]([^/\\]+)[/\\]\.system_generated[/\\]logs[/\\]transcript.*\.jsonl$/);
|
|
18826
|
+
if (!m) return null;
|
|
18827
|
+
return path.join(m[1], "conversations", `${m[2]}.db`);
|
|
18828
|
+
}
|
|
18829
|
+
|
|
18830
|
+
function readAntigravityConversationDb(dbPath) {
|
|
18831
|
+
if (!dbPath) return null;
|
|
18832
|
+
try {
|
|
18833
|
+
const rows = readSqliteJsonRows(
|
|
18834
|
+
dbPath,
|
|
18835
|
+
"SELECT idx, quote(data) as hex FROM gen_metadata ORDER BY idx",
|
|
18836
|
+
{ readOnly: true },
|
|
18837
|
+
);
|
|
18838
|
+
if (!Array.isArray(rows) || rows.length === 0) return null;
|
|
18839
|
+
|
|
18840
|
+
const stepMap = new Map();
|
|
18841
|
+
for (const r of rows) {
|
|
18842
|
+
if (!r || typeof r.hex !== "string" || !r.hex.startsWith("X'")) continue;
|
|
18843
|
+
const buf = Buffer.from(r.hex.slice(2, -1), "hex");
|
|
18844
|
+
const info = extractAntigravityGenInfo(buf);
|
|
18845
|
+
if (info && info.lastStepIndex != null && info.contextTokens > 0) {
|
|
18846
|
+
stepMap.set(info.lastStepIndex + 1, info);
|
|
18847
|
+
}
|
|
18848
|
+
}
|
|
18849
|
+
return stepMap.size > 0 ? stepMap : null;
|
|
18850
|
+
} catch (_) {
|
|
18851
|
+
return null;
|
|
18852
|
+
}
|
|
18853
|
+
}
|
|
18854
|
+
|
|
18737
18855
|
async function parseAntigravityFile({
|
|
18738
18856
|
filePath,
|
|
18739
18857
|
lastLine,
|
|
18740
18858
|
initialContextTokens,
|
|
18741
18859
|
initialPrevContext,
|
|
18742
18860
|
initialModel,
|
|
18861
|
+
initialLastPlannerModel,
|
|
18862
|
+
initialUsageSource,
|
|
18743
18863
|
hourlyState,
|
|
18744
18864
|
touchedBuckets,
|
|
18745
18865
|
source,
|
|
@@ -18756,6 +18876,8 @@ async function parseAntigravityFile({
|
|
|
18756
18876
|
contextTokens: 0,
|
|
18757
18877
|
previousContextTokens: 0,
|
|
18758
18878
|
currentModel: null,
|
|
18879
|
+
lastPlannerModel: null,
|
|
18880
|
+
usageSource: "estimated",
|
|
18759
18881
|
};
|
|
18760
18882
|
}
|
|
18761
18883
|
|
|
@@ -18764,6 +18886,8 @@ async function parseAntigravityFile({
|
|
|
18764
18886
|
.map((line) => line.trim())
|
|
18765
18887
|
.filter(Boolean);
|
|
18766
18888
|
let eventsAggregated = 0;
|
|
18889
|
+
const dbPath = resolveAntigravityDbPath(filePath);
|
|
18890
|
+
const stepMap = dbPath ? readAntigravityConversationDb(dbPath) : null;
|
|
18767
18891
|
// Resume cached context-token total + model so historical lines (i < lastLine)
|
|
18768
18892
|
// don't need to be re-tokenized on every sync. Falls back to a full re-walk
|
|
18769
18893
|
// when the cached state is missing (legacy cursor) or the file rotated.
|
|
@@ -18772,7 +18896,9 @@ async function parseAntigravityFile({
|
|
|
18772
18896
|
const cachedTokens = Number.isFinite(initialContextTokens) ? initialContextTokens : 0;
|
|
18773
18897
|
const cachedPrev = Number.isFinite(initialPrevContext) ? initialPrevContext : 0;
|
|
18774
18898
|
const cachedModel = typeof initialModel === "string" ? initialModel : null;
|
|
18775
|
-
const
|
|
18899
|
+
const sqliteCursor = initialUsageSource === "sqlite";
|
|
18900
|
+
const resumed =
|
|
18901
|
+
canResume && (cachedTokens > 0 || cachedModel !== null) && (!stepMap || sqliteCursor);
|
|
18776
18902
|
const scanStart = resumed ? lastLine : 0;
|
|
18777
18903
|
let currentModel = resumed ? cachedModel : null;
|
|
18778
18904
|
if (!currentModel) {
|
|
@@ -18783,6 +18909,11 @@ async function parseAntigravityFile({
|
|
|
18783
18909
|
// tokens accumulated AFTER that point count as new input on the next planner
|
|
18784
18910
|
// call — prevents O(N²) double-counting of the full history every turn.
|
|
18785
18911
|
let previousContextTokens = resumed ? cachedPrev : 0;
|
|
18912
|
+
let lastPlannerModel = null;
|
|
18913
|
+
if (resumed) {
|
|
18914
|
+
lastPlannerModel =
|
|
18915
|
+
typeof initialLastPlannerModel === "string" ? initialLastPlannerModel : cachedModel;
|
|
18916
|
+
}
|
|
18786
18917
|
let lastCompletedLine = Math.min(Number.isFinite(lastLine) ? lastLine : 0, lines.length);
|
|
18787
18918
|
|
|
18788
18919
|
for (let i = scanStart; i < lines.length; i++) {
|
|
@@ -18805,9 +18936,27 @@ async function parseAntigravityFile({
|
|
|
18805
18936
|
}
|
|
18806
18937
|
|
|
18807
18938
|
const eventContextTokens = antigravityContextTokens(parsed);
|
|
18939
|
+
const dbTurn =
|
|
18940
|
+
parsed.type === "PLANNER_RESPONSE" && stepMap && Number.isFinite(parsed.step_index)
|
|
18941
|
+
? stepMap.get(parsed.step_index)
|
|
18942
|
+
: null;
|
|
18943
|
+
const dbContextTokens = dbTurn && dbTurn.contextTokens > 0 ? dbTurn.contextTokens : 0;
|
|
18944
|
+
if (dbTurn && dbTurn.model) {
|
|
18945
|
+
const norm = normalizeAntigravityTranscriptModel(dbTurn.model);
|
|
18946
|
+
if (norm) currentModel = norm;
|
|
18947
|
+
}
|
|
18808
18948
|
|
|
18809
18949
|
if (!isNewEvent) {
|
|
18810
|
-
|
|
18950
|
+
if (parsed.type === "PLANNER_RESPONSE") {
|
|
18951
|
+
if (dbContextTokens > 0) {
|
|
18952
|
+
contextTokens = dbContextTokens;
|
|
18953
|
+
}
|
|
18954
|
+
previousContextTokens = contextTokens;
|
|
18955
|
+
lastPlannerModel = currentModel;
|
|
18956
|
+
contextTokens += eventContextTokens;
|
|
18957
|
+
} else {
|
|
18958
|
+
contextTokens += eventContextTokens;
|
|
18959
|
+
}
|
|
18811
18960
|
lastCompletedLine = i + 1;
|
|
18812
18961
|
continue;
|
|
18813
18962
|
}
|
|
@@ -18834,7 +18983,14 @@ async function parseAntigravityFile({
|
|
|
18834
18983
|
const content = typeof parsed.content === "string" ? parsed.content : "";
|
|
18835
18984
|
const thinking = typeof parsed.thinking === "string" ? parsed.thinking : "";
|
|
18836
18985
|
|
|
18986
|
+
if (dbContextTokens > 0) {
|
|
18987
|
+
contextTokens = dbContextTokens;
|
|
18988
|
+
}
|
|
18989
|
+
if (lastPlannerModel && model !== lastPlannerModel) {
|
|
18990
|
+
previousContextTokens = 0;
|
|
18991
|
+
}
|
|
18837
18992
|
const inputDelta = Math.max(0, contextTokens - previousContextTokens);
|
|
18993
|
+
|
|
18838
18994
|
const outputTokens =
|
|
18839
18995
|
antigravityValueTokens(content) + antigravityValueTokens(parsed.tool_calls);
|
|
18840
18996
|
const reasoningTokens = antigravityValueTokens(thinking);
|
|
@@ -18842,8 +18998,6 @@ async function parseAntigravityFile({
|
|
|
18842
18998
|
delta.input_tokens = inputDelta;
|
|
18843
18999
|
delta.output_tokens = outputTokens;
|
|
18844
19000
|
delta.reasoning_output_tokens = reasoningTokens;
|
|
18845
|
-
// Match the mainstream convention (Codebuddy / Kilocode / OMP / Hermes):
|
|
18846
|
-
// total_tokens = sum of every token column. No cache columns here.
|
|
18847
19001
|
delta.total_tokens = inputDelta + outputTokens + reasoningTokens;
|
|
18848
19002
|
delta.billable_total_tokens = delta.total_tokens;
|
|
18849
19003
|
delta.conversation_count = 1;
|
|
@@ -18877,6 +19031,7 @@ async function parseAntigravityFile({
|
|
|
18877
19031
|
// so they MUST be billed as input on the next planner — don't fold them into
|
|
18878
19032
|
// previousContextTokens or that history vanishes from the totals.
|
|
18879
19033
|
previousContextTokens = contextTokens;
|
|
19034
|
+
lastPlannerModel = model;
|
|
18880
19035
|
contextTokens += eventContextTokens;
|
|
18881
19036
|
lastCompletedLine = i + 1;
|
|
18882
19037
|
}
|
|
@@ -18887,6 +19042,8 @@ async function parseAntigravityFile({
|
|
|
18887
19042
|
contextTokens,
|
|
18888
19043
|
previousContextTokens,
|
|
18889
19044
|
currentModel,
|
|
19045
|
+
lastPlannerModel,
|
|
19046
|
+
usageSource: stepMap ? "sqlite" : "estimated",
|
|
18890
19047
|
};
|
|
18891
19048
|
}
|
|
18892
19049
|
|
|
@@ -20469,6 +20626,9 @@ module.exports = {
|
|
|
20469
20626
|
parseAntigravityIncremental,
|
|
20470
20627
|
estimateAntigravityTokens,
|
|
20471
20628
|
isCjkCodePoint,
|
|
20629
|
+
resolveAntigravityDbPath,
|
|
20630
|
+
extractAntigravityGenInfo,
|
|
20631
|
+
readAntigravityConversationDb,
|
|
20472
20632
|
|
|
20473
20633
|
// Trae SOLO (ByteDance AI IDE)
|
|
20474
20634
|
resolveTraePath,
|
|
@@ -190,8 +190,8 @@ function normalizeModelUsageRows(rows) {
|
|
|
190
190
|
// selected_models re-seeds from `model`, model_attribution is derived from
|
|
191
191
|
// rerouted_usage_events, and cost_usd is always recomputed by
|
|
192
192
|
// repriceSessionRecord(). Worth ~19% of the file on a 6.8k-session history,
|
|
193
|
-
// most of it the long_context_* counters
|
|
194
|
-
// OPENAI_LONG_CONTEXT_INPUT_THRESHOLD in src/lib/pricing/index.js
|
|
193
|
+
// most of it the long_context_* counters for sessions with no requests over
|
|
194
|
+
// OPENAI_LONG_CONTEXT_INPUT_THRESHOLD in src/lib/pricing/index.js.
|
|
195
195
|
function serializeModelUsageRow(row) {
|
|
196
196
|
const out = { model: row.model };
|
|
197
197
|
for (const field of MODEL_USAGE_SUM_FIELDS) {
|
package/src/lib/usage-limits.js
CHANGED
|
@@ -30,6 +30,7 @@ const {
|
|
|
30
30
|
const { fetchGrokLimits } = require("./grok-limits");
|
|
31
31
|
const { fetchZcodeLimits } = require("./zcode-limits");
|
|
32
32
|
const { fetchOpencodeGoLimits } = require("./opencode-go-limits");
|
|
33
|
+
const { fetchCommandcodeLimits } = require("./commandcode-limits");
|
|
33
34
|
const { fetchQoderLimits, fetchQoderCnLimits } = require("./qoder-limits");
|
|
34
35
|
const { fetchArkCodingPlanLimits } = require("./ark-coding-plan-limits");
|
|
35
36
|
const { fetchArkAgentPlanLimits } = require("./ark-agent-plan-limits");
|
|
@@ -3716,7 +3717,7 @@ async function fetchUsageLimitsUncached({
|
|
|
3716
3717
|
: null;
|
|
3717
3718
|
|
|
3718
3719
|
const providerFetch = withFetchTimeout(fetchImpl, providerTimeoutMs);
|
|
3719
|
-
const [claudeResult, codexResult, cursor, kimi, gemini, kiro, antigravity, copilot, grok, zcode, opencodeGoRaw, qoder, qoderCn, codingPlan, agentPlan, claudeServiceStatus] = await Promise.all([
|
|
3720
|
+
const [claudeResult, codexResult, cursor, kimi, gemini, kiro, antigravity, copilot, grok, zcode, opencodeGoRaw, qoder, qoderCn, codingPlan, agentPlan, commandCodeRaw, claudeServiceStatus] = await Promise.all([
|
|
3720
3721
|
claudeToken && !freshClaudeCache && !claudeRetryAtMs
|
|
3721
3722
|
? withProviderTimeout(fetchClaudeUsageLimits(claudeToken, { fetchImpl: providerFetch, maxAttempts: 1 }), "Claude", providerTimeoutMs).then(
|
|
3722
3723
|
(value) => ({ status: "fulfilled", value }),
|
|
@@ -3817,6 +3818,19 @@ async function fetchUsageLimitsUncached({
|
|
|
3817
3818
|
"Ark Agent Plan",
|
|
3818
3819
|
providerTimeoutMs,
|
|
3819
3820
|
).catch((reason) => ({ configured: true, error: reason?.message || "Unknown error" })),
|
|
3821
|
+
// CommandCode (commandcode.ai): official subscription windows (5h + weekly)
|
|
3822
|
+
// from the CLI's own alpha endpoints, keyed by the apiKey the CLI stores in
|
|
3823
|
+
// ~/.commandcode/auth.json (or COMMAND_CODE_API_KEY). No local fallback —
|
|
3824
|
+
// window state lives server-side. fetchCommandcodeLimits throws on auth
|
|
3825
|
+
// expiry so the assemble step below can flag auth_action_required. The
|
|
3826
|
+
// outer race bounds the whole slot: without it three sequential per-request
|
|
3827
|
+
// timeouts (whoami, then credits+subscriptions) could hold the aggregate
|
|
3828
|
+
// ~2x longer than any sibling provider.
|
|
3829
|
+
withProviderTimeout(fetchCommandcodeLimits({ home, env, fetchImpl: providerFetch }), "CommandCode", providerTimeoutMs)
|
|
3830
|
+
.then(
|
|
3831
|
+
(value) => ({ status: "fulfilled", value }),
|
|
3832
|
+
(reason) => ({ status: "rejected", reason }),
|
|
3833
|
+
),
|
|
3820
3834
|
// Public status-page probe (fail-soft, own 5-min cache in provider-status.js).
|
|
3821
3835
|
// Only probed for configured accounts — without a token the Claude section
|
|
3822
3836
|
// never renders, so the reading would have nowhere to go.
|
|
@@ -3993,6 +4007,28 @@ async function fetchUsageLimitsUncached({
|
|
|
3993
4007
|
}
|
|
3994
4008
|
}
|
|
3995
4009
|
|
|
4010
|
+
// CommandCode: official windows straight from the API — nothing to cache on
|
|
4011
|
+
// disk beyond the shared 2-minute in-memory cache, so keep the assembly
|
|
4012
|
+
// simple. A fulfilled `configured: false` means no apiKey found; a rejected
|
|
4013
|
+
// fetch surfaced an auth-expired error the panel should act on.
|
|
4014
|
+
let commandCodeObj;
|
|
4015
|
+
if (commandCodeRaw?.status === "fulfilled") {
|
|
4016
|
+
const value = commandCodeRaw.value;
|
|
4017
|
+
commandCodeObj = value && value.configured === false
|
|
4018
|
+
? value
|
|
4019
|
+
: { ...value, stale: false, cached_at: new Date(nowMs).toISOString() };
|
|
4020
|
+
} else {
|
|
4021
|
+
const reason = commandCodeRaw?.reason || null;
|
|
4022
|
+
const authExpired = Boolean(
|
|
4023
|
+
reason &&
|
|
4024
|
+
(reason?.code === "AUTH_EXPIRED" ||
|
|
4025
|
+
/token expired|run `cmd login`|Not authenticated/i.test(reason?.message || "")),
|
|
4026
|
+
);
|
|
4027
|
+
commandCodeObj = authExpired
|
|
4028
|
+
? { configured: true, error: reason?.message || "Unknown error", auth_action_required: "reauth" }
|
|
4029
|
+
: { configured: true, error: reason?.message || "Unknown error" };
|
|
4030
|
+
}
|
|
4031
|
+
|
|
3996
4032
|
const data = {
|
|
3997
4033
|
fetched_at: new Date(nowMs).toISOString(),
|
|
3998
4034
|
claude: withPlanLabel(claude, claudePlanType, "Claude"),
|
|
@@ -4010,6 +4046,10 @@ async function fetchUsageLimitsUncached({
|
|
|
4010
4046
|
grok: withPlanLabel(grok, null, "Grok"),
|
|
4011
4047
|
zcode: withPlanLabel(zcode, zcode.plan_label, "ZCode"),
|
|
4012
4048
|
opencodeGo: withPlanLabel(opencodeGo, opencodeGo?.plan_label, "OpenCode Go"),
|
|
4049
|
+
// CommandCode tiers are acronym brands (GOAT/Pro/Max) — the fetcher already
|
|
4050
|
+
// maps plan ids to the CLI's exact display strings, so skip the shared
|
|
4051
|
+
// Title-Case normalization ("Goat") and surface them as-is.
|
|
4052
|
+
commandCode: commandCodeObj,
|
|
4013
4053
|
qoder: withPlanLabel(qoder, qoder?.plan_label, "Qoder"),
|
|
4014
4054
|
qoderCn: withPlanLabel(qoderCn, qoderCn?.plan_label, "Qoder CN"),
|
|
4015
4055
|
codingPlan: withPlanLabel(codingPlan, codingPlan?.plan_label, "Ark Coding Plan"),
|
|
@@ -4080,6 +4120,7 @@ module.exports = {
|
|
|
4080
4120
|
fetchGrokLimits,
|
|
4081
4121
|
fetchZcodeLimits,
|
|
4082
4122
|
fetchOpencodeGoLimits,
|
|
4123
|
+
fetchCommandcodeLimits,
|
|
4083
4124
|
fetchQoderLimits,
|
|
4084
4125
|
fetchQoderCnLimits,
|
|
4085
4126
|
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as n,z as a}from"./__vite-browser-external-BGnq8Ebm.js";import{u as p}from"./DialogTitle-_ahf0z8b.js";import{u as c}from"./composite-Dxmivlk4.js";const x=n.forwardRef(function(e,r){const{render:l,className:u,style:m,id:s,...t}=e,i=p(),o=c(s);return i.useSyncedValueWithCleanup("descriptionElementId",o),a("p",e,{ref:r,props:[{id:o},t]})});export{x as D};
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import{m as V,j as e,e as Ce,c as r,k as re,r as x,Q as Je,B as W,aw as Qe,d as C,h as Ze,J as ke,L as et,ax as tt,q as at,ac as rt}from"./__vite-browser-external-BGnq8Ebm.js";import{m as ve}from"./react-yHv9MTUA.js";import{P as xe,c as it,r as ie,a as nt,u as st,b as ot,s as lt}from"./use-usage-limits-CSMb2zYW.js";import{L as j,u as ct}from"./use-limits-display-prefs-B-pbwUS8.js";import{C as Te}from"./Card-COWo-ClV.js";import{F as dt}from"./FadeIn-D7Jcfz1N.js";import{L as De,l as ee,a as Ee}from"./limits-providers-BUoquSA-.js";import{P as Ie}from"./ProviderIcon-Caz5PuAm.js";import{H as ut}from"./HoverTooltip-n1W0z3Wr.js";import{C as mt}from"./ConfirmModal-C7ABSI-O.js";import{I as je,L as xt}from"./LocalOnlyNotice-Du0lz657.js";import{S as ce}from"./Select-B5o-1sEl.js";import{P as pt}from"./plus-BNjfkBEF.js";import{P as gt,a as ht,b as ft,c as bt,d as yt}from"./PopoverPopup-D9jadD3j.js";import{u as kt}from"./use-reduced-motion-DGXcZBX3.js";import"./use-latest-request-guard-hwSr9Cam.js";import"./DialogTitle-_ahf0z8b.js";import"./composite-Dxmivlk4.js";import"./store-oQZR4d9M.js";import"./DialogDescription-ryGYdQjX.js";import"./arrow-up-right-BjOtWUVs.js";import"./download-QDaQbQdd.js";import"./ToolbarRootContext-CozJT6Vs.js";import"./check-BlxnX5jZ.js";import"./SelectItemText-CiA6L7Wk.js";const vt=[["path",{d:"M10.268 21a2 2 0 0 0 3.464 0",key:"vwvbt9"}],["path",{d:"M17 17H4a1 1 0 0 1-.74-1.673C4.59 13.956 6 12.499 6 8a6 6 0 0 1 .258-1.742",key:"178tsu"}],["path",{d:"m2 2 20 20",key:"1ooewy"}],["path",{d:"M8.668 3.01A6 6 0 0 1 18 8c0 2.687.77 4.653 1.707 6.05",key:"1hqiys"}]],jt=V("bell-off",vt);const wt=[["path",{d:"M10.268 21a2 2 0 0 0 3.464 0",key:"vwvbt9"}],["path",{d:"M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326",key:"11g9vi"}]],Nt=V("bell",wt);const _t=[["path",{d:"M16 14v2.2l1.6 1",key:"fo4ql5"}],["path",{d:"M16 2v3",key:"otl347"}],["path",{d:"M21 7.338V5a2 2 0 00-2-2H5a2 2 0 00-2 2v14a2 2 0 002 2h2.338",key:"7hb8p4"}],["path",{d:"M3 9h5.859",key:"numkqi"}],["path",{d:"M8 2v3",key:"1ioesn"}],["circle",{cx:"16",cy:"16",r:"6",key:"qoo3c4"}]],Re=V("calendar-clock",_t);const Mt=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 6v6l4 2",key:"mmk7yg"}]],Ae=V("clock",Mt);const Pt=[["path",{d:"M6 16c5 0 7-8 12-8a4 4 0 0 1 0 8c-5 0-7-8-12-8a4 4 0 1 0 0 8",key:"18ogeb"}]],Oe=V("infinity",Pt),St=[3,2,3,3,2,2,3];function R({className:t}){return e.jsx("div",{className:Ce("rounded bg-oai-gray-200/70 dark:bg-oai-gray-800/70 animate-pulse",t)})}function Ct(){return e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(R,{className:"h-3 w-12 shrink-0"}),e.jsx(R,{className:"flex-1 h-1.5 rounded-full min-w-0"}),e.jsx(R,{className:"h-3 w-[30px] shrink-0"}),e.jsx(R,{className:"h-3 w-6 shrink-0"})]})}function Tt({bars:t,index:a}){const i=a%3===0?"w-24":a%3===1?"w-20":"w-[4.5rem]";return e.jsxs("div",{className:"flex flex-col gap-1.5",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx(R,{className:"h-[14px] w-[14px] rounded shrink-0"}),e.jsx(R,{className:Ce("h-4",i)})]}),Array.from({length:t},(s,n)=>e.jsx(Ct,{},n))]})}function Dt(){return e.jsx(Te,{children:e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsx(R,{className:"h-3.5 w-28"}),St.map((t,a)=>e.jsx(Tt,{bars:t,index:a},a))]})})}const pe=100;function we(t){const a=Date.parse(t);return Number.isFinite(a)?a:null}function Et(t){return Math.max(0,Math.min(pe,Math.round(t)))}function It(t){return new Intl.DateTimeFormat(re(),{month:"numeric",day:"numeric",hour:"2-digit",minute:"2-digit",hour12:!1}).format(new Date(t))}function Rt(t,a,i){if(t==null||t>=a)return pe;const s=a-t,n=a-i;return Et(n/s*pe)}function At(t){const a=t.available_count;return a===null?null:Number.isInteger(a)&&a>=0?a:void 0}function Ot(t,{now:a}={}){if(!t||typeof t!="object")return null;const i=At(t);if(i===void 0)return null;const s=Array.isArray(t.credits)?t.credits:[],n=a instanceof Date?a.getTime():Number(a??Date.now()),o=[];for(const l of s){const c=we(l?.expires_at);if(c==null)continue;const d=o.length+1;o.push({key:`reset-${d}`,label:r("limits.codex_reset_bank.row_label",{index:d}),expiresAt:It(c),expiresMs:c,percent:Rt(we(l?.granted_at),c,n)})}return i===0?null:o.length>0?{kind:"rows",availableCount:i??o.length,rows:o}:i>0?{kind:"count_only",availableCount:i,rows:[]}:null}const z=864e5;function A(t,a){const i=new Date(t),s=i.getUTCDate(),n=new Date(Date.UTC(i.getUTCFullYear(),i.getUTCMonth()+a,1,i.getUTCHours(),i.getUTCMinutes())),o=new Date(Date.UTC(n.getUTCFullYear(),n.getUTCMonth()+1,0)).getUTCDate();return n.setUTCDate(Math.min(s,o)),n.getTime()}function Fe(t,a){if(a==="weekly")return t-7*z;if(a==="yearly")return A(t,-12);const i=new Date(t),s=new Date(Date.UTC(i.getUTCFullYear(),i.getUTCMonth(),0)).getUTCDate(),n=new Date(Date.UTC(i.getUTCFullYear(),i.getUTCMonth()-1,1,i.getUTCHours(),i.getUTCMinutes()));return n.setUTCDate(Math.min(i.getUTCDate(),s)),n.getTime()}function Le(t,a){return a==="weekly"?t+7*z:a==="yearly"?A(t,12):A(t,1)}function Ft(t){if(t.startedAt!=null){const a=new Date(t.startedAt).getTime();if(Number.isFinite(a))return a}return Fe(new Date(t.nextBillingAt).getTime(),t.cycle)}function Lt(t,a,i){if(t.startedAt!=null){const s=new Date(t.startedAt).getTime();if(Number.isFinite(s))return s}return Fe(i,a)}function Ht(t,a,i){if(a==="weekly"){const c=7*z,d=i<=t?0:Math.floor((i-t)/c);return{startMs:t+d*c,endMs:t+(d+1)*c}}const s=a==="yearly"?12:1,n=s*30.436875*z;let o=i<=t?0:Math.floor((i-t)/n);for(;o>0&&A(t,o*s)>i;)o-=1;let l=0;for(;A(t,(o+1)*s)<=i&&l<12e3;)o+=1,l+=1;return{startMs:A(t,o*s),endMs:A(t,(o+1)*s)}}function te(t,a){const i=new Date(t.nextBillingAt).getTime();if(!Number.isFinite(i))return null;const s=["weekly","monthly","yearly"].includes(t.cycle)?t.cycle:"monthly",n=Lt(t,s,i);if(!Number.isFinite(n))return null;let o,l,c=!1;t.autoRenew?{startMs:o,endMs:l}=Ht(n,s,a):t.startedAt!=null?(o=n,l=Le(n,s),c=l<=a):(o=n,l=i,c=l<=a);const d=Math.max(1,l-o),m=c?1:Math.max(0,Math.min(1,(a-o)/d));return{endMs:l,startMs:o,progress:m,cycleDays:Math.max(1,Math.round(d/z)),expired:c}}function He(t,a){const i=t-a;if(i<=0)return r("subscriptions.expired");const s=Math.ceil(i/6e4);if(s<60)return`${s}m`;const n=Math.floor(s/60);return n<24?`${n}h`:`${Math.floor(n/24)}d`}function ge(t,a){const i=t-a;if(i<=0)return r("subscriptions.expired");const s=Math.floor(i/6e4),n=Math.floor(s/1440),o=Math.floor(s%1440/60),l=s%60;return r("subscriptions.countdown",{days:n,hours:o,minutes:l})}const $t="shrink-0 text-oai-black dark:text-oai-white";function Ut(t){const a=ie(t);if(!Number.isFinite(a))return null;const i=a-Date.now();if(i<=0)return r("shared.time.now");const s=Math.floor(i/6e4);if(s<60)return`${s}m`;const n=Math.floor(s/60);return n<24?`${n}h`:`${Math.floor(n/24)}d`}function Bt(t,a){const i=a===j.REMAINING?100-t:t;return i>=90?"bg-red-500":i>=70?"bg-amber-500":"bg-emerald-500"}function ae(t,a="used_percent"){return t?a==="utilization"?t.utilization:t.used_percent:null}function ne(t,a="reset_at"){return t?a==="resets_at"?t.resets_at:t.reset_at:null}function de(t){const a=Math.max(0,Math.min(100,Number(t)||0)),i=Math.round(a);return a>0&&i===0?r("limits.bar.sub_one_percent"):String(i)}function Z(t,{useGrouping:a=!0,maximumFractionDigits:i}={}){const s=Number(t);return Number.isFinite(s)?new Intl.NumberFormat(void 0,{minimumFractionDigits:0,maximumFractionDigits:i??(s>=100?0:2),useGrouping:a}).format(s):null}function Gt(t){if(!t||typeof t!="object"||!(Number(t.limit_credits)>0))return null;const a={useGrouping:t.unit!=="calls"},i=Z(t.used_credits,a),s=Z(t.limit_credits,a),n=Z(t.remaining_credits,a);if(!i||!s||!n)return null;const o=t.unit==="calls"?"limits.qoder_calls.detail":"limits.codex_credits.detail";return r(o,{used:i,limit:s,remaining:n})}function Wt(t,a){return it({usedPercent:ae(t.window,t.pctField),windowSeconds:nt(t,t.window),resetMs:ie(ne(t.window,t.resetField)),mode:a})}function $e(t){return Number.isFinite(t)?new Intl.DateTimeFormat(re(),{month:"numeric",day:"numeric",hour:"2-digit",minute:"2-digit",hour12:!1}).format(new Date(t)):null}function qt(t,a,i){const s=[Be(t,a,i)],n=ie(ne(t.window,t.resetField)),o=$e(n);o&&s.push(r(t.timeKind==="expiry"?"limits.hover.expires_at":"limits.hover.resets_at",{time:o}));const l=Gt(t.window);return l&&s.push(l),s.join(`
|
|
2
|
-
`)}const Ue=ut;function zt({label:t,pct:a,reset:i,mode:s=j.USED,pacePercent:n=null,paceOver:o=!1,title:l=null}){const c=Math.max(0,Math.min(100,Number(a)||0)),d=s===j.REMAINING?100-c:c,m=Math.round(d),g=d>0&&m===0?Math.max(d,.35):d;let h=String(m);d>0&&m===0&&(h=r("limits.bar.sub_one_percent"));const b=n==null?null:Math.max(0,Math.min(100,n));return e.jsxs("div",{className:"group relative flex items-center gap-2",children:[e.jsx(Ue,{text:l}),e.jsx("span",{"data-limit-label":"",className:"text-[11px] text-oai-gray-500 dark:text-oai-gray-400 shrink-0 whitespace-nowrap",style:{width:"var(--tt-limits-label-w)"},children:t}),e.jsxs("div",{className:"relative flex-1 bg-oai-gray-100 dark:bg-oai-gray-700/50 rounded-full h-1.5 overflow-hidden",children:[e.jsx("div",{className:`${Bt(d,s)} rounded-full h-full transition-[width] duration-500 ease-out`,style:{width:`${g}%`,minWidth:d>0?"3px":0}}),b!=null&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"absolute top-0 h-full bg-oai-gray-100 dark:bg-oai-gray-700/50",style:{left:`calc(${b}% - 3px)`,width:"6px"}}),e.jsx("div",{className:`absolute top-0 h-full ${o?"bg-red-500":"bg-emerald-500"}`,style:{left:`calc(${b}% - 1px)`,width:"2px"}})]})]}),e.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:[h,"%"]}),i&&e.jsx("span",{className:"text-[10px] text-oai-gray-400 dark:text-oai-gray-500 w-6 text-right shrink-0",children:i})]})}function Be(t,a,i){const s=t.label??r(t.labelKey),n=i===j.REMAINING,o=d=>n?100-d:d;if(a.expectedPercent==null){const d=Math.max(0,Math.min(100,Number(ae(t.window,t.pctField))||0)),m=de(o(d));return n?r("limits.explain.remaining",{label:s,used:m}):r("limits.explain.used",{label:s,used:m})}if(a.paceOver){if(a.runsOutEta)return r("limits.explain.ahead_eta",{label:s,eta:a.runsOutEta});const d=de(o(a.projectedEnd??100));return r(n?"limits.explain.ahead_pct_remaining":"limits.explain.ahead_pct",{label:s,pct:d})}const l=Math.max(0,Math.min(100,Number(ae(t.window,t.pctField))||0)),c=de(o(a.projectedEnd??l));return r(n?"limits.explain.on_track_remaining":"limits.explain.on_track",{label:s,pct:c})}function Vt({pace:t}){return t.pacePercent!=null}function Yt({rows:t,mode:a,now:i=Date.now()}){if(t.length===0)return null;const s=a===j.REMAINING,n=t.some(Vt);return e.jsxs("div",{className:"mt-1 flex flex-col gap-1",children:[t.map(({spec:o,pace:l})=>{const c=$e(ie(ne(o.window,o.resetField)));return e.jsxs("div",{className:"text-[11px] leading-snug text-oai-gray-600 dark:text-oai-gray-300",children:[Be(o,l,a),c?e.jsxs("span",{className:"text-oai-gray-400 dark:text-oai-gray-500",children:[" · ",r(o.timeKind==="expiry"?"limits.hover.expires_at":"limits.hover.resets_at",{time:c})]}):null]},o.key)}),n?e.jsx("div",{className:"mt-1 pt-1.5 border-t border-oai-gray-200/70 dark:border-oai-gray-700/50 text-[10.5px] leading-snug text-oai-gray-400 dark:text-oai-gray-500",children:r(s?"limits.explain.body_remaining":"limits.explain.body")}):null]})}function q(t){if(!t)return null;const a=Date.now()-new Date(t).getTime();if(a<0)return null;const i=Math.floor(a/6e4);if(i<1)return r("shared.time.now");if(i<60)return r("shared.time.m_ago",{n:i});const s=Math.floor(i/60);if(s<24)return r("shared.time.h_ago",{n:s});const n=Math.floor(s/24);return r("shared.time.d_ago",{n})}const Ne={live:{surface:"bg-oai-gray-50 dark:bg-oai-gray-800 border-oai-gray-200/60 dark:border-oai-gray-700/60 text-oai-gray-500 dark:text-oai-gray-400",dot:"bg-emerald-500",pulse:"bg-emerald-400"},stale:{surface:"bg-oai-gray-50 dark:bg-oai-gray-800 border-oai-gray-200/60 dark:border-oai-gray-700/60 text-oai-gray-500 dark:text-oai-gray-400",dot:"bg-amber-500",pulse:"bg-amber-400"},cached:{surface:"bg-oai-gray-50 dark:bg-oai-gray-800 border-oai-gray-200/60 dark:border-oai-gray-700/60 text-oai-gray-500 dark:text-oai-gray-400",dot:"bg-amber-500",pulse:"bg-amber-400"}},Kt={claude:"claude",codex:"codex"};function H({label:t,age:a=null,tone:i="live",tooltip:s=null}){const n=Ne[i]||Ne.live,o=i==="live";return e.jsxs("div",{className:"relative inline-flex items-center group cursor-help ml-1",onClick:l=>l.stopPropagation(),children:[e.jsxs("span",{className:`inline-flex items-center gap-1 px-1.5 py-0.5 rounded-full text-[9px] font-semibold uppercase tracking-wider border leading-normal ${n.surface}`,children:[o?e.jsxs("span",{className:"relative flex h-1.5 w-1.5",children:[e.jsx("span",{className:`animate-ping absolute inline-flex h-full w-full rounded-full ${n.pulse} opacity-75`}),e.jsx("span",{className:`relative inline-flex rounded-full h-1.5 w-1.5 ${n.dot}`})]}):e.jsx("span",{className:`h-1.5 w-1.5 rounded-full ${n.dot}`}),t,a?e.jsxs(e.Fragment,{children:[" · ",a]}):null]}),s?e.jsxs("span",{className:"pointer-events-none absolute left-1/2 bottom-full z-20 mb-2 -translate-x-1/2 w-48 rounded-md bg-oai-gray-900 dark:bg-oai-gray-800 px-2.5 py-1.5 text-[10px] font-normal text-white text-center opacity-0 scale-95 translate-y-1 group-hover:opacity-100 group-hover:scale-100 group-hover:translate-y-0 transition-all duration-200 cubic-bezier(0.16, 1, 0.3, 1) leading-normal shadow-lg origin-bottom border border-oai-gray-800 dark:border-oai-gray-700",children:[s,e.jsx("span",{className:"absolute left-1/2 top-full -translate-x-1/2 border-4 border-transparent border-t-oai-gray-900 dark:border-t-oai-gray-800"})]}):null]})}function Ge({name:t,providerId:a,children:i,expandable:s=!1,expanded:n=!1,onToggle:o,badge:l=null,rightAdornment:c=null}){const d=Ee(a),m=e.jsxs("div",{className:"flex items-center gap-1.5",children:[d?e.jsx(Ie,{provider:d,size:14,className:$t}):null,e.jsx("span",{className:"text-sm font-medium text-oai-black dark:text-oai-white",children:t}),c?e.jsx("span",{className:"shrink-0",children:c}):null,l]});return s?e.jsxs("div",{role:"button",tabIndex:0,"aria-expanded":n,onClick:o,onKeyDown:g=>{(g.key==="Enter"||g.key===" ")&&(g.preventDefault(),o?.())},className:"flex flex-col gap-1.5 -mx-1.5 px-1.5 py-1 rounded-lg cursor-pointer transition-colors hover:bg-oai-gray-50 dark:hover:bg-oai-gray-800/40 aria-expanded:bg-oai-gray-50 dark:aria-expanded:bg-oai-gray-800/40",children:[m,i]}):e.jsxs("div",{className:"flex flex-col gap-1.5",children:[m,i]})}function We({subscription:t}){const a=t.autoRenew?r("subscriptions.badge.auto_renew"):r("subscriptions.badge.stops"),i=t.autoRenew?Oe:Ae;return e.jsx("span",{role:"img","aria-label":a,title:a,className:`inline-flex translate-y-px ${t.autoRenew?"text-oai-brand-600 dark:text-oai-brand-400":"text-blue-600 dark:text-blue-400"}`,children:e.jsx(i,{size:14,strokeWidth:2,"aria-hidden":!0})})}function qe({subscription:t,now:a,mode:i=j.USED}){const s=te(t,a);if(!s)return null;const{endMs:n,expired:o}=s,l=!o&&n-a<=3*864e5,c=o?100:s.progress*100,d=i===j.REMAINING?100-c:c,m=o?100:Math.max(0,Math.min(100,d)),g=Math.round(m),h=m>0&&g===0?r("limits.bar.sub_one_percent"):`${g}%`;return e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-[11px] text-oai-gray-500 dark:text-oai-gray-400 shrink-0 whitespace-nowrap",style:{width:"var(--tt-limits-label-w)"},children:r("subscriptions.inline.label")}),e.jsx("div",{className:"relative flex-1 bg-oai-gray-100 dark:bg-oai-gray-700/50 rounded-full h-1.5 overflow-hidden",children:e.jsx("div",{className:`${o?"bg-red-500":l?"bg-amber-500":"bg-blue-500"} rounded-full h-full block motion-safe:transition-[width] motion-safe:duration-500 ease-out motion-reduce:transition-none`,style:{width:`${m}%`,minWidth:m>0?"3px":0}})}),e.jsx("span",{className:"text-[11px] tabular-nums text-oai-gray-500 dark:text-oai-gray-400 w-9 text-right shrink-0 whitespace-nowrap",children:h}),e.jsx("span",{className:`text-[10px] tabular-nums shrink-0 whitespace-nowrap w-6 text-right ${o?"text-oai-error":"text-oai-gray-400 dark:text-oai-gray-500"}`,children:He(n,a)})]})}function ze({subscription:t,now:a}){const i=te(t,a);if(!i)return null;const s=new Intl.DateTimeFormat(re(),{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"});return e.jsxs("div",{className:"text-[11px] leading-snug text-oai-gray-500 dark:text-oai-gray-400",children:[e.jsx("span",{children:r("subscriptions.inline.label")}),e.jsx("span",{className:"text-oai-gray-300 dark:text-oai-gray-600",children:":"}),e.jsx("span",{children:t.autoRenew?r("subscriptions.label.renews_at"):r("subscriptions.label.expires_at")}),e.jsx("span",{children:" "}),e.jsx("span",{className:"font-mono tabular-nums",children:s.format(new Date(i.endMs))}),e.jsx("span",{className:"text-oai-gray-300 dark:text-oai-gray-600",children:" · "}),e.jsx("span",{className:i.expired?"text-oai-error":void 0,children:ge(i.endMs,a)}),e.jsx("span",{className:"text-oai-gray-300 dark:text-oai-gray-600",children:" · "}),e.jsx("span",{children:t.autoRenew?r("subscriptions.status.auto_renew"):r("subscriptions.status.manual")})]})}const Xt=De;function O({children:t,tone:a="neutral"}){const i=a==="error"?"text-red-600 dark:text-red-400":"text-oai-gray-500 dark:text-oai-gray-400";return e.jsx("div",{className:`text-[11px] leading-snug ${i}`,children:t})}function Jt({rows:t,mode:a,extra:i=null}){const s=t.length===0&&!i;return e.jsxs(e.Fragment,{children:[t.map(({spec:n,pace:o})=>e.jsx(zt,{label:n.label??r(n.labelKey),pct:ae(n.window,n.pctField),reset:Ut(ne(n.window,n.resetField)),mode:a,pacePercent:o.pacePercent,paceOver:o.paceOver,title:qt(n,o,a)},n.key)),s?e.jsx(O,{children:r("limits.status.no_data")}):null,i]})}function Qt(t){if(!Number.isFinite(t.expiresMs))return null;const a=Math.floor((t.expiresMs-Date.now())/864e5);return a<0?null:a===0?r("limits.reset_bank.hover_detail_today",{date:t.expiresAt}):r("limits.reset_bank.hover_detail",{date:t.expiresAt,days:a})}function Zt({row:t}){const a=Math.max(0,Math.min(100,Number(t.percent)||0));return e.jsxs("div",{className:"group relative flex items-center gap-2","data-reset-bank-row":"",children:[e.jsx(Ue,{text:Qt(t)}),e.jsx("span",{"data-limit-label":"",className:"text-[11px] text-oai-gray-500 dark:text-oai-gray-400 shrink-0 whitespace-nowrap",style:{width:"var(--tt-limits-label-w)"},children:t.label}),e.jsx("div",{className:"relative flex-1 bg-oai-gray-100 dark:bg-oai-gray-700/50 rounded-full h-1.5 overflow-hidden",children:e.jsx("div",{className:"bg-oai-gray-400 dark:bg-oai-gray-500 rounded-full h-full transition-[width] duration-500 ease-out",style:{width:`${a}%`,minWidth:a>0?"3px":0}})}),e.jsx("span",{className:"text-[10px] tabular-nums text-oai-gray-400 dark:text-oai-gray-500 w-[4.25rem] text-right shrink-0 whitespace-nowrap",children:t.expiresAt})]})}function ea({model:t}){const a=t.kind==="count_only"?r("limits.codex_reset_bank.count_only",{count:t.availableCount}):null;return e.jsxs("div",{className:"mt-1 flex flex-col gap-1","data-reset-bank-section":t.kind,children:[e.jsx("div",{className:"text-[10.5px] font-medium uppercase tracking-wide text-oai-gray-400 dark:text-oai-gray-500",children:r("limits.codex_reset_bank.title")}),a?e.jsx("div",{className:"text-[11px] leading-snug text-oai-gray-500 dark:text-oai-gray-400",children:a}):t.rows.map(i=>e.jsx(Zt,{row:i},i.key))]})}function Ve(t,a){if(t==="codex_meta"){const i=Ot(a.reset_credits);return i?e.jsx(ea,{model:i}):null}if(t==="kimi_parallel"&&a.parallel_limit)return e.jsx(O,{children:r("limits.label.kimi_parallel",{count:a.parallel_limit})});if(t==="kiro_credits"&&Number.isFinite(Number(a.tracked_credits))&&Number(a.tracked_credit_records)>0){const i=Z(a.tracked_credits,{maximumFractionDigits:2});return e.jsx(O,{children:r("limits.label.kiro_tracked_credits",{credits:i,count:Number(a.tracked_credit_records)})})}return t==="copilot_otel"&&!a.otel_has_files&&!a.otel_enabled?e.jsx(ra,{defaultDir:a.otel_default_dir}):null}function ta(t,a,i,s,n,o,l=null,c=null,d=Date.now()){const m=xe[t];if(!m)return null;const g=m.windows(a).filter(b=>b.window).map(b=>({spec:b,pace:Wt(b,s)})),h=Ve(m.extra,a);return e.jsxs(Ge,{name:i,providerId:t,expandable:g.length>0||!!c,expanded:n,onToggle:o,badge:l,rightAdornment:c?e.jsx(We,{subscription:c}):null,children:[e.jsx(Jt,{mode:s,rows:g,extra:h}),c?e.jsx(qe,{subscription:c,now:d,mode:s}):null,n?e.jsx(Yt,{rows:g,mode:s,now:d}):null,n&&c?e.jsx(ze,{subscription:c,now:d}):null]},t)}function ue(t,a,i,s,n=null,o=Date.now(),l=j.USED){const c=!!n;return e.jsxs(Ge,{name:ee(t),providerId:t,expandable:c,expanded:i,onToggle:s,rightAdornment:c?e.jsx(We,{subscription:n}):null,children:[a,c?e.jsx(qe,{subscription:n,now:o,mode:l}):null,c&&i?e.jsx("div",{className:"mt-1",children:e.jsx(ze,{subscription:n,now:o})}):null]},t)}function aa(t,a,i,s,n,o=null,l=Date.now()){if(!xe[t])return null;if(!a?.configured)return ue(t,e.jsxs(e.Fragment,{children:[e.jsx(O,{children:r("limits.status.not_connected")}),t==="opencodeGo"?e.jsx(_e,{}):null,t==="codingPlan"?e.jsx(Me,{}):null,t==="agentPlan"?e.jsx(Pe,{}):null]}),s,n,o,l,i);if(t==="opencodeGo"&&a.subscription_status==="inactive")return ue(t,e.jsx(O,{children:r("limits.opencodeGo.status.inactive")}),s,n,o,l,i);if(a.error)return ue(t,e.jsxs(e.Fragment,{children:[e.jsx(O,{tone:"error",children:r("shared.error.prefix",{error:a.error})}),t==="kiro"?Ve(xe.kiro.extra,a):null,t==="opencodeGo"?e.jsx(_e,{}):null,t==="codingPlan"?e.jsx(Me,{}):null,t==="agentPlan"?e.jsx(Pe,{}):null]}),s,n,o,l,i);const c=ee(t),d=a.plan_label?`${c} ${a.plan_label}`:c;let m=null;if(t==="antigravity")if(a.cached){const h=q(a.cached_at);m=e.jsx(H,{label:r("limits.label.antigravity_cached"),age:h,tone:"cached",tooltip:r("limits.tooltip.antigravity_cached")})}else m=e.jsx(H,{label:r("limits.label.antigravity_live"),tone:"live",tooltip:r("limits.tooltip.antigravity_live")});if((t==="qoder"||t==="qoderCn")&&a.cached&&(m=e.jsx(H,{label:r("limits.label.antigravity_cached"),age:q(a.cached_at),tone:"cached",tooltip:r("limits.tooltip.qoder_cached")})),(t==="codingPlan"||t==="agentPlan")&&a.cached&&(m=e.jsx(H,{label:r("limits.label.antigravity_cached"),age:q(a.cached_at),tone:"cached",tooltip:r("limits.tooltip.ark_cached")})),!m&&a.auth_action_required==="reauth"){const h=Kt[t];m=e.jsx(H,{label:r("limits.reauth.badge"),age:q(a.cached_at),tone:"stale",tooltip:h?r("limits.reauth.tooltip",{command:h}):null})}const g=a.provenance;return g?.stale&&!m&&(m=e.jsx(H,{label:r("limits.provenance.stale"),age:q(g.captured_at),tone:"stale",tooltip:r("limits.provenance.tooltip",{source:g.source,confidence:g.confidence})})),ta(t,a,d,i,s,n,m,o,l)}function ra({defaultDir:t}){const[a,i]=x.useState(!1),n=["export COPILOT_OTEL_ENABLED=true","export COPILOT_OTEL_EXPORTER_TYPE=file",`export COPILOT_OTEL_FILE_EXPORTER_PATH="${t||"$HOME/.copilot/otel"}/copilot-otel-$(date +%Y%m%d).jsonl"`].join(`
|
|
3
|
-
`),o=async l=>{l.stopPropagation();try{await navigator.clipboard.writeText(n),i(!0),setTimeout(()=>i(!1),1600)}catch{}};return e.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:[e.jsx("div",{className:"font-medium text-oai-gray-700 dark:text-oai-gray-200",children:r("limits.copilot.otelHint.title")}),e.jsx("div",{className:"mt-0.5 leading-snug",children:r("limits.copilot.otelHint.body")}),e.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:n}),e.jsx("button",{type:"button",onClick:o,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:a?r("limits.copilot.otelHint.copied"):r("limits.copilot.otelHint.copy")})]})}function M({n:t,children:a}){return e.jsxs("li",{className:"flex gap-2.5",children:[e.jsx("span",{className:"mt-[1px] flex h-4 w-4 shrink-0 items-center justify-center rounded-full bg-oai-brand/15 text-[9px] font-semibold text-oai-brand",children:t}),e.jsx("div",{className:"min-w-0 flex-1 leading-snug",children:a})]})}function he(){return e.jsx("svg",{viewBox:"0 0 12 12","aria-hidden":"true",className:"h-2.5 w-2.5",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:e.jsx("path",{d:"M4.5 2.75h4.75V7.5M9.25 2.75 3 9"})})}function _e(){const[t,a]=x.useState(!1),i=["read -r -s OPENCODE_GO_API_KEY","export OPENCODE_GO_API_KEY",'launchctl setenv OPENCODE_GO_API_KEY "$OPENCODE_GO_API_KEY"'].join(`
|
|
4
|
-
`),s=async n=>{n.stopPropagation();try{await navigator.clipboard.writeText(i),a(!0),setTimeout(()=>a(!1),1600)}catch{}};return e.jsxs("div",{className:"mt-1.5 rounded-lg border border-oai-gray-200 dark:border-oai-gray-700/60 bg-oai-gray-50/50 dark:bg-oai-gray-900/20 p-3 text-[11px] text-oai-gray-600 dark:text-oai-gray-300",children:[e.jsx("div",{className:"text-[12px] font-semibold text-oai-gray-800 dark:text-oai-gray-100",children:r("limits.opencodeGo.setupHint.title")}),e.jsx("div",{className:"mt-0.5 leading-snug text-oai-gray-500 dark:text-oai-gray-400",children:r("limits.opencodeGo.setupHint.subtitle")}),e.jsxs("ol",{className:"mt-2.5 space-y-2.5",children:[e.jsxs(M,{n:"1",children:[e.jsx("div",{children:r("limits.opencodeGo.setupHint.step1")}),e.jsxs("a",{href:"https://opencode.ai",target:"_blank",rel:"noreferrer",onClick:n=>n.stopPropagation(),className:"mt-1 inline-flex items-center gap-1 rounded-md bg-oai-brand/10 px-2 py-1 font-medium text-oai-brand hover:bg-oai-brand/15 transition-colors",children:[r("limits.opencodeGo.setupHint.cta"),e.jsx(he,{})]})]}),e.jsx(M,{n:"2",children:e.jsx("div",{children:r("limits.opencodeGo.setupHint.step2")})}),e.jsxs(M,{n:"3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{children:r("limits.opencodeGo.setupHint.step3")}),e.jsx("button",{type:"button",onClick:s,className:"shrink-0 rounded-md border border-oai-gray-300 dark:border-oai-gray-700 px-2 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:t?r("limits.opencodeGo.setupHint.copied"):r("limits.opencodeGo.setupHint.copy")})]}),e.jsx("pre",{className:"mt-1.5 overflow-x-auto rounded-md bg-oai-gray-100 dark:bg-oai-gray-900/60 px-2 py-1.5 font-mono text-[10.5px] leading-relaxed whitespace-pre",children:i}),e.jsx("div",{className:"mt-1 text-[10px] text-oai-gray-400 dark:text-oai-gray-500",children:r("limits.opencodeGo.setupHint.note_app")})]})]})]})}function Me(){const[t,a]=x.useState(!1),i=["npm install -g @volcengine/ark-cli","arkcli auth login volc-sso # browser SSO (recommended)","arkcli auth status # verify the session"].join(`
|
|
5
|
-
`),s=async n=>{n.stopPropagation();try{await navigator.clipboard.writeText(i),a(!0),setTimeout(()=>a(!1),1600)}catch{}};return e.jsxs("div",{className:"mt-1.5 rounded-lg border border-oai-gray-200 dark:border-oai-gray-700/60 bg-oai-gray-50/50 dark:bg-oai-gray-900/20 p-3 text-[11px] text-oai-gray-600 dark:text-oai-gray-300",children:[e.jsx("div",{className:"text-[12px] font-semibold text-oai-gray-800 dark:text-oai-gray-100",children:r("limits.codingPlan.setupHint.title")}),e.jsx("div",{className:"mt-0.5 leading-snug text-oai-gray-500 dark:text-oai-gray-400",children:r("limits.codingPlan.setupHint.subtitle")}),e.jsxs("ol",{className:"mt-2.5 space-y-2.5",children:[e.jsxs(M,{n:"1",children:[e.jsx("div",{children:r("limits.codingPlan.setupHint.step1")}),e.jsxs("a",{href:"https://www.volcengine.com/docs/82379/2536875",target:"_blank",rel:"noreferrer",onClick:n=>n.stopPropagation(),className:"mt-1 inline-flex items-center gap-1 rounded-md bg-oai-brand/10 px-2 py-1 font-medium text-oai-brand hover:bg-oai-brand/15 transition-colors",children:[r("limits.codingPlan.setupHint.cta"),e.jsx(he,{})]})]}),e.jsxs(M,{n:"2",children:[e.jsx("div",{children:r("limits.codingPlan.setupHint.step2")}),e.jsx("div",{className:"mt-0.5 text-oai-gray-500 dark:text-oai-gray-400",children:r("limits.codingPlan.setupHint.step2_remote")})]}),e.jsxs(M,{n:"3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{children:r("limits.codingPlan.setupHint.step3")}),e.jsx("button",{type:"button",onClick:s,className:"shrink-0 rounded-md border border-oai-gray-300 dark:border-oai-gray-700 px-2 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:t?r("limits.codingPlan.setupHint.copied"):r("limits.codingPlan.setupHint.copy")})]}),e.jsx("pre",{className:"mt-1.5 overflow-x-auto rounded-md bg-oai-gray-100 dark:bg-oai-gray-900/60 px-2 py-1.5 font-mono text-[10.5px] leading-relaxed whitespace-pre",children:i}),e.jsx("div",{className:"mt-1 text-[10px] text-oai-gray-400 dark:text-oai-gray-500",children:r("limits.codingPlan.setupHint.note_app")})]})]})]})}function Pe(){const[t,a]=x.useState(!1),i=[r("limits.agentPlan.setupHint.snippet_install"),r("limits.agentPlan.setupHint.snippet_login"),r("limits.agentPlan.setupHint.snippet_status")].join(`
|
|
6
|
-
`),s=async n=>{n.stopPropagation();try{await navigator.clipboard.writeText(i),a(!0),setTimeout(()=>a(!1),1600)}catch{}};return e.jsxs("div",{className:"mt-1.5 rounded-lg border border-oai-gray-200 dark:border-oai-gray-700/60 bg-oai-gray-50/50 dark:bg-oai-gray-900/20 p-3 text-[11px] text-oai-gray-600 dark:text-oai-gray-300",children:[e.jsx("div",{className:"text-[12px] font-semibold text-oai-gray-800 dark:text-oai-gray-100",children:r("limits.agentPlan.setupHint.title")}),e.jsx("div",{className:"mt-0.5 leading-snug text-oai-gray-500 dark:text-oai-gray-400",children:r("limits.agentPlan.setupHint.subtitle")}),e.jsxs("ol",{className:"mt-2.5 space-y-2.5",children:[e.jsxs(M,{n:"1",children:[e.jsx("div",{children:r("limits.agentPlan.setupHint.step1")}),e.jsxs("a",{href:"https://www.volcengine.com/docs/82379/2536875",target:"_blank",rel:"noreferrer",onClick:n=>n.stopPropagation(),className:"mt-1 inline-flex items-center gap-1 rounded-md bg-oai-brand/10 px-2 py-1 font-medium text-oai-brand hover:bg-oai-brand/15 transition-colors",children:[r("limits.agentPlan.setupHint.cta"),e.jsx(he,{})]})]}),e.jsxs(M,{n:"2",children:[e.jsx("div",{children:r("limits.agentPlan.setupHint.step2")}),e.jsx("div",{className:"mt-0.5 text-oai-gray-500 dark:text-oai-gray-400",children:r("limits.agentPlan.setupHint.step2_remote")})]}),e.jsxs(M,{n:"3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{children:r("limits.agentPlan.setupHint.step3")}),e.jsx("button",{type:"button",onClick:s,className:"shrink-0 rounded-md border border-oai-gray-300 dark:border-oai-gray-700 px-2 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:t?r("limits.agentPlan.setupHint.copied"):r("limits.agentPlan.setupHint.copy")})]}),e.jsx("pre",{className:"mt-1.5 overflow-x-auto rounded-md bg-oai-gray-100 dark:bg-oai-gray-900/60 px-2 py-1.5 font-mono text-[10.5px] leading-relaxed whitespace-pre",children:i}),e.jsx("div",{className:"mt-1 text-[10px] text-oai-gray-400 dark:text-oai-gray-500",children:r("limits.agentPlan.setupHint.note_app")})]})]})]})}function ia(t){const[a,i]=x.useState(0);return x.useLayoutEffect(()=>{const s=t.current;if(!s)return;const n=s.querySelectorAll("[data-limit-label]");let o=0,l=null;if(n.length>0)try{l=document.createElement("canvas").getContext("2d")}catch{l=null}if(l){const d=window.getComputedStyle(n[0]);l.font=`${d.fontStyle} ${d.fontWeight} ${d.fontSize} ${d.fontFamily}`;for(const m of n)o=Math.max(o,l.measureText(m.textContent).width)}const c=Math.ceil(o);i(d=>d===c?d:c)}),a}function na({claude:t,codex:a,cursor:i,gemini:s,kimi:n,kiro:o,grok:l,antigravity:c,copilot:d,zcode:m,opencodeGo:g,qoder:h,qoderCn:b,codingPlan:N,agentPlan:T,order:w,visibility:k,displayMode:$,subscriptions:se=[],showSubscriptions:Y=!0}){const oe={claude:t,codex:a,cursor:i,gemini:s,kimi:n,kiro:o,grok:l,antigravity:c,copilot:d,zcode:m,opencodeGo:g,qoder:h,qoderCn:b,codingPlan:N,agentPlan:T},F=x.useRef(null),K=ia(F),[be,P]=x.useState(null),[U,X]=x.useState(()=>Date.now()),D=Array.isArray(w)&&w.length>0?w:Xt,B=$===j.REMAINING?j.REMAINING:j.USED,le=B===j.REMAINING?r("limits.settings.display_mode_remaining"):r("limits.settings.display_mode_used");x.useEffect(()=>{const f=setInterval(()=>X(Date.now()),6e4);return()=>clearInterval(f)},[]);const E=new Map;if(Y)for(const f of se||[]){if(!f?.provider)continue;const _=new Date(f.nextBillingAt).getTime();if(!Number.isFinite(_))continue;const S=E.get(f.provider);if(!S){E.set(f.provider,f);continue}const G=new Date(S.nextBillingAt).getTime(),Q=_>U,I=G>U;(Q&&(!I||G>_)||!Q&&!I&&_>G)&&E.set(f.provider,f)}const J=D.filter(f=>!k||k[f]!==!1||E.has(f)).map(f=>aa(f,oe[f],B,be===f,()=>P(_=>_===f?null:f),E.get(f)||null,U)).filter(Boolean);return e.jsx(dt,{delay:.15,children:e.jsx(Te,{children:e.jsxs("div",{ref:F,className:"flex flex-col gap-3",style:K>0?{"--tt-limits-label-w":`${K}px`}:void 0,children:[e.jsxs("h3",{className:"text-sm font-medium text-oai-gray-500 dark:text-oai-gray-300 uppercase tracking-wide",children:[r("limits.panel.title"),r("limits.panel.mode_separator"),le]}),J.length>0?J:e.jsx(O,{children:r("limits.status.all_hidden")})]})})})}async function Ye(t){const a=await t.json().catch(()=>null);if(!t.ok||a?.ok===!1)throw new Error(a?.error||`Subscription request failed with HTTP ${t.status}`);return a}async function sa(){const t=await fetch("/functions/tokentracker-subscription-manager",{headers:{Accept:"application/json"},cache:"no-store"}),a=await Ye(t);return Array.isArray(a.subscriptions)?a.subscriptions:[]}async function fe(t){const a=await Je();return Ye(await fetch("/functions/tokentracker-subscription-manager",{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json",...a},cache:"no-store",body:JSON.stringify(t)}))}function oa(t){return fe({action:"create",subscription:t})}function la(t,a){return fe({action:"update",id:t,subscription:a})}function ca(t){return fe({action:"delete",id:t})}const me={plan:"",provider:"",cycle:"monthly",autoRenew:!0,startedAt:""};function da(t){const a=new Date(t);if(Number.isNaN(a.getTime()))return"";const i=s=>String(s).padStart(2,"0");return`${a.getFullYear()}-${i(a.getMonth()+1)}-${i(a.getDate())}T${i(a.getHours())}:${i(a.getMinutes())}`}function ua({subscriptions:t,onChanged:a}){const[i,s]=x.useState(!1),[n,o]=x.useState(null),[l,c]=x.useState(me),[d,m]=x.useState(!1),[g,h]=x.useState(!1),[b,N]=x.useState(!1),[T,w]=x.useState(!1),[k,$]=x.useState(null),[se,Y]=x.useState(!1),[oe,F]=x.useState(!1),[K,be]=x.useState(null),[P,U]=x.useState(()=>Date.now()),X=x.useRef(null),D=re(),B=x.useMemo(()=>new Intl.DateTimeFormat(D,{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}),[D]);x.useEffect(()=>{const u=setInterval(()=>U(Date.now()),6e4);return()=>clearInterval(u)},[]),x.useEffect(()=>{if(!i)return;const u=window.matchMedia?.("(prefers-reduced-motion: reduce)").matches;X.current?.scrollIntoView?.({behavior:u?"auto":"smooth",block:"nearest"})},[i,n]);const le=x.useMemo(()=>De.map(u=>{const v=(t||[]).some(y=>y.provider===u&&y.id!==n),p=ee(u);return{value:u,label:v?`${p} ${r("subscriptions.form.provider_taken_suffix")}`:p,disabled:v}}),[D,t,n]),E=x.useMemo(()=>[{value:"weekly",label:r("subscriptions.form.cycle_weekly")},{value:"monthly",label:r("subscriptions.form.cycle_monthly")},{value:"yearly",label:r("subscriptions.form.cycle_yearly")}],[D]),J=x.useMemo(()=>[{value:"true",label:r("subscriptions.form.auto_renew_on")},{value:"false",label:r("subscriptions.form.auto_renew_off")}],[D]),f=x.useCallback(()=>{c(me),o(null),h(!1),N(!1),w(!1),s(!0)},[]),_=x.useCallback(u=>{c({plan:u.plan||"",provider:u.provider||"",cycle:u.cycle||"monthly",autoRenew:u.autoRenew,startedAt:da(new Date(Ft(u)).toISOString())}),o(u.id),h(!1),N(!1),w(!1),s(!0)},[]),S=x.useCallback(()=>{s(!1),o(null),c(me),h(!1),N(!1),w(!1)},[]),G=x.useCallback(async u=>{if(u.preventDefault(),h(!1),!l.provider){N(!0);return}if((t||[]).some(L=>L.provider===l.provider&&L.id!==n)){w(!0);return}const p=new Date(l.startedAt).getTime();if(!Number.isFinite(p)){h(!0);return}const y={service:ee(l.provider),plan:l.plan,provider:l.provider||null,autoRenew:l.autoRenew,cycle:l.cycle,startedAt:p,nextBillingAt:Le(p,l.cycle)};m(!0);try{n?await la(n,y):await oa(y),S(),await a?.()}catch{h(!0)}finally{m(!1)}},[S,n,l,a,t]),Q=x.useCallback(async()=>{if(k){Y(!0),F(!1);try{await ca(k.id),k.id===n&&S(),$(null),await a?.()}catch{F(!0)}finally{Y(!1)}}},[S,n,a,k]),I=t||[],ye=()=>{const u=n?I.find(p=>p.id===n):null,v=u?te(u,P):null;return e.jsxs("form",{ref:X,onSubmit:G,className:"grid grid-cols-1 gap-3 px-3 py-3 text-left sm:grid-cols-2",children:[e.jsx("div",{className:"flex items-center justify-between sm:col-span-2",children:e.jsx("span",{className:"text-xs font-semibold uppercase tracking-wide text-oai-gray-500 dark:text-oai-gray-400",children:n?r("subscriptions.edit"):r("subscriptions.add")})}),v?e.jsxs("div",{className:"sm:col-span-2 rounded-md bg-oai-gray-50 dark:bg-oai-gray-800/50 px-2.5 py-2 text-xs text-oai-gray-600 dark:text-oai-gray-300",children:[e.jsx("span",{className:"text-oai-gray-400 dark:text-oai-gray-500",children:u.autoRenew?r("subscriptions.label.renews_at"):r("subscriptions.label.expires_at")})," ",e.jsx("span",{className:"font-mono tabular-nums",children:B.format(new Date(v.endMs))})," · ",e.jsx("span",{className:v.expired?"text-oai-error":void 0,children:ge(v.endMs,P)})]}):null,e.jsxs("div",{className:"flex flex-col sm:col-span-1",children:[e.jsx("label",{htmlFor:"subscription-provider",className:"block text-sm font-medium text-oai-gray-700 dark:text-oai-gray-300 mb-1.5",children:r("subscriptions.form.provider")}),e.jsx(ce,{id:"subscription-provider",value:l.provider,onValueChange:p=>c({...l,provider:String(p)}),options:le,matchTriggerWidth:!0,className:"h-10 w-full px-3 text-sm"})]}),e.jsx("div",{className:"sm:col-span-1",children:e.jsx(je,{label:r("subscriptions.form.plan"),value:l.plan,maxLength:120,placeholder:r("subscriptions.form.plan_placeholder"),onChange:p=>c({...l,plan:p.target.value})})}),e.jsxs("div",{className:"flex flex-col sm:col-span-1",children:[e.jsx("label",{htmlFor:"subscription-cycle",className:"block text-sm font-medium text-oai-gray-700 dark:text-oai-gray-300 mb-1.5",children:r("subscriptions.form.cycle")}),e.jsx(ce,{id:"subscription-cycle",value:l.cycle,onValueChange:p=>c({...l,cycle:String(p)}),options:E,matchTriggerWidth:!0,className:"h-10 w-full px-3 text-sm"})]}),e.jsxs("div",{className:"flex flex-col sm:col-span-1",children:[e.jsx("label",{htmlFor:"subscription-auto-renew",className:"block text-sm font-medium text-oai-gray-700 dark:text-oai-gray-300 mb-1.5",children:r("subscriptions.form.auto_renew")}),e.jsx(ce,{id:"subscription-auto-renew",value:String(l.autoRenew),onValueChange:p=>c({...l,autoRenew:p==="true"}),options:J,matchTriggerWidth:!0,className:"h-10 w-full px-3 text-sm"})]}),e.jsx("div",{className:"sm:col-span-2",children:e.jsx(je,{label:r("subscriptions.form.started_at"),type:"datetime-local",value:l.startedAt,required:!0,onChange:p=>c({...l,startedAt:p.target.value})})}),e.jsxs("div",{className:"flex items-center justify-end gap-2 sm:col-span-2",children:[n?e.jsx(W,{type:"button",variant:"secondary",size:"sm",onClick:()=>{const p=I.find(y=>y.id===n);p&&$(p)},className:"!text-red-600 dark:!text-red-400 mr-auto",children:r("subscriptions.delete")}):null,b?e.jsx("p",{className:"mr-auto text-sm text-oai-error",role:"alert",children:r("subscriptions.form.provider_required")}):null,T?e.jsx("p",{className:"mr-auto text-sm text-oai-error",role:"alert",children:r("subscriptions.form.provider_taken")}):null,g?e.jsx("p",{className:"mr-auto text-sm text-oai-error",role:"alert",children:r("subscriptions.form.error")}):null,e.jsx(W,{type:"button",variant:"secondary",size:"sm",onClick:S,children:r("shared.action.cancel")}),e.jsx(W,{type:"submit",size:"sm",disabled:d,children:r("subscriptions.save")})]})]})};return e.jsxs("div",{className:"flex max-h-[min(80vh,42rem)] w-[min(92vw,32rem)] flex-col gap-3 overflow-y-auto rounded-xl border border-oai-gray-200 bg-white p-4 shadow-lg dark:border-oai-gray-700 dark:bg-oai-gray-900",children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsx("div",{className:"min-w-0",children:e.jsx("span",{className:"block truncate text-sm font-semibold text-oai-black dark:text-white",children:r("limits.page.openSubscriptions")})}),e.jsxs(W,{type:"button",size:"sm",onClick:f,className:"shrink-0 gap-1.5",children:[e.jsx(pt,{size:14,strokeWidth:2,"aria-hidden":!0}),e.jsx("span",{children:r("subscriptions.add")})]})]}),I.length===0&&!(i&&!n)?e.jsxs("div",{className:"flex flex-col items-center justify-center gap-1 rounded-lg border border-dashed border-oai-gray-200 px-4 py-10 text-center dark:border-oai-gray-700",children:[e.jsx(Re,{className:"h-6 w-6 text-oai-gray-300 dark:text-oai-gray-600 mb-2","aria-hidden":!0}),e.jsx("p",{className:"text-sm font-medium text-oai-black dark:text-white",children:r("subscriptions.empty.title")}),e.jsx("p",{className:"text-xs text-oai-gray-500 dark:text-oai-gray-400",children:r("subscriptions.empty.body")})]}):e.jsxs("ul",{className:"flex flex-col gap-1.5",children:[I.map(u=>{const v=te(u,P);if(!v)return null;const{endMs:p,expired:y}=v,L=y?100:v.progress*100,Ke=!y&&p-P<=3*864e5,Xe=K===u.id;return e.jsxs("li",{className:"rounded-lg border border-oai-gray-100 dark:border-oai-gray-800",children:[e.jsxs("button",{type:"button",onClick:()=>_(u),"aria-label":`${r("subscriptions.edit")} ${u.service}`,"aria-expanded":n===u.id,className:"w-full flex flex-col gap-1.5 px-3 py-2.5 text-left cursor-pointer hover:bg-oai-gray-50 dark:hover:bg-oai-gray-800/40 rounded-lg transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-oai-brand-500",children:[e.jsxs("span",{className:"flex items-center gap-2 min-w-0",children:[e.jsx(Ie,{provider:Ee(u.provider)||"OTHER",size:14}),e.jsx("span",{className:"text-sm font-medium text-oai-black dark:text-white truncate",children:u.service}),e.jsx("span",{role:"img","aria-label":u.autoRenew?r("subscriptions.badge.auto_renew"):r("subscriptions.badge.stops"),title:u.autoRenew?r("subscriptions.badge.auto_renew"):r("subscriptions.badge.stops"),className:`inline-flex shrink-0 translate-y-px ${u.autoRenew?"text-oai-brand-600 dark:text-oai-brand-400":"text-blue-600 dark:text-blue-400"}`,children:u.autoRenew?e.jsx(Oe,{size:14,strokeWidth:2,"aria-hidden":!0}):e.jsx(Ae,{size:14,strokeWidth:2,"aria-hidden":!0})}),u.plan?e.jsx("span",{className:"text-xs rounded-full border border-oai-gray-200 dark:border-oai-gray-700 px-2 py-0.5 text-oai-gray-500 dark:text-oai-gray-400 shrink-0",children:u.plan}):null]}),e.jsxs("span",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-[10px] text-oai-gray-500 dark:text-oai-gray-400 shrink-0",children:r("subscriptions.inline.label")}),e.jsx("span",{className:"relative flex-1 bg-oai-gray-100 dark:bg-oai-gray-700/50 rounded-full h-1 overflow-hidden",children:e.jsx("span",{className:`${y?"bg-red-500":Ke?"bg-amber-500":"bg-blue-500"} rounded-full h-full block transition-[width] duration-500 ease-out`,style:{width:`${L}%`,minWidth:L>0?"3px":0}})}),e.jsx("span",{className:`text-[10px] tabular-nums shrink-0 ${y?"text-oai-error":"text-oai-gray-400 dark:text-oai-gray-500"}`,children:He(p,P)})]})]}),n===u.id?e.jsx("div",{className:"border-t border-oai-gray-100 dark:border-oai-gray-800",children:ye()}):null,n!==u.id&&Xe?e.jsxs("div",{className:"px-3 pb-3 flex flex-col gap-2 border-t border-oai-gray-100 dark:border-oai-gray-800",children:[e.jsxs("p",{className:"pt-2 text-xs text-oai-gray-600 dark:text-oai-gray-300",children:[e.jsx("span",{className:"text-oai-gray-400 dark:text-oai-gray-500",children:u.autoRenew?r("subscriptions.label.renews_at"):r("subscriptions.label.expires_at")})," ",e.jsx("span",{className:"font-mono tabular-nums",children:B.format(new Date(p))})," · ",e.jsx("span",{className:y?"text-oai-error":void 0,children:ge(p,P)})," · ",e.jsx("span",{children:u.autoRenew?r("subscriptions.status.auto_renew"):r("subscriptions.status.manual")})]}),e.jsx("div",{className:"flex items-center gap-2",children:e.jsx(W,{type:"button",variant:"secondary",size:"sm",onClick:()=>_(u),children:r("subscriptions.edit")})})]}):null]},u.id)}),i&&!n?e.jsx("li",{className:"rounded-lg border border-oai-gray-100 dark:border-oai-gray-800",children:ye()}):null]}),e.jsx(mt,{open:!!k,title:r("subscriptions.confirm_delete_title"),description:k?.service||"",error:oe?r("subscriptions.delete_error"):null,confirmLabel:r("subscriptions.delete"),cancelLabel:r("shared.action.cancel"),destructive:!0,busy:se,onCancel:()=>{$(null),F(!1)},onConfirm:Q})]})}const Se=typeof window<"u"&&(window.location.hostname==="localhost"||window.location.hostname==="127.0.0.1"),ma="x-apple.systempreferences:com.apple.preference.notifications";function xa(){const t=kt(),a=at(),i=r("limits.alert.blocked"),s=a?ve.button:ve.div;return e.jsxs(s,{type:a?"button":void 0,onClick:a?()=>rt({type:"action",name:"openURL",value:ma}):void 0,initial:t?!1:{opacity:0,x:14,scale:.9},animate:{opacity:1,x:0,scale:1},transition:{type:"spring",stiffness:320,damping:18},title:i,className:`relative hidden sm:inline-flex min-w-0 max-w-[360px] items-center gap-1.5 rounded-full border border-amber-300/70 bg-amber-50 px-3 py-1.5 text-xs text-amber-700 dark:border-amber-500/30 dark:bg-amber-500/10 dark:text-amber-300 ${a?"cursor-pointer transition-colors hover:bg-amber-100 dark:hover:bg-amber-500/20 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-amber-500/60":""}`,children:[e.jsxs("span",{className:"relative flex h-1.5 w-1.5 shrink-0",children:[e.jsx("span",{className:"absolute inline-flex h-full w-full animate-ping rounded-full bg-amber-400 opacity-75"}),e.jsx("span",{className:"relative inline-flex h-1.5 w-1.5 rounded-full bg-amber-500"})]}),e.jsx("span",{className:"truncate",children:i}),e.jsx("span",{"aria-hidden":!0,className:"absolute left-full top-1/2 -translate-y-1/2 border-[5px] border-transparent border-l-amber-300/80 dark:border-l-amber-500/40"})]})}function Ha(){const t=Qe(),{data:a,error:i,isLoading:s}=st(t?{initialRefresh:!0,initialState:t,publishToPreloadCache:!0}:{initialRefresh:!0,publishToPreloadCache:!0}),n=ct(),o=ot(),[l,c]=C.useState([]),[d,m]=C.useState(!1),[g,h]=C.useState(!1),[b]=Ze(),N=C.useRef(0),T=C.useCallback(async()=>{if(!Se&&!ke())return;const w=++N.current;try{const k=await sa();if(w!==N.current)return;c(k),m(!1)}catch{if(w!==N.current)return;m(!0)}},[]);return C.useEffect(()=>{T()},[T]),C.useEffect(()=>{b.get("openSubscriptions")==="1"&&h(!0)},[b]),C.useEffect(()=>{o.enabled&&a&<(a)},[o.enabled,a]),!Se&&!ke()?e.jsx("div",{className:"flex flex-col flex-1 text-oai-black dark:text-oai-white font-oai antialiased",children:e.jsx(xt,{})}):e.jsx("div",{className:"flex flex-col flex-1 text-oai-black dark:text-oai-white font-oai antialiased",children:e.jsx("main",{className:"flex-1 pt-8 sm:pt-10 pb-12 sm:pb-16",children:e.jsxs("div",{className:"mx-auto max-w-6xl px-4 sm:px-6",children:[e.jsxs("div",{className:"flex flex-row items-start justify-between gap-4 mb-8",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("h1",{className:"text-3xl sm:text-4xl font-semibold tracking-tight text-oai-black dark:text-white mb-3",children:r("nav.limits")}),e.jsx("p",{className:"text-oai-gray-500 dark:text-oai-gray-400 text-sm sm:text-base",children:r("limits.page.subtitle")})]}),e.jsxs("div",{className:"flex items-center gap-2 shrink-0",children:[o.enabled&&o.permissionBlocked?e.jsx(xa,{}):null,e.jsxs(gt,{open:g,onOpenChange:h,children:[e.jsx(ht,{"aria-label":r("limits.page.openSubscriptions"),title:r("limits.page.openSubscriptions"),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 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-oai-brand-500",children:e.jsx(Re,{className:"h-4 w-4","aria-hidden":!0})}),e.jsx(ft,{children:e.jsx(bt,{side:"bottom",align:"end",sideOffset:8,className:"z-50",children:e.jsx(yt,{children:e.jsx(ua,{subscriptions:l,onChanged:T})})})})]}),e.jsx("button",{type:"button",onClick:()=>{o.setEnabled(!o.enabled)},"aria-label":o.enabled?r("limits.alert.disable"):r("limits.alert.enable"),title:o.enabled?r("limits.alert.disable"):r("limits.alert.enable"),className:`inline-flex h-9 w-9 items-center justify-center rounded-lg border border-oai-gray-200 dark:border-oai-gray-800 hover:bg-oai-gray-100 dark:hover:bg-oai-gray-800 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-oai-brand-500 ${o.enabled&&o.permissionBlocked?"text-amber-600 dark:text-amber-400":"text-oai-gray-600 dark:text-oai-gray-400 hover:text-oai-black dark:hover:text-white"}`,children:o.enabled?e.jsx(Nt,{className:"h-4 w-4","aria-hidden":!0}):e.jsx(jt,{className:"h-4 w-4","aria-hidden":!0})}),e.jsx(et,{to:"/settings?section=limits","aria-label":r("limits.page.openSettings"),title:r("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:e.jsx(tt,{className:"h-4 w-4","aria-hidden":!0})})]})]}),s?e.jsx(Dt,{}):e.jsxs(e.Fragment,{children:[i?e.jsx("p",{className:"mb-4 text-sm text-red-500 dark:text-red-400",children:r("shared.error.prefix",{error:i})}):null,d?e.jsx("p",{className:"mb-4 text-sm text-amber-600 dark:text-amber-400",children:r("subscriptions.load_error")}):null,e.jsx(na,{claude:a?.claude,codex:a?.codex,cursor:a?.cursor,gemini:a?.gemini,kimi:a?.kimi,kiro:a?.kiro,grok:a?.grok,antigravity:a?.antigravity,copilot:a?.copilot,zcode:a?.zcode,opencodeGo:a?.opencodeGo,qoder:a?.qoder,qoderCn:a?.qoderCn,codingPlan:a?.codingPlan,agentPlan:a?.agentPlan,order:n.order,visibility:n.visibility,displayMode:n.displayMode,subscriptions:l,showSubscriptions:n.showSubscriptions!==!1})]})]})})})}export{Ha as LimitsPage};
|