tokentracker-cli 0.89.0 → 0.90.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/bin/tracker.js +9 -1
  2. package/dashboard/dist/assets/{AchievementBadge-BpDy2XSt.js → AchievementBadge-BDPa7twL.js} +1 -1
  3. package/dashboard/dist/assets/{AchievementsPage-Z3rNbZAL.js → AchievementsPage-CQoThMTm.js} +2 -2
  4. package/dashboard/dist/assets/{AchievementsSection-Cawmrzgp.js → AchievementsSection-D4Uij6_V.js} +1 -1
  5. package/dashboard/dist/assets/{BadgeDetailModal-D8IPOyzs.js → BadgeDetailModal-DIyhyfZn.js} +1 -1
  6. package/dashboard/dist/assets/{Card-Bco5i8Fn.js → Card-C9Qq3dRv.js} +1 -1
  7. package/dashboard/dist/assets/{ClawdAnimated-RQvg50Wr.js → ClawdAnimated-DvNwXeAg.js} +1 -1
  8. package/dashboard/dist/assets/{CommandPalette-DWLyd7P_.js → CommandPalette-Bx_XQD25.js} +1 -1
  9. package/dashboard/dist/assets/{CommunityStatsModal-DfjsjuRG.js → CommunityStatsModal-CJN0niLH.js} +1 -1
  10. package/dashboard/dist/assets/{ConfirmModal-DNuSWkt3.js → ConfirmModal-CCEwK_z5.js} +1 -1
  11. package/dashboard/dist/assets/{Controls-DdLHdkEz.js → Controls-h-L9P_cI.js} +1 -1
  12. package/dashboard/dist/assets/{DashboardPage-DN54xqEE.js → DashboardPage-lskJQLFc.js} +1 -1
  13. package/dashboard/dist/assets/{DevicePage-ydAtX5oZ.js → DevicePage-CxwatSX3.js} +1 -1
  14. package/dashboard/dist/assets/{DialogClose-C40Az_dd.js → DialogClose-C3z3Trr2.js} +1 -1
  15. package/dashboard/dist/assets/DialogDescription-NmqWPZeZ.js +1 -0
  16. package/dashboard/dist/assets/{DialogTitle-CCg6RvL8.js → DialogTitle-BlKXVRCZ.js} +1 -1
  17. package/dashboard/dist/assets/{FadeIn-a7dOxD0I.js → FadeIn-BWJwSozb.js} +1 -1
  18. package/dashboard/dist/assets/{HeaderGithubStar-DmH6JYQF.js → HeaderGithubStar-iQIqNWX8.js} +1 -1
  19. package/dashboard/dist/assets/{HoverTooltip-D3yTRqfx.js → HoverTooltip-Doqf4LkR.js} +1 -1
  20. package/dashboard/dist/assets/{IpCheckPage-DH4av7RV.js → IpCheckPage-CAQOcumi.js} +1 -1
  21. package/dashboard/dist/assets/{LandingPage-B1fuvkPh.js → LandingPage-C55ZuQ4S.js} +2 -2
  22. package/dashboard/dist/assets/{LeaderboardAvatar-C-tKTfIs.js → LeaderboardAvatar-AwdzkUva.js} +1 -1
  23. package/dashboard/dist/assets/{LeaderboardPage-CL7Cre5j.js → LeaderboardPage-De-XqDgp.js} +2 -2
  24. package/dashboard/dist/assets/{LeaderboardProfileModal-CqRvLdEB.js → LeaderboardProfileModal-Bs1jCBZR.js} +3 -3
  25. package/dashboard/dist/assets/{LeaderboardProfilePage-BDjW5z87.js → LeaderboardProfilePage-B7hvba9_.js} +1 -1
  26. package/dashboard/dist/assets/LimitsPage-bYc_9RQC.js +5 -0
  27. package/dashboard/dist/assets/{LocalOnlyNotice-CQDKfXwB.js → LocalOnlyNotice-BWFxeB2d.js} +1 -1
  28. package/dashboard/dist/assets/{LoginCard-CptsVdtq.js → LoginCard-BEhQV-kF.js} +1 -1
  29. package/dashboard/dist/assets/{LoginModal-8V4Vsgpr.js → LoginModal-BnIpMaiu.js} +1 -1
  30. package/dashboard/dist/assets/{LoginPage-DIwzC_95.js → LoginPage-lOoS6omw.js} +1 -1
  31. package/dashboard/dist/assets/{PetPage-CXSq_C6b.js → PetPage-CBxkB0FQ.js} +1 -1
  32. package/dashboard/dist/assets/{PopoverPopup-C_6kkB4_.js → PopoverPopup-mRFMXjMo.js} +1 -1
  33. package/dashboard/dist/assets/{ProviderIcon-BKGMzdEg.js → ProviderIcon-CYUc_5_Z.js} +1 -1
  34. package/dashboard/dist/assets/{ResetPasswordPage-BThSQVj7.js → ResetPasswordPage-BydyI8Te.js} +1 -1
  35. package/dashboard/dist/assets/{SegmentedControl-DdIw-7OY.js → SegmentedControl-LfSKYbfp.js} +1 -1
  36. package/dashboard/dist/assets/{Select-BuxVjVTV.js → Select-UiEhxqur.js} +1 -1
  37. package/dashboard/dist/assets/{SelectItemText-B7AP9a2t.js → SelectItemText-DiVTS64c.js} +1 -1
  38. package/dashboard/dist/assets/{ServiceStatusPage-Db6XpKGJ.js → ServiceStatusPage-krg3Du1w.js} +1 -1
  39. package/dashboard/dist/assets/{SessionsPage-CIvvinQm.js → SessionsPage-D28m0rcm.js} +1 -1
  40. package/dashboard/dist/assets/SettingsPage-DiVhaU-X.js +2 -0
  41. package/dashboard/dist/assets/{SkillsPage-2rr2nzvc.js → SkillsPage-CXg55JZ3.js} +1 -1
  42. package/dashboard/dist/assets/{TokenGalaxy-WS2JBmzs.js → TokenGalaxy-CymWb45G.js} +1 -1
  43. package/dashboard/dist/assets/{ToolbarRootContext-B5s-ucZR.js → ToolbarRootContext-D8SpeV_Z.js} +1 -1
  44. package/dashboard/dist/assets/{TrendMonitor-DfgZi0b3.js → TrendMonitor-ZI8UVyUl.js} +1 -1
  45. package/dashboard/dist/assets/{WidgetsPage-WWaK3S0S.js → WidgetsPage-3HI5iI7R.js} +1 -1
  46. package/dashboard/dist/assets/{WrappedPage-C3C85NLm.js → WrappedPage-BK8eyxWF.js} +1 -1
  47. package/dashboard/dist/assets/{__vite-browser-external-B-CAZ5HB.js → __vite-browser-external-B7TLlrta.js} +63 -18
  48. package/dashboard/dist/assets/{agent-logos-Do1kFgsi.js → agent-logos-BVrhjlzq.js} +1 -1
  49. package/dashboard/dist/assets/{arrow-up-right-DbomORWZ.js → arrow-up-right-BH3-SjFz.js} +1 -1
  50. package/dashboard/dist/assets/{check-DzEvx9pJ.js → check-B9cFJZgF.js} +1 -1
  51. package/dashboard/dist/assets/{chevron-right-DZTnF2NM.js → chevron-right-Bo86g4wO.js} +1 -1
  52. package/dashboard/dist/assets/{copy-BS7rQ_jR.js → copy-j7Scp8t1.js} +1 -1
  53. package/dashboard/dist/assets/{download-DlWVR14_.js → download-BUt01rg_.js} +1 -1
  54. package/dashboard/dist/assets/{external-link-CtVBRLbf.js → external-link-DzxpdqJI.js} +1 -1
  55. package/dashboard/dist/assets/{flame-Bd3FUTdZ.js → flame-CkRd9KBe.js} +1 -1
  56. package/dashboard/dist/assets/{format-tokens--QLNTkZB.js → format-tokens-B1pCqj3T.js} +1 -1
  57. package/dashboard/dist/assets/{icons-Cs8SXqmU.js → icons-DbEfSumr.js} +1 -1
  58. package/dashboard/dist/assets/{index-Cj7qHXa4.js → index-3-T0VHz-.js} +1 -1
  59. package/dashboard/dist/assets/{index-DoTYGePn.js → index-5a1G4YuE.js} +1 -1
  60. package/dashboard/dist/assets/{index-CfS3tuU1.js → index-CSGxiVQp.js} +1 -1
  61. package/dashboard/dist/assets/{info-CsAt6S8y.js → info-nIQW2hmu.js} +1 -1
  62. package/dashboard/dist/assets/limits-providers-DUfDGI3w.js +1 -0
  63. package/dashboard/dist/assets/{link-2-CjC85wrH.js → link-2-BIma2gRd.js} +1 -1
  64. package/dashboard/dist/assets/{loader-circle-Cf0h8jN7.js → loader-circle-DNwHxZy4.js} +1 -1
  65. package/dashboard/dist/assets/{maximize-2-DSLJns7Q.js → maximize-2-RnscHIM8.js} +1 -1
  66. package/dashboard/dist/assets/{modifiers.esm-2DRBUt-i.js → modifiers.esm-Blvm8Jbj.js} +1 -1
  67. package/dashboard/dist/assets/{monitor-smartphone-DitUxFt7.js → monitor-smartphone-BH-q52Ze.js} +1 -1
  68. package/dashboard/dist/assets/{provider-display-Dm_uiVV1.js → provider-display-C_BMuv2U.js} +1 -1
  69. package/dashboard/dist/assets/{react-CExpcnBO.js → react-CsQaHrby.js} +1 -1
  70. package/dashboard/dist/assets/{search-S2Q8oj2Y.js → search-DlK17ul0.js} +1 -1
  71. package/dashboard/dist/assets/{skills-api-C3mlKc8x.js → skills-api-DaCUcoqM.js} +1 -1
  72. package/dashboard/dist/assets/{sortable.esm-22qRLWIc.js → sortable.esm-CJh9Zk1m.js} +1 -1
  73. package/dashboard/dist/assets/{store-DktMCl4T.js → store-DByB-W50.js} +1 -1
  74. package/dashboard/dist/assets/{terminal-DS6Tqgok.js → terminal-C5HhEMI5.js} +1 -1
  75. package/dashboard/dist/assets/{trash-2-BHgzn2Bd.js → trash-2-9Vxl6ZF4.js} +1 -1
  76. package/dashboard/dist/assets/{use-community-stats-DqQQKHPK.js → use-community-stats-DTQlvI-1.js} +1 -1
  77. package/dashboard/dist/assets/{use-limits-display-prefs-C2fbOm_s.js → use-limits-display-prefs-Du018pOW.js} +1 -1
  78. package/dashboard/dist/assets/{use-ordered-list-BnIpnofG.js → use-ordered-list-D5RWUoYn.js} +1 -1
  79. package/dashboard/dist/assets/use-reduced-motion-BsIV3-9R.js +1 -0
  80. package/dashboard/dist/assets/{use-session-efficiency-pref-B78vQ2pp.js → use-session-efficiency-pref-fttmU-6p.js} +1 -1
  81. package/dashboard/dist/assets/{use-transform-DJeSBZmb.js → use-transform-BErbwrSs.js} +1 -1
  82. package/dashboard/dist/assets/{use-usage-limits-BkSQGzCV.js → use-usage-limits-C6Npx5q3.js} +1 -1
  83. package/dashboard/dist/assets/{useCurrency-BY7ZJ-XD.js → useCurrency-DAj-AqX-.js} +1 -1
  84. package/dashboard/dist/assets/{useScrollLock-CHsj-WN5.js → useScrollLock-BhgbzYuS.js} +1 -1
  85. package/dashboard/dist/assets/{useTokenFormat-CVJJAs3R.js → useTokenFormat-jEoapvgD.js} +1 -1
  86. package/dashboard/dist/assets/{zap-Dtudxu92.js → zap-uQ4fo5lp.js} +1 -1
  87. package/dashboard/dist/brand-logos/volcano-ark.svg +14 -0
  88. package/dashboard/dist/index.html +1 -1
  89. package/dashboard/dist/ip-check.html +1 -1
  90. package/dashboard/dist/leaderboard.html +1 -1
  91. package/dashboard/dist/share.html +1 -1
  92. package/package.json +1 -1
  93. package/src/commands/status.js +3 -3
  94. package/src/lib/ark-coding-plan-limits.js +462 -0
  95. package/src/lib/command-runner.js +286 -0
  96. package/src/lib/cursor-config.js +84 -86
  97. package/src/lib/fs.js +11 -2
  98. package/src/lib/local-api.js +137 -0
  99. package/src/lib/pricing/seed-snapshot.json +1 -1
  100. package/src/lib/proxy-env.js +397 -44
  101. package/src/lib/proxy-settings.js +163 -0
  102. package/src/lib/rollout.js +80 -39
  103. package/src/lib/usage-limits.js +40 -142
  104. package/dashboard/dist/assets/DialogDescription-CNfc42U-.js +0 -1
  105. package/dashboard/dist/assets/LimitsPage-D533J_we.js +0 -4
  106. package/dashboard/dist/assets/SettingsPage-DZo5FGJE.js +0 -1
  107. package/dashboard/dist/assets/limits-providers-Czh_yu22.js +0 -1
  108. package/dashboard/dist/assets/use-reduced-motion-oDsUC_PJ.js +0 -1
@@ -16418,6 +16418,38 @@ function resolveDshHome(env = process.env) {
16418
16418
  return path.join(os.homedir(), ".dsh");
16419
16419
  }
16420
16420
 
16421
+ // Windows users commonly run Harness inside WSL while TokenTracker itself runs
16422
+ // natively. Respect the repository-wide WSL mode contract and keep explicit
16423
+ // DSH home overrides authoritative: an override is a complete user choice, not
16424
+ // one half of an automatic native/WSL discovery pair.
16425
+ function resolveDshHomes(env = process.env, deps = {}) {
16426
+ const overridden = Boolean(
16427
+ (typeof env?.TOKENTRACKER_DSH_HOME === "string" && env.TOKENTRACKER_DSH_HOME.trim()) ||
16428
+ (typeof env?.DSH_HOME === "string" && env.DSH_HOME.trim()),
16429
+ );
16430
+ const nativeHome = deps.nativeHome || resolveDshHome(env);
16431
+ const platform = deps.platform || process.platform;
16432
+ if (overridden || platform !== "win32") return [nativeHome];
16433
+
16434
+ const existsSync = deps.existsSync || fssync.existsSync;
16435
+ let nativeValue = null;
16436
+ try {
16437
+ if (existsSync(nativeHome)) nativeValue = nativeHome;
16438
+ } catch (_error) {}
16439
+
16440
+ const discoverWslHome = deps.discoverWslHome || wsl.discoverWslHome;
16441
+ const wslValue = wsl.shouldProbeWsl(env)
16442
+ ? discoverWslHome(".dsh", { ...deps, env })
16443
+ : null;
16444
+ const resolved = wsl.resolveAllWin32Paths({
16445
+ nativeValue,
16446
+ wslValue,
16447
+ env,
16448
+ platform,
16449
+ });
16450
+ return [...new Set([resolved.native, resolved.wsl].filter(Boolean))];
16451
+ }
16452
+
16421
16453
  function isDshSessionLogName(name) {
16422
16454
  return name === "session.jsonl" || name === "session.jsonl.zstd";
16423
16455
  }
@@ -16425,47 +16457,55 @@ function isDshSessionLogName(name) {
16425
16457
  // Walk the harness sessions root for per-session log artifacts. The tree is
16426
16458
  // `<sessions-root>/<project-key>/<session-id>/session.jsonl[.zstd]`; only the
16427
16459
  // exact leaf names are collected so unrelated harness files are ignored.
16428
- async function resolveDshSessionFiles(env = process.env) {
16429
- const sessionsRoot = path.join(resolveDshHome(env), "sessions");
16460
+ async function resolveDshSessionFiles(env = process.env, deps = {}) {
16430
16461
  const out = [];
16431
- const projects = await safeReadDir(sessionsRoot);
16432
- for (const project of projects) {
16433
- if (!project.isDirectory()) continue;
16434
- const projectDir = path.join(sessionsRoot, project.name);
16435
- const sessions = await safeReadDir(projectDir);
16436
- for (const session of sessions) {
16437
- if (!session.isDirectory()) continue;
16438
- const sessionDir = path.join(projectDir, session.name);
16439
- const artifacts = await safeReadDir(sessionDir);
16440
- const transcripts = artifacts.filter(
16441
- (artifact) => artifact.isFile() && isDshSessionLogName(artifact.name),
16442
- );
16443
- if (transcripts.length === 1) {
16444
- out.push(path.join(sessionDir, transcripts[0].name));
16445
- } else if (transcripts.length > 1) {
16446
- // Harness itself rejects mixed encodings in one root. For a passive
16447
- // reader, choose the actively-written artifact instead of counting the
16448
- // same session twice; a tie prefers the default zstd encoding.
16449
- const ranked = await Promise.all(transcripts.map(async (artifact) => {
16450
- const full = path.join(sessionDir, artifact.name);
16451
- const handle = await fs.open(full, "r").catch(() => null);
16452
- if (!handle) return { full, name: artifact.name, mtimeMs: 0 };
16453
- try {
16454
- const stat = await handle.stat().catch(() => null);
16455
- return {
16456
- full,
16457
- name: artifact.name,
16458
- mtimeMs: stat?.isFile() ? Number(stat.mtimeMs || 0) : 0,
16459
- };
16460
- } finally {
16461
- await handle.close().catch(() => {});
16462
- }
16463
- }));
16464
- ranked.sort((left, right) =>
16465
- right.mtimeMs - left.mtimeMs ||
16466
- Number(right.name.endsWith(".zstd")) - Number(left.name.endsWith(".zstd")),
16462
+ const seen = new Set();
16463
+ for (const dshHome of resolveDshHomes(env, deps)) {
16464
+ const sessionsRoot = path.join(dshHome, "sessions");
16465
+ const projects = await safeReadDir(sessionsRoot);
16466
+ for (const project of projects) {
16467
+ if (!project.isDirectory()) continue;
16468
+ const projectDir = path.join(sessionsRoot, project.name);
16469
+ const sessions = await safeReadDir(projectDir);
16470
+ for (const session of sessions) {
16471
+ if (!session.isDirectory()) continue;
16472
+ const sessionDir = path.join(projectDir, session.name);
16473
+ const artifacts = await safeReadDir(sessionDir);
16474
+ const transcripts = artifacts.filter(
16475
+ (artifact) => artifact.isFile() && isDshSessionLogName(artifact.name),
16467
16476
  );
16468
- if (ranked[0]) out.push(ranked[0].full);
16477
+ let selected = null;
16478
+ if (transcripts.length === 1) {
16479
+ selected = path.join(sessionDir, transcripts[0].name);
16480
+ } else if (transcripts.length > 1) {
16481
+ // Harness itself rejects mixed encodings in one root. For a passive
16482
+ // reader, choose the actively-written artifact instead of counting the
16483
+ // same session twice; a tie prefers the default zstd encoding.
16484
+ const ranked = await Promise.all(transcripts.map(async (artifact) => {
16485
+ const full = path.join(sessionDir, artifact.name);
16486
+ const handle = await fs.open(full, "r").catch(() => null);
16487
+ if (!handle) return { full, name: artifact.name, mtimeMs: 0 };
16488
+ try {
16489
+ const stat = await handle.stat().catch(() => null);
16490
+ return {
16491
+ full,
16492
+ name: artifact.name,
16493
+ mtimeMs: stat?.isFile() ? Number(stat.mtimeMs || 0) : 0,
16494
+ };
16495
+ } finally {
16496
+ await handle.close().catch(() => {});
16497
+ }
16498
+ }));
16499
+ ranked.sort((left, right) =>
16500
+ right.mtimeMs - left.mtimeMs ||
16501
+ Number(right.name.endsWith(".zstd")) - Number(left.name.endsWith(".zstd")),
16502
+ );
16503
+ selected = ranked[0]?.full || null;
16504
+ }
16505
+ if (selected && !seen.has(selected)) {
16506
+ seen.add(selected);
16507
+ out.push(selected);
16508
+ }
16469
16509
  }
16470
16510
  }
16471
16511
  }
@@ -17188,6 +17228,7 @@ module.exports = {
17188
17228
  readTraeEntitlementFromStorage,
17189
17229
  // DeepSeek Harness (dsh) — passive session-log reader
17190
17230
  resolveDshHome,
17231
+ resolveDshHomes,
17191
17232
  resolveDshSessionFiles,
17192
17233
  readDshSessionText,
17193
17234
  decodeDshZstd,
@@ -29,8 +29,14 @@ const { fetchGrokLimits } = require("./grok-limits");
29
29
  const { fetchZcodeLimits } = require("./zcode-limits");
30
30
  const { fetchOpencodeGoLimits } = require("./opencode-go-limits");
31
31
  const { fetchQoderLimits, fetchQoderCnLimits } = require("./qoder-limits");
32
+ const { fetchArkCodingPlanLimits } = require("./ark-coding-plan-limits");
32
33
  const { fetchProviderServiceStatus } = require("./provider-status");
33
34
  const { readSqliteJsonRows, readSqliteJsonRowsAsync } = require("./sqlite-reader");
35
+ const {
36
+ runCommand,
37
+ whichBinary,
38
+ isBinaryAvailable,
39
+ } = require("./command-runner");
34
40
 
35
41
  const execFileAsync = promisify(cp.execFile);
36
42
 
@@ -147,6 +153,17 @@ function withProviderTimeout(promise, label, timeoutMs) {
147
153
  return Promise.race([promise, timeout]).finally(() => clearTimeout(timer));
148
154
  }
149
155
 
156
+ // Provider timeouts normally race a promise so that an uncooperative remote
157
+ // request cannot block all limit reads. Local CLI providers also need an abort
158
+ // signal: without it, their spawned commands may continue after the caller has
159
+ // already received a timeout result.
160
+ function withAbortableProviderTimeout(start, label, timeoutMs) {
161
+ if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) return start(undefined);
162
+ const controller = new AbortController();
163
+ return withProviderTimeout(start(controller.signal), label, timeoutMs)
164
+ .finally(() => controller.abort());
165
+ }
166
+
150
167
  function parseRetryAfterSeconds(headers) {
151
168
  const ra = headers?.get ? headers.get("retry-after") : null;
152
169
  const sec = ra ? Number.parseInt(ra, 10) : NaN;
@@ -953,8 +970,7 @@ const GEMINI_CLI_FALLBACK_OAUTH_CLIENT = Object.freeze({
953
970
  });
954
971
 
955
972
  async function extractGeminiOauthClientCredentials({ commandRunner, home } = {}) {
956
- const result = await runCommand(commandRunner, "which", ["gemini"], { timeout: 2000 });
957
- const geminiPath = typeof result?.stdout === "string" ? result.stdout.trim() : "";
973
+ const geminiPath = (await whichBinary("gemini", { commandRunner })) ?? "";
958
974
 
959
975
  const geminiPaths = [
960
976
  ...(geminiPath ? [geminiPath] : []),
@@ -1228,145 +1244,10 @@ async function fetchGeminiLimits({ home, env, fetchImpl = fetch, commandRunner }
1228
1244
  }
1229
1245
  }
1230
1246
 
1231
- // Async command runner. Previously this wrapped `cp.spawnSync`, which blocked the
1232
- // Node event loop for the full command duration (up to 20s for Kiro) and froze every
1233
- // other local-api endpoint plus the other providers' withProviderTimeout races.
1234
- // Returns a promise for a spawnSync-shaped result: { status, stdout, stderr, error? }.
1235
- // Injected runners (tests) may stay synchronous — their return value is wrapped in
1236
- // Promise.resolve so both sync and async runners work.
1237
- function runCommand(commandRunner, command, args, options = {}) {
1238
- const merged = {
1239
- encoding: "utf8",
1240
- maxBuffer: 10 * 1024 * 1024,
1241
- ...options,
1242
- };
1243
- if (typeof commandRunner === "function") {
1244
- return Promise.resolve(commandRunner(command, args, merged));
1245
- }
1246
-
1247
- const {
1248
- timeout,
1249
- maxBuffer,
1250
- completeWhen,
1251
- completionGraceMs = 250,
1252
- killProcessGroup = false,
1253
- ...spawnOptions
1254
- } = merged;
1255
- return new Promise((resolve) => {
1256
- let child;
1257
- const useProcessGroup =
1258
- killProcessGroup && process.platform !== "win32";
1259
- try {
1260
- child = cp.spawn(command, args, {
1261
- ...spawnOptions,
1262
- detached: useProcessGroup || spawnOptions.detached,
1263
- stdio: ["ignore", "pipe", "pipe"],
1264
- });
1265
- } catch (error) {
1266
- resolve({ status: null, stdout: "", stderr: "", error });
1267
- return;
1268
- }
1269
-
1270
- let stdout = "";
1271
- let stderr = "";
1272
- let settled = false;
1273
- let timedOut = false;
1274
- let timer = null;
1275
- let hardTimer = null;
1276
- let completionTimer = null;
1277
-
1278
- const settle = ({ status = null, error = null } = {}) => {
1279
- if (settled) return;
1280
- settled = true;
1281
- if (timer) clearTimeout(timer);
1282
- if (hardTimer) clearTimeout(hardTimer);
1283
- if (completionTimer) clearTimeout(completionTimer);
1284
- let finalError = error;
1285
- if (!finalError && timedOut) {
1286
- finalError = new Error(`spawn ${command} ETIMEDOUT`);
1287
- finalError.code = "ETIMEDOUT";
1288
- }
1289
- const result = { status, stdout, stderr };
1290
- if (finalError) result.error = finalError;
1291
- resolve(result);
1292
- };
1293
-
1294
- const signalChild = (signal) => {
1295
- try {
1296
- if (useProcessGroup && Number.isInteger(child.pid)) {
1297
- process.kill(-child.pid, signal);
1298
- } else {
1299
- child.kill(signal);
1300
- }
1301
- } catch (_error) {}
1302
- };
1303
-
1304
- const stopChild = ({ timeoutExpired = false } = {}) => {
1305
- if (settled) return;
1306
- if (timeoutExpired) timedOut = true;
1307
- signalChild("SIGTERM");
1308
- // Guarantee settlement even if the process group ignores SIGTERM or
1309
- // keeps inherited stdio open.
1310
- hardTimer = setTimeout(() => {
1311
- signalChild("SIGKILL");
1312
- settle({ status: null });
1313
- }, 1000);
1314
- if (typeof hardTimer.unref === "function") hardTimer.unref();
1315
- };
1316
-
1317
- if (Number.isFinite(timeout) && timeout > 0) {
1318
- timer = setTimeout(() => {
1319
- stopChild({ timeoutExpired: true });
1320
- }, timeout);
1321
- }
1322
-
1323
- const scheduleCompletion = () => {
1324
- if (typeof completeWhen !== "function" || settled) return;
1325
- let complete = false;
1326
- try {
1327
- complete = Boolean(completeWhen(stdout, stderr));
1328
- } catch (_error) {}
1329
- if (!complete) return;
1330
- if (completionTimer) clearTimeout(completionTimer);
1331
- completionTimer = setTimeout(
1332
- () => stopChild(),
1333
- Math.max(0, Number(completionGraceMs) || 0),
1334
- );
1335
- };
1336
-
1337
- const collect = (stream, append) => {
1338
- if (!stream) return;
1339
- stream.setEncoding("utf8");
1340
- stream.on("data", (chunk) => {
1341
- append(chunk);
1342
- if (stdout.length + stderr.length > maxBuffer) {
1343
- const error = new Error(`spawn ${command} maxBuffer length exceeded`);
1344
- error.code = "ERR_CHILD_PROCESS_STDIO_MAXBUFFER";
1345
- signalChild("SIGKILL");
1346
- settle({ status: null, error });
1347
- return;
1348
- }
1349
- scheduleCompletion();
1350
- });
1351
- };
1352
- collect(child.stdout, (chunk) => { stdout += chunk; });
1353
- collect(child.stderr, (chunk) => { stderr += chunk; });
1354
-
1355
- child.on("error", (error) => settle({ status: null, error }));
1356
- child.on("close", (code) => settle({ status: timedOut ? null : code }));
1357
- });
1358
- }
1359
-
1360
- async function whichBinary(binary, { commandRunner } = {}) {
1361
- const result = await runCommand(commandRunner, "which", [binary], { timeout: 2000 });
1362
- if (result?.error || result?.status !== 0) return null;
1363
- const stdout = typeof result?.stdout === "string" ? result.stdout.trim() : "";
1364
- return stdout ? stdout.split("\n")[0] : null;
1365
- }
1366
-
1367
- async function isBinaryAvailable(binary, { commandRunner } = {}) {
1368
- return (await whichBinary(binary, { commandRunner })) !== null;
1369
- }
1247
+ // runCommand / whichBinary / isBinaryAvailable now live in ./command-runner
1248
+ // (shared with ark-coding-plan-limits.js). The async runner there keeps the
1249
+ // same spawnSync-shaped contract: { status, stdout, stderr, error? }, and
1250
+ // injected test runners may stay synchronous.
1370
1251
 
1371
1252
  function stripAnsi(text) {
1372
1253
  return String(text || "").replace(/\x1B\[[0-9;?]*[A-Za-z]|\x1B\].*?\x07/g, "");
@@ -3182,7 +3063,7 @@ async function fetchUsageLimitsUncached({
3182
3063
  : null;
3183
3064
 
3184
3065
  const providerFetch = withFetchTimeout(fetchImpl, providerTimeoutMs);
3185
- const [claudeResult, codexResult, cursor, kimi, gemini, kiro, antigravity, copilot, grok, zcode, opencodeGo, qoder, qoderCn, claudeServiceStatus] = await Promise.all([
3066
+ const [claudeResult, codexResult, cursor, kimi, gemini, kiro, antigravity, copilot, grok, zcode, opencodeGo, qoder, qoderCn, codingPlan, claudeServiceStatus] = await Promise.all([
3186
3067
  claudeToken && !freshClaudeCache && !claudeRetryAtMs
3187
3068
  ? withProviderTimeout(fetchClaudeUsageLimits(claudeToken, { fetchImpl: providerFetch, maxAttempts: 1 }), "Claude", providerTimeoutMs).then(
3188
3069
  (value) => ({ status: "fulfilled", value }),
@@ -3238,6 +3119,22 @@ async function fetchUsageLimitsUncached({
3238
3119
  "Qoder CN",
3239
3120
  providerTimeoutMs,
3240
3121
  ).catch((reason) => ({ configured: true, error: reason?.message || "Unknown error" })),
3122
+ // Ark Coding Plan (火山方舟): subscription quota via the user's own
3123
+ // arkcli binary. No token-consumption source — consumption for the
3124
+ // compatible CLIs is already counted from their local files; this only
3125
+ // surfaces the 5h/week/month quota percentages.
3126
+ withAbortableProviderTimeout(
3127
+ (signal) => fetchArkCodingPlanLimits({
3128
+ commandRunner,
3129
+ home,
3130
+ nowMs,
3131
+ platform,
3132
+ signal,
3133
+ providerTimeoutMs,
3134
+ }),
3135
+ "Ark Coding Plan",
3136
+ providerTimeoutMs,
3137
+ ).catch((reason) => ({ configured: true, error: reason?.message || "Unknown error" })),
3241
3138
  // Public status-page probe (fail-soft, own 5-min cache in provider-status.js).
3242
3139
  // Only probed for configured accounts — without a token the Claude section
3243
3140
  // never renders, so the reading would have nowhere to go.
@@ -3398,6 +3295,7 @@ async function fetchUsageLimitsUncached({
3398
3295
  opencodeGo: withPlanLabel(opencodeGo, opencodeGo?.plan_label, "OpenCode Go"),
3399
3296
  qoder: withPlanLabel(qoder, qoder?.plan_label, "Qoder"),
3400
3297
  qoderCn: withPlanLabel(qoderCn, qoderCn?.plan_label, "Qoder CN"),
3298
+ codingPlan: withPlanLabel(codingPlan, codingPlan?.plan_label, "Ark Coding Plan"),
3401
3299
  };
3402
3300
 
3403
3301
  for (const [providerName, provider] of Object.entries(data)) {
@@ -1 +0,0 @@
1
- import{r as n,z as a}from"./__vite-browser-external-B-CAZ5HB.js";import{u as p}from"./DialogTitle-CCg6RvL8.js";import{u as c}from"./useScrollLock-CHsj-WN5.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,4 +0,0 @@
1
- import{m as B,j as a,e as W,c as r,k as U,r as h,ac as ie,d as re,J as ne,L as oe,ad as se,q as le,ae as ce}from"./__vite-browser-external-B-CAZ5HB.js";import{m as F}from"./react-CExpcnBO.js";import{P as O,c as de,r as M,a as ue,u as me,b as xe,s as pe}from"./use-usage-limits-BkSQGzCV.js";import{L as m,u as ge}from"./use-limits-display-prefs-C2fbOm_s.js";import{C as q}from"./Card-Bco5i8Fn.js";import{F as fe}from"./FadeIn-a7dOxD0I.js";import{L as he,l as v,a as be}from"./limits-providers-Czh_yu22.js";import{P as ye}from"./ProviderIcon-BKGMzdEg.js";import{H as ke}from"./HoverTooltip-D3yTRqfx.js";import{L as ve}from"./LocalOnlyNotice-CQDKfXwB.js";import{u as je}from"./use-reduced-motion-oDsUC_PJ.js";import"./arrow-up-right-DbomORWZ.js";import"./download-DlWVR14_.js";const _e=[["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"}]],Ne=B("bell-off",_e);const we=[["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"}]],Me=B("bell",we),Ee=[3,2,3,3,2,2,3];function g({className:e}){return a.jsx("div",{className:W("rounded bg-oai-gray-200/70 dark:bg-oai-gray-800/70 animate-pulse",e)})}function Ie(){return a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(g,{className:"h-3 w-12 shrink-0"}),a.jsx(g,{className:"flex-1 h-1.5 rounded-full min-w-0"}),a.jsx(g,{className:"h-3 w-[30px] shrink-0"}),a.jsx(g,{className:"h-3 w-6 shrink-0"})]})}function Le({bars:e,index:t}){const i=t%3===0?"w-24":t%3===1?"w-20":"w-[4.5rem]";return a.jsxs("div",{className:"flex flex-col gap-1.5",children:[a.jsxs("div",{className:"flex items-center gap-1.5",children:[a.jsx(g,{className:"h-[14px] w-[14px] rounded shrink-0"}),a.jsx(g,{className:W("h-4",i)})]}),Array.from({length:e},(o,n)=>a.jsx(Ie,{},n))]})}function Pe(){return a.jsx(q,{children:a.jsxs("div",{className:"flex flex-col gap-3",children:[a.jsx(g,{className:"h-3.5 w-28"}),Ee.map((e,t)=>a.jsx(Le,{bars:e,index:t},t))]})})}const S=100;function G(e){const t=Date.parse(e);return Number.isFinite(t)?t:null}function Oe(e){return Math.max(0,Math.min(S,Math.round(e)))}function Se(e){return new Intl.DateTimeFormat(U(),{month:"numeric",day:"numeric",hour:"2-digit",minute:"2-digit",hour12:!1}).format(new Date(e))}function Ce(e,t,i){if(e==null||e>=t)return S;const o=t-e,n=t-i;return Oe(n/o*S)}function Re(e){const t=e.available_count;return t===null?null:Number.isInteger(t)&&t>=0?t:void 0}function Te(e,{now:t}={}){if(!e||typeof e!="object")return null;const i=Re(e);if(i===void 0)return null;const o=Array.isArray(e.credits)?e.credits:[],n=t instanceof Date?t.getTime():Number(t??Date.now()),s=[];for(const d of o){const c=G(d?.expires_at);if(c==null)continue;const l=s.length+1;s.push({key:`reset-${l}`,label:r("limits.codex_reset_bank.row_label",{index:l}),expiresAt:Se(c),expiresMs:c,percent:Ce(G(d?.granted_at),c,n)})}return i===0?null:s.length>0?{kind:"rows",availableCount:i??s.length,rows:s}:i>0?{kind:"count_only",availableCount:i,rows:[]}:null}const Ae="shrink-0 text-oai-black dark:text-oai-white";function De(e){const t=M(e);if(!Number.isFinite(t))return null;const i=t-Date.now();if(i<=0)return r("shared.time.now");const o=Math.floor(i/6e4);if(o<60)return`${o}m`;const n=Math.floor(o/60);return n<24?`${n}h`:`${Math.floor(n/24)}d`}function Fe(e,t){const i=t===m.REMAINING?100-e:e;return i>=90?"bg-red-500":i>=70?"bg-amber-500":"bg-emerald-500"}function w(e,t="used_percent"){return e?t==="utilization"?e.utilization:e.used_percent:null}function E(e,t="reset_at"){return e?t==="resets_at"?e.resets_at:e.reset_at:null}function L(e){const t=Math.max(0,Math.min(100,Number(e)||0)),i=Math.round(t);return t>0&&i===0?r("limits.bar.sub_one_percent"):String(i)}function _(e,{useGrouping:t=!0,maximumFractionDigits:i}={}){const o=Number(e);return Number.isFinite(o)?new Intl.NumberFormat(void 0,{minimumFractionDigits:0,maximumFractionDigits:i??(o>=100?0:2),useGrouping:t}).format(o):null}function Ge(e){if(!e||typeof e!="object"||!(Number(e.limit_credits)>0))return null;const t={useGrouping:e.unit!=="calls"},i=_(e.used_credits,t),o=_(e.limit_credits,t),n=_(e.remaining_credits,t);if(!i||!o||!n)return null;const s=e.unit==="calls"?"limits.qoder_calls.detail":"limits.codex_credits.detail";return r(s,{used:i,limit:o,remaining:n})}function He(e,t){return de({usedPercent:w(e.window,e.pctField),windowSeconds:ue(e,e.window),resetMs:M(E(e.window,e.resetField)),mode:t})}function K(e){return Number.isFinite(e)?new Intl.DateTimeFormat(U(),{month:"numeric",day:"numeric",hour:"2-digit",minute:"2-digit",hour12:!1}).format(new Date(e)):null}function $e(e,t,i){const o=[V(e,t,i)],n=M(E(e.window,e.resetField)),s=K(n);s&&o.push(r(e.timeKind==="expiry"?"limits.hover.expires_at":"limits.hover.resets_at",{time:s}));const d=Ge(e.window);return d&&o.push(d),o.join(`
2
- `)}const z=ke;function Be({label:e,pct:t,reset:i,mode:o=m.USED,pacePercent:n=null,paceOver:s=!1,title:d=null}){const c=Math.max(0,Math.min(100,Number(t)||0)),l=o===m.REMAINING?100-c:c,u=Math.round(l),x=l>0&&u===0?Math.max(l,.35):l;let k=String(u);l>0&&u===0&&(k=r("limits.bar.sub_one_percent"));const b=n==null?null:Math.max(0,Math.min(100,n));return a.jsxs("div",{className:"group relative flex items-center gap-2",children:[a.jsx(z,{text:d}),a.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:e}),a.jsxs("div",{className:"relative flex-1 bg-oai-gray-100 dark:bg-oai-gray-700/50 rounded-full h-1.5 overflow-hidden",children:[a.jsx("div",{className:`${Fe(l,o)} rounded-full h-full transition-[width] duration-500 ease-out`,style:{width:`${x}%`,minWidth:l>0?"3px":0}}),b!=null&&a.jsxs(a.Fragment,{children:[a.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"}}),a.jsx("div",{className:`absolute top-0 h-full ${s?"bg-red-500":"bg-emerald-500"}`,style:{left:`calc(${b}% - 1px)`,width:"2px"}})]})]}),a.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:[k,"%"]}),i&&a.jsx("span",{className:"text-[10px] text-oai-gray-400 dark:text-oai-gray-500 w-6 text-right shrink-0",children:i})]})}function V(e,t,i){const o=e.label??r(e.labelKey),n=i===m.REMAINING,s=l=>n?100-l:l;if(t.expectedPercent==null){const l=Math.max(0,Math.min(100,Number(w(e.window,e.pctField))||0)),u=L(s(l));return n?r("limits.explain.remaining",{label:o,used:u}):r("limits.explain.used",{label:o,used:u})}if(t.paceOver){if(t.runsOutEta)return r("limits.explain.ahead_eta",{label:o,eta:t.runsOutEta});const l=L(s(t.projectedEnd??100));return r(n?"limits.explain.ahead_pct_remaining":"limits.explain.ahead_pct",{label:o,pct:l})}const d=Math.max(0,Math.min(100,Number(w(e.window,e.pctField))||0)),c=L(s(t.projectedEnd??d));return r(n?"limits.explain.on_track_remaining":"limits.explain.on_track",{label:o,pct:c})}function We({pace:e}){return e.pacePercent!=null}function Ue({rows:e,mode:t}){if(e.length===0)return null;const i=t===m.REMAINING,o=e.some(We);return a.jsxs("div",{className:"mt-1 flex flex-col gap-1",children:[e.map(({spec:n,pace:s})=>{const d=K(M(E(n.window,n.resetField)));return a.jsxs("div",{className:"text-[11px] leading-snug text-oai-gray-600 dark:text-oai-gray-300",children:[V(n,s,t),d?a.jsxs("span",{className:"text-oai-gray-400 dark:text-oai-gray-500",children:[" · ",r(n.timeKind==="expiry"?"limits.hover.expires_at":"limits.hover.resets_at",{time:d})]}):null]},n.key)}),o?a.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(i?"limits.explain.body_remaining":"limits.explain.body")}):null]})}function j(e){if(!e)return null;const t=Date.now()-new Date(e).getTime();if(t<0)return null;const i=Math.floor(t/6e4);if(i<1)return r("shared.time.now");if(i<60)return r("shared.time.m_ago",{n:i});const o=Math.floor(i/60);if(o<24)return r("shared.time.h_ago",{n:o});const n=Math.floor(o/24);return r("shared.time.d_ago",{n})}const H={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"}},qe={claude:"claude",codex:"codex"};function y({label:e,age:t=null,tone:i="live",tooltip:o=null}){const n=H[i]||H.live,s=i==="live";return a.jsxs("div",{className:"relative inline-flex items-center group cursor-help ml-1",onClick:d=>d.stopPropagation(),children:[a.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:[s?a.jsxs("span",{className:"relative flex h-1.5 w-1.5",children:[a.jsx("span",{className:`animate-ping absolute inline-flex h-full w-full rounded-full ${n.pulse} opacity-75`}),a.jsx("span",{className:`relative inline-flex rounded-full h-1.5 w-1.5 ${n.dot}`})]}):a.jsx("span",{className:`h-1.5 w-1.5 rounded-full ${n.dot}`}),e,t?a.jsxs(a.Fragment,{children:[" · ",t]}):null]}),o?a.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:[o,a.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 N({name:e,providerId:t,children:i,expandable:o=!1,expanded:n=!1,onToggle:s,badge:d=null}){const c=be(t),l=a.jsxs("div",{className:"flex items-center gap-1.5",children:[c?a.jsx(ye,{provider:c,size:14,className:Ae}):null,a.jsx("span",{className:"text-sm font-medium text-oai-black dark:text-oai-white",children:e}),d]});return o?a.jsxs("div",{role:"button",tabIndex:0,"aria-expanded":n,onClick:s,onKeyDown:u=>{(u.key==="Enter"||u.key===" ")&&(u.preventDefault(),s?.())},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:[l,i]}):a.jsxs("div",{className:"flex flex-col gap-1.5",children:[l,i]})}const Ke=he;function f({children:e,tone:t="neutral"}){const i=t==="error"?"text-red-600 dark:text-red-400":"text-oai-gray-500 dark:text-oai-gray-400";return a.jsx("div",{className:`text-[11px] leading-snug ${i}`,children:e})}function ze({rows:e,mode:t,extra:i=null}){const o=e.length===0&&!i;return a.jsxs(a.Fragment,{children:[e.map(({spec:n,pace:s})=>a.jsx(Be,{label:n.label??r(n.labelKey),pct:w(n.window,n.pctField),reset:De(E(n.window,n.resetField)),mode:t,pacePercent:s.pacePercent,paceOver:s.paceOver,title:$e(n,s,t)},n.key)),o?a.jsx(f,{children:r("limits.status.no_data")}):null,i]})}function Ve(e){if(!Number.isFinite(e.expiresMs))return null;const t=Math.floor((e.expiresMs-Date.now())/864e5);return t<0?null:t===0?r("limits.reset_bank.hover_detail_today",{date:e.expiresAt}):r("limits.reset_bank.hover_detail",{date:e.expiresAt,days:t})}function Xe({row:e}){const t=Math.max(0,Math.min(100,Number(e.percent)||0));return a.jsxs("div",{className:"group relative flex items-center gap-2","data-reset-bank-row":"",children:[a.jsx(z,{text:Ve(e)}),a.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:e.label}),a.jsx("div",{className:"relative flex-1 bg-oai-gray-100 dark:bg-oai-gray-700/50 rounded-full h-1.5 overflow-hidden",children:a.jsx("div",{className:"bg-oai-gray-400 dark:bg-oai-gray-500 rounded-full h-full transition-[width] duration-500 ease-out",style:{width:`${t}%`,minWidth:t>0?"3px":0}})}),a.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:e.expiresAt})]})}function Ye({model:e}){const t=e.kind==="count_only"?r("limits.codex_reset_bank.count_only",{count:e.availableCount}):null;return a.jsxs("div",{className:"mt-1 flex flex-col gap-1","data-reset-bank-section":e.kind,children:[a.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")}),t?a.jsx("div",{className:"text-[11px] leading-snug text-oai-gray-500 dark:text-oai-gray-400",children:t}):e.rows.map(i=>a.jsx(Xe,{row:i},i.key))]})}function X(e,t){if(e==="codex_meta"){const i=Te(t.reset_credits);return i?a.jsx(Ye,{model:i}):null}if(e==="kimi_parallel"&&t.parallel_limit)return a.jsx(f,{children:r("limits.label.kimi_parallel",{count:t.parallel_limit})});if(e==="kiro_credits"&&Number.isFinite(Number(t.tracked_credits))&&Number(t.tracked_credit_records)>0){const i=_(t.tracked_credits,{maximumFractionDigits:2});return a.jsx(f,{children:r("limits.label.kiro_tracked_credits",{credits:i,count:Number(t.tracked_credit_records)})})}return e==="copilot_otel"&&!t.otel_has_files&&!t.otel_enabled?a.jsx(Ze,{defaultDir:t.otel_default_dir}):null}function Je(e,t,i,o,n,s,d=null){const c=O[e];if(!c)return null;const l=c.windows(t).filter(x=>x.window).map(x=>({spec:x,pace:He(x,o)})),u=X(c.extra,t);return a.jsxs(N,{name:i,providerId:e,expandable:l.length>0,expanded:n,onToggle:s,badge:d,children:[a.jsx(ze,{mode:o,rows:l,extra:u}),n?a.jsx(Ue,{rows:l,mode:o}):null]},e)}function Qe(e,t,i,o,n){if(!O[e])return null;if(!t?.configured)return a.jsxs(N,{name:v(e),providerId:e,children:[a.jsx(f,{children:r("limits.status.not_connected")}),e==="opencodeGo"?a.jsx($,{}):null]},e);if(e==="opencodeGo"&&t.subscription_status==="inactive")return a.jsx(N,{name:v(e),providerId:e,children:a.jsx(f,{children:r("limits.opencodeGo.status.inactive")})},e);if(t.error)return a.jsxs(N,{name:v(e),providerId:e,children:[a.jsx(f,{tone:"error",children:r("shared.error.prefix",{error:t.error})}),e==="kiro"?X(O.kiro.extra,t):null,e==="opencodeGo"?a.jsx($,{}):null]},e);const s=v(e),d=t.plan_label?`${s} ${t.plan_label}`:s;let c=null;if(e==="antigravity")if(t.cached){const u=j(t.cached_at);c=a.jsx(y,{label:r("limits.label.antigravity_cached"),age:u,tone:"cached",tooltip:r("limits.tooltip.antigravity_cached")})}else c=a.jsx(y,{label:r("limits.label.antigravity_live"),tone:"live",tooltip:r("limits.tooltip.antigravity_live")});if((e==="qoder"||e==="qoderCn")&&t.cached&&(c=a.jsx(y,{label:r("limits.label.antigravity_cached"),age:j(t.cached_at),tone:"cached",tooltip:r("limits.tooltip.qoder_cached")})),!c&&t.auth_action_required==="reauth"){const u=qe[e];c=a.jsx(y,{label:r("limits.reauth.badge"),age:j(t.cached_at),tone:"stale",tooltip:u?r("limits.reauth.tooltip",{command:u}):null})}const l=t.provenance;return l?.stale&&!c&&(c=a.jsx(y,{label:r("limits.provenance.stale"),age:j(l.captured_at),tone:"stale",tooltip:r("limits.provenance.tooltip",{source:l.source,confidence:l.confidence})})),Je(e,t,d,i,o,n,c)}function Ze({defaultDir:e}){const[t,i]=h.useState(!1),n=["export COPILOT_OTEL_ENABLED=true","export COPILOT_OTEL_EXPORTER_TYPE=file",`export COPILOT_OTEL_FILE_EXPORTER_PATH="${e||"$HOME/.copilot/otel"}/copilot-otel-$(date +%Y%m%d).jsonl"`].join(`
3
- `),s=async d=>{d.stopPropagation();try{await navigator.clipboard.writeText(n),i(!0),setTimeout(()=>i(!1),1600)}catch{}};return a.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:[a.jsx("div",{className:"font-medium text-oai-gray-700 dark:text-oai-gray-200",children:r("limits.copilot.otelHint.title")}),a.jsx("div",{className:"mt-0.5 leading-snug",children:r("limits.copilot.otelHint.body")}),a.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}),a.jsx("button",{type:"button",onClick:s,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:t?r("limits.copilot.otelHint.copied"):r("limits.copilot.otelHint.copy")})]})}function P({n:e,children:t}){return a.jsxs("li",{className:"flex gap-2.5",children:[a.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:e}),a.jsx("div",{className:"min-w-0 flex-1 leading-snug",children:t})]})}function et(){return a.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:a.jsx("path",{d:"M4.5 2.75h4.75V7.5M9.25 2.75 3 9"})})}function $(){const[e,t]=h.useState(!1),i=['export OPENCODE_GO_AUTH_COOKIE="..."','# Optional: export OPENCODE_GO_WORKSPACE_ID="wrk_..." (Only if auto-discovery fails)'].join(`
4
- `),o=async n=>{n.stopPropagation();try{await navigator.clipboard.writeText(i),t(!0),setTimeout(()=>t(!1),1600)}catch{}};return a.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:[a.jsx("div",{className:"text-[12px] font-semibold text-oai-gray-800 dark:text-oai-gray-100",children:r("limits.opencodeGo.setupHint.title")}),a.jsx("div",{className:"mt-0.5 leading-snug text-oai-gray-500 dark:text-oai-gray-400",children:r("limits.opencodeGo.setupHint.subtitle")}),a.jsxs("ol",{className:"mt-2.5 space-y-2.5",children:[a.jsxs(P,{n:"1",children:[a.jsx("div",{children:r("limits.opencodeGo.setupHint.step1")}),a.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"),a.jsx(et,{})]})]}),a.jsxs(P,{n:"2",children:[a.jsx("div",{children:r("limits.opencodeGo.setupHint.step2")}),a.jsxs("ul",{className:"mt-1 space-y-0.5 text-oai-gray-500 dark:text-oai-gray-400",children:[a.jsx("li",{children:r("limits.opencodeGo.setupHint.step2_workspace")}),a.jsx("li",{children:r("limits.opencodeGo.setupHint.step2_cookie")})]})]}),a.jsxs(P,{n:"3",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("span",{children:r("limits.opencodeGo.setupHint.step3")}),a.jsx("button",{type:"button",onClick:o,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:e?r("limits.opencodeGo.setupHint.copied"):r("limits.opencodeGo.setupHint.copy")})]}),a.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}),a.jsx("div",{className:"mt-1 text-[10px] text-oai-gray-400 dark:text-oai-gray-500",children:r("limits.opencodeGo.setupHint.note_app")})]})]})]})}function tt(e){const[t,i]=h.useState(0);return h.useLayoutEffect(()=>{const o=e.current;if(!o)return;const n=o.querySelectorAll("[data-limit-label]");let s=0,d=null;if(n.length>0)try{d=document.createElement("canvas").getContext("2d")}catch{d=null}if(d){const l=window.getComputedStyle(n[0]);d.font=`${l.fontStyle} ${l.fontWeight} ${l.fontSize} ${l.fontFamily}`;for(const u of n)s=Math.max(s,d.measureText(u.textContent).width)}const c=Math.ceil(s);i(l=>l===c?l:c)}),t}function at({claude:e,codex:t,cursor:i,gemini:o,kimi:n,kiro:s,grok:d,antigravity:c,copilot:l,zcode:u,opencodeGo:x,qoder:k,qoderCn:b,order:I,visibility:C,displayMode:Y}){const J={claude:e,codex:t,cursor:i,gemini:o,kimi:n,kiro:s,grok:d,antigravity:c,copilot:l,zcode:u,opencodeGo:x,qoder:k,qoderCn:b},R=h.useRef(null),T=tt(R),[Q,Z]=h.useState(null),ee=Array.isArray(I)&&I.length>0?I:Ke,A=Y===m.REMAINING?m.REMAINING:m.USED,te=A===m.REMAINING?r("limits.settings.display_mode_remaining"):r("limits.settings.display_mode_used"),D=ee.filter(p=>!C||C[p]!==!1).map(p=>Qe(p,J[p],A,Q===p,()=>Z(ae=>ae===p?null:p))).filter(Boolean);return a.jsx(fe,{delay:.15,children:a.jsx(q,{children:a.jsxs("div",{ref:R,className:"flex flex-col gap-3",style:T>0?{"--tt-limits-label-w":`${T}px`}:void 0,children:[a.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"),te]}),D.length>0?D:a.jsx(f,{children:r("limits.status.all_hidden")})]})})})}const it=typeof window<"u"&&(window.location.hostname==="localhost"||window.location.hostname==="127.0.0.1"),rt="x-apple.systempreferences:com.apple.preference.notifications";function nt(){const e=je(),t=le(),i=r("limits.alert.blocked"),o=t?F.button:F.div;return a.jsxs(o,{type:t?"button":void 0,onClick:t?()=>ce({type:"action",name:"openURL",value:rt}):void 0,initial:e?!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 ${t?"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:[a.jsxs("span",{className:"relative flex h-1.5 w-1.5 shrink-0",children:[a.jsx("span",{className:"absolute inline-flex h-full w-full animate-ping rounded-full bg-amber-400 opacity-75"}),a.jsx("span",{className:"relative inline-flex h-1.5 w-1.5 rounded-full bg-amber-500"})]}),a.jsx("span",{className:"truncate",children:i}),a.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 yt(){const e=ie(),{data:t,error:i,isLoading:o}=me(e?{initialRefresh:!0,initialState:e,publishToPreloadCache:!0}:{initialRefresh:!0,publishToPreloadCache:!0}),n=ge(),s=xe();return re.useEffect(()=>{s.enabled&&t&&pe(t)},[s.enabled,t]),!it&&!ne()?a.jsx("div",{className:"flex flex-col flex-1 text-oai-black dark:text-oai-white font-oai antialiased",children:a.jsx(ve,{})}):a.jsx("div",{className:"flex flex-col flex-1 text-oai-black dark:text-oai-white font-oai antialiased",children:a.jsx("main",{className:"flex-1 pt-8 sm:pt-10 pb-12 sm:pb-16",children:a.jsxs("div",{className:"mx-auto max-w-6xl px-4 sm:px-6",children:[a.jsxs("div",{className:"flex flex-row items-start justify-between gap-4 mb-8",children:[a.jsxs("div",{className:"min-w-0",children:[a.jsx("h1",{className:"text-3xl sm:text-4xl font-semibold tracking-tight text-oai-black dark:text-white mb-3",children:r("nav.limits")}),a.jsx("p",{className:"text-oai-gray-500 dark:text-oai-gray-400 text-sm sm:text-base",children:r("limits.page.subtitle")})]}),a.jsxs("div",{className:"flex items-center gap-2 shrink-0",children:[s.enabled&&s.permissionBlocked?a.jsx(nt,{}):null,a.jsx("button",{type:"button",onClick:()=>{s.setEnabled(!s.enabled)},"aria-label":s.enabled?r("limits.alert.disable"):r("limits.alert.enable"),title:s.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 ${s.enabled&&s.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:s.enabled?a.jsx(Me,{className:"h-4 w-4","aria-hidden":!0}):a.jsx(Ne,{className:"h-4 w-4","aria-hidden":!0})}),a.jsx(oe,{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:a.jsx(se,{className:"h-4 w-4","aria-hidden":!0})})]})]}),o?a.jsx(Pe,{}):a.jsxs(a.Fragment,{children:[i?a.jsx("p",{className:"mb-4 text-sm text-red-500 dark:text-red-400",children:r("shared.error.prefix",{error:i})}):null,a.jsx(at,{claude:t?.claude,codex:t?.codex,cursor:t?.cursor,gemini:t?.gemini,kimi:t?.kimi,kiro:t?.kiro,grok:t?.grok,antigravity:t?.antigravity,copilot:t?.copilot,zcode:t?.zcode,opencodeGo:t?.opencodeGo,qoder:t?.qoder,qoderCn:t?.qoderCn,order:n.order,visibility:n.visibility,displayMode:n.displayMode})]})]})})})}export{yt as LimitsPage};
@@ -1 +0,0 @@
1
- import{m as C,j as t,e as N,c as a,a as ne,r as d,aq as ae,aT as ie,aw as se,ax as oe,a8 as D,aU as re,aV as le,u as ce,d as E,$ as ue,a2 as F,n as I,aW as de,aX as ge,S as H,aY as me,x as he,aZ as be,a_ as pe,a$ as xe,b0 as fe,b1 as ye,b2 as ve,b3 as je,L as ke,R as Ne,b4 as Se,b5 as Ce,a5 as T,h as we,b6 as Le}from"./__vite-browser-external-B-CAZ5HB.js";import{a as Ae,b as G,s as Ee,K as Pe,P as Oe,D as _e,c as Ie,S as Te,v as Ge,u as Ue,C as Re}from"./sortable.esm-22qRLWIc.js";import{a as Me}from"./modifiers.esm-2DRBUt-i.js";import{u as De,L as U}from"./use-limits-display-prefs-C2fbOm_s.js";import{P as Fe}from"./ProviderIcon-BKGMzdEg.js";import{a as R,l as M}from"./limits-providers-Czh_yu22.js";import{m as He}from"./react-CExpcnBO.js";import{a as S,T as x,b as m,S as P,u as L}from"./Controls-DdLHdkEz.js";import{P as $e,u as Be,a as Ve}from"./use-session-efficiency-pref-B78vQ2pp.js";import{C as ze}from"./check-DzEvx9pJ.js";import{C as Ke}from"./copy-BS7rQ_jR.js";import{A as qe}from"./index-DoTYGePn.js";import{u as Ze}from"./useCurrency-BY7ZJ-XD.js";import{u as We}from"./useTokenFormat-CVJJAs3R.js";import{S as $}from"./Select-BuxVjVTV.js";import{I as Ye}from"./info-CsAt6S8y.js";import{C as Qe}from"./ConfirmModal-DNuSWkt3.js";import{A as Je}from"./arrow-up-right-DbomORWZ.js";import{D as Xe}from"./download-DlWVR14_.js";import"./Card-Bco5i8Fn.js";import"./ToolbarRootContext-B5s-ucZR.js";import"./useScrollLock-CHsj-WN5.js";import"./SelectItemText-B7AP9a2t.js";import"./DialogTitle-CCg6RvL8.js";import"./store-DktMCl4T.js";import"./DialogDescription-CNfc42U-.js";const et=[["path",{d:"M14 2v6a2 2 0 0 0 .245.96l5.51 10.08A2 2 0 0 1 18 22H6a2 2 0 0 1-1.755-2.96l5.51-10.08A2 2 0 0 0 10 8V2",key:"18mbvz"}],["path",{d:"M6.453 15h11.094",key:"3shlmq"}],["path",{d:"M8.5 2h7",key:"csnxdl"}]],tt=C("flask-conical",et);const nt=[["circle",{cx:"9",cy:"12",r:"1",key:"1vctgf"}],["circle",{cx:"9",cy:"5",r:"1",key:"hp0tcf"}],["circle",{cx:"9",cy:"19",r:"1",key:"fkjjf6"}],["circle",{cx:"15",cy:"12",r:"1",key:"1tmaij"}],["circle",{cx:"15",cy:"5",r:"1",key:"19l28e"}],["circle",{cx:"15",cy:"19",r:"1",key:"f4zoj3"}]],at=C("grip-vertical",nt);const it=[["path",{d:"m5 8 6 6",key:"1wu5hv"}],["path",{d:"m4 14 6-6 2-3",key:"1k1g8d"}],["path",{d:"M2 5h12",key:"or177f"}],["path",{d:"M7 2h1",key:"1t2jsx"}],["path",{d:"m22 22-5-10-5 10",key:"don7ne"}],["path",{d:"M14 18h6",key:"1m8k6r"}]],st=C("languages",it);const ot=[["path",{d:"m16 17 5-5-5-5",key:"1bji2h"}],["path",{d:"M21 12H9",key:"dn1m92"}],["path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4",key:"1uf3rs"}]],rt=C("log-out",ot);const lt=[["path",{d:"M12 22a1 1 0 0 1 0-20 10 9 0 0 1 10 9 5 5 0 0 1-5 5h-2.25a1.75 1.75 0 0 0-1.4 2.8l.3.4a1.75 1.75 0 0 1-1.4 2.8z",key:"e79jfc"}],["circle",{cx:"13.5",cy:"6.5",r:".5",fill:"currentColor",key:"1okk4w"}],["circle",{cx:"17.5",cy:"10.5",r:".5",fill:"currentColor",key:"f64h9f"}],["circle",{cx:"6.5",cy:"12.5",r:".5",fill:"currentColor",key:"qy21gx"}],["circle",{cx:"8.5",cy:"7.5",r:".5",fill:"currentColor",key:"fotxhn"}]],ct=C("palette",lt);const ut=[["circle",{cx:"12",cy:"8",r:"5",key:"1hypcn"}],["path",{d:"M20 21a8 8 0 0 0-16 0",key:"rfgkzh"}]],dt=C("user-round",ut),gt="shrink-0 text-oai-gray-900 dark:text-oai-gray-200";function mt({checked:e,onChange:n,ariaLabel:i}){return t.jsx("button",{type:"button",role:"switch","aria-checked":e,"aria-label":i,onClick:n,className:N("relative inline-flex h-5 w-9 shrink-0 items-center rounded-full transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-oai-brand-500",e?"bg-oai-brand-500":"bg-oai-gray-300 dark:bg-oai-gray-700"),children:t.jsx("span",{className:N("inline-block h-3.5 w-3.5 rounded-full bg-white transition-transform",e?"translate-x-[18px]":"translate-x-[3px]")})})}function ht({id:e,visible:n,onToggle:i}){const{attributes:s,listeners:o,setNodeRef:r,transform:l,transition:c,isDragging:u}=Ue({id:e}),b={transform:Re.Transform.toString(l)||void 0,transition:c,zIndex:u?20:void 0};return t.jsxs("div",{ref:r,style:b,className:N("flex items-center gap-3 py-2 rounded-md select-none touch-none","cursor-grab active:cursor-grabbing","hover:bg-oai-gray-100/60 dark:hover:bg-oai-gray-800/60","focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-oai-brand-500",u&&"relative bg-oai-gray-100 dark:bg-oai-gray-800"),...s,...o,children:[t.jsx(at,{className:"h-4 w-4 shrink-0 text-oai-gray-400 dark:text-oai-gray-500",strokeWidth:1.75,"aria-hidden":!0}),R(e)?t.jsx(Fe,{provider:R(e),size:18,className:N("pointer-events-none",gt)}):null,t.jsx("span",{className:"flex-1 text-sm text-oai-gray-900 dark:text-oai-gray-200",children:M(e)}),t.jsx("div",{onPointerDown:h=>h.stopPropagation(),children:t.jsx(mt,{checked:n,onChange:i,ariaLabel:`${a("limits.settings.toggle_visible")}: ${M(e)}`})})]})}function bt({prefs:e}){const{order:n,visibility:i,toggle:s,moveToward:o}=e,r=Ae(G(Oe,{activationConstraint:{distance:6}}),G(Pe,{coordinateGetter:Ee})),l=({active:c,over:u})=>{u&&c.id!==u.id&&o(c.id,u.id)};return t.jsx(_e,{sensors:r,collisionDetection:Ie,modifiers:[Me],onDragEnd:l,children:t.jsx(Te,{items:n,strategy:Ge,children:t.jsx("div",{className:"flex flex-col",children:n.map(c=>t.jsx(ht,{id:c,visible:i[c]!==!1,onToggle:()=>s(c)},c))})})})}function pt(e){if(!e||typeof e!="object")return"";const n=e.user_metadata&&typeof e.user_metadata=="object"?e.user_metadata:{},i=e.profile&&typeof e.profile=="object"?e.profile:{},s=n.full_name||n.name||i.name||n.user_name||n.preferred_username;return typeof s=="string"&&s.trim()?s.trim():typeof e.email=="string"&&e.email.includes("@")?e.email.split("@")[0].trim()||e.email.trim():typeof e.email=="string"?e.email.trim():""}function xt(e){return!e||typeof e!="object"?"":typeof e.email=="string"?e.email.trim():""}function ft(e){const n=typeof e=="string"?e.trim():"";if(!n)return null;const i=n.match(/^@?([A-Za-z0-9][A-Za-z0-9-]{0,38})$/),s=n.match(/^https:\/\/github\.com\/([A-Za-z0-9][A-Za-z0-9-]{0,38})\/?$/i),o=i?.[1]||s?.[1];return o?`https://github.com/${o}`:null}function O(e,n){console.warn(`[tokentracker] settings ${e}:`,n)}function yt(e,n,i){const[s,o]=d.useState(()=>ae()),r=n&&i&&ie(),l=d.useCallback(async()=>{const c=!s;if(se(c),o(c),!!c)try{await oe(()=>e())}catch(u){O("cloud sync",u)}},[s,e]);return{cloudSyncOn:s,handleCloudSyncToggle:l,showLocalCloudSync:r}}function vt(e){const[n,i]=d.useState(!1),[s,o]=d.useState(!1),[r,l]=d.useState(!1),[c,u]=d.useState(!1),[b,h]=d.useState(null),[f,v]=d.useState(!1),[g,y]=d.useState(""),[p,j]=d.useState(!1),[w,_]=d.useState(""),[K,q]=d.useState(""),[Z,W]=d.useState(!1),[Y,Q]=d.useState(null),J=d.useMemo(()=>pt(e),[e]),X=d.useMemo(()=>xt(e),[e]),ee=d.useMemo(()=>typeof e?.id=="string"?e.id.trim():"",[e]),te=d.useMemo(()=>({setAnonymousOn:o,setCustomDisplayName:h,setGithubUrl:_,setProfileLoading:l,setPublicProfileOn:i,setShowGithubOn:j}),[]);return{anonymousOn:s,customDisplayName:b,displayName:J,editingGithub:Z,editingName:f,email:X,githubError:Y,githubInput:K,githubUrl:w,loadSetters:te,nameInput:g,profileLoading:r,profileSaving:c,publicProfileOn:n,setAnonymousOn:o,setCustomDisplayName:h,setEditingGithub:W,setEditingName:v,setGithubError:Q,setGithubInput:q,setGithubUrl:_,setNameInput:y,setProfileLoading:l,setProfileSaving:u,setPublicProfileOn:i,setShowGithubOn:j,showGithubOn:p,userId:ee}}function jt(e,n,i){d.useEffect(()=>{if(!n)return;let s=!0;return i.setProfileLoading(!0),(async()=>{try{const o=await D({getAccessToken:e});if(!s||!o)return;const r=await re({accessToken:o});if(!s)return;i.setPublicProfileOn(!!r?.enabled),i.setAnonymousOn(!!r?.anonymous),r?.display_name&&i.setCustomDisplayName(r.display_name),i.setShowGithubOn(!!r?.show_github_url),i.setGithubUrl(r?.github_url||"")}catch(o){O("load public profile",o)}finally{s&&i.setProfileLoading(!1)}})(),()=>{s=!1}},[e,n,i])}function kt(e,n){return d.useCallback(async(i,{label:s,onError:o,onSuccess:r}={})=>{if(n.profileSaving)return!1;n.setProfileSaving(!0);try{const l=await D({getAccessToken:e});if(!l)return!1;const c=await le({accessToken:l,...i});return r?.(c),!0}catch(l){return o?o(l):O(s||"mutate profile",l),!1}finally{n.setProfileSaving(!1)}},[e,n])}function Nt(e,n){return{anonymousOn:e.anonymousOn,customDisplayName:e.customDisplayName,displayName:e.displayName,editingName:e.editingName,handleAnonymousToggle:n.handleAnonymousToggle,handleSaveName:n.handleSaveName,nameInput:e.nameInput,profileLoading:e.profileLoading,profileSaving:e.profileSaving,setEditingName:e.setEditingName,setNameInput:e.setNameInput,startEditingName:n.startEditingName}}function St(e,n){return{editingGithub:e.editingGithub,githubError:e.githubError,githubInput:e.githubInput,githubUrl:e.githubUrl,handleSaveGithub:n.handleSaveGithub,handleShowGithubToggle:n.handleShowGithubToggle,profileLoading:e.profileLoading,profileSaving:e.profileSaving,setEditingGithub:e.setEditingGithub,setGithubError:e.setGithubError,setGithubInput:e.setGithubInput,showGithubOn:e.showGithubOn,startEditingGithub:n.startEditingGithub}}function Ct(e,n){const i=d.useCallback(async()=>{const o=!e.publicProfileOn;await n({enabled:o},{label:"toggle public profile",onSuccess:()=>e.setPublicProfileOn(o)})},[n,e]);return{handleAnonymousToggle:d.useCallback(async()=>{const o=!e.anonymousOn;await n({anonymous:o},{label:"toggle anonymous",onSuccess:()=>e.setAnonymousOn(o)})},[n,e]),handlePublicProfileToggle:i}}function wt(e,n,i){const s=d.useCallback(async()=>{const r=e.nameInput.trim().slice(0,50);r&&await n({display_name:r},{label:"save display name",onSuccess:()=>{e.setCustomDisplayName(r),e.setEditingName(!1),i?.()}})},[n,e,i]),o=d.useCallback(()=>{e.setNameInput(e.customDisplayName||e.displayName),e.setEditingName(!0)},[e]);return{handleSaveName:s,startEditingName:o}}function Lt(e,n){const i=d.useCallback(async()=>{if(!e.showGithubOn&&!e.githubUrl){e.setEditingGithub(!0),e.setGithubInput(""),e.setGithubError(null);return}const r=!e.showGithubOn;await n({show_github_url:r},{label:"toggle GitHub profile",onSuccess:()=>e.setShowGithubOn(r)})},[n,e]),s=d.useCallback(async()=>{const r=ft(e.githubInput);if(e.githubInput.trim()&&!r){e.setGithubError(a("settings.account.githubUrlInvalid"));return}e.setGithubError(null),await n({github_url:r,show_github_url:!!r},{label:"save GitHub profile",onError:l=>e.setGithubError(l?.message||a("settings.account.githubUrlInvalid")),onSuccess:l=>{e.setGithubUrl(l?.github_url||r||""),e.setShowGithubOn(!!r),e.setEditingGithub(!1)}})},[n,e]),o=d.useCallback(()=>{e.setGithubInput(e.githubUrl),e.setGithubError(null),e.setEditingGithub(!0)},[e]);return{handleSaveGithub:s,handleShowGithubToggle:i,startEditingGithub:o}}function At(){const e=ne(),n=vt(e.user),i=yt(e.getAccessToken,e.enabled,e.signedIn);jt(e.getAccessToken,e.signedIn,n.loadSetters);const s=kt(e.getAccessToken,n),o=Ct(n,s),r=wt(n,s,e.refreshDisplayName),l=Lt(n,s);return{...e,...i,email:n.email,handlePublicProfileToggle:o.handlePublicProfileToggle,userId:n.userId,name:Nt(n,{...o,...r}),github:St(n,l),profileLoading:n.profileLoading,profileSaving:n.profileSaving,publicProfileOn:n.publicProfileOn}}function B({disabled:e,onCancel:n,onSave:i,saveLabel:s=a("settings.account.save")}){return t.jsxs(t.Fragment,{children:[t.jsx("button",{type:"button",onClick:i,disabled:e,className:"rounded-md bg-oai-brand-500 px-3 py-1.5 text-xs font-medium text-white transition-colors hover:bg-oai-brand-600 disabled:opacity-50",children:s}),t.jsx("button",{type:"button",onClick:n,className:"rounded-md px-2 py-1.5 text-xs text-oai-gray-500 transition-colors hover:text-oai-gray-700 dark:hover:text-oai-gray-300",children:a("settings.account.cancel")})]})}function Et({nameInput:e,setEditingName:n,setNameInput:i,profileSaving:s,handleSaveName:o}){return t.jsxs("div",{className:"mt-2 flex items-center gap-2",children:[t.jsx("input",{type:"text",value:e,onChange:r=>i(r.target.value),onKeyDown:r=>{r.key==="Enter"&&o(),r.key==="Escape"&&n(!1)},maxLength:50,autoFocus:!0,className:"flex-1 rounded-md border border-oai-gray-300 bg-transparent px-2.5 py-1.5 text-sm text-oai-black outline-none focus:border-oai-brand-500 focus:ring-1 focus:ring-inset focus:ring-oai-brand-500 dark:border-oai-gray-700 dark:text-white",placeholder:a("settings.account.displayName")}),t.jsx(B,{disabled:s||!e.trim(),onCancel:()=>n(!1),onSave:o,saveLabel:s?a("settings.account.saving"):void 0})]})}function Pt({githubError:e,githubInput:n,handleSaveGithub:i,profileSaving:s,setEditingGithub:o,setGithubError:r,setGithubInput:l}){return t.jsxs("div",{className:"mt-2",children:[t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx("input",{type:"text",value:n,onChange:c=>{l(c.target.value),e&&r(null)},onKeyDown:c=>{c.key==="Enter"&&i(),c.key==="Escape"&&(o(!1),r(null))},maxLength:100,autoFocus:!0,className:"flex-1 rounded-md border border-oai-gray-300 bg-transparent px-2.5 py-1.5 text-sm text-oai-black outline-none focus:border-oai-brand-500 focus:ring-1 focus:ring-inset focus:ring-oai-brand-500 dark:border-oai-gray-700 dark:text-white",placeholder:a("settings.account.githubUrlPlaceholder")}),t.jsx(B,{disabled:s,onCancel:()=>{o(!1),r(null)},onSave:i,saveLabel:s?a("settings.account.saving"):void 0})]}),e?t.jsx("div",{className:"mt-1.5 text-xs text-red-600 dark:text-red-400",children:e}):null]})}function V({disabled:e=!1,label:n,onClick:i,title:s}){return t.jsxs("button",{type:"button",onClick:i,disabled:e,title:s,className:"inline-flex h-8 shrink-0 items-center gap-1.5 rounded-md border border-oai-gray-200 px-3 text-xs font-medium text-oai-gray-700 transition-colors hover:bg-oai-gray-100 disabled:cursor-not-allowed disabled:opacity-40 dark:border-oai-gray-800 dark:text-oai-gray-300 dark:hover:bg-oai-gray-800",children:[t.jsx($e,{className:"h-3.5 w-3.5","aria-hidden":!0}),n]})}function z({actions:e,editing:n,editor:i,hint:s,label:o}){return t.jsx("div",{className:"py-3",children:t.jsxs("div",{className:"flex items-start justify-between gap-4",children:[t.jsxs("div",{className:"min-w-0 flex-1",children:[t.jsx("div",{className:"text-sm text-oai-gray-900 dark:text-oai-gray-200",children:o}),n?i:t.jsx("div",{className:"mt-0.5 truncate text-xs text-oai-gray-500 dark:text-oai-gray-400",children:s})]}),n?null:e]})})}function Ot({name:e}){const n=e.anonymousOn?a("settings.account.displayNameDisabledWhileAnon"):void 0;return t.jsxs("div",{className:"flex shrink-0 items-center gap-2",children:[t.jsx(V,{disabled:e.anonymousOn,label:a("settings.account.edit"),onClick:e.startEditingName,title:n}),t.jsx(x,{checked:!e.anonymousOn,onChange:e.handleAnonymousToggle,disabled:e.profileLoading||e.profileSaving,ariaLabel:a("settings.account.displayName")})]})}function _t({name:e}){const{anonymousOn:n,customDisplayName:i,displayName:s,editingName:o,handleAnonymousToggle:r,handleSaveName:l,nameInput:c,profileLoading:u,profileSaving:b,setEditingName:h,setNameInput:f,startEditingName:v}=e,g=n?a("settings.account.displayNameAnonymousHint"):i||s;return t.jsx(z,{label:a("settings.account.displayName"),editing:o,hint:g,editor:t.jsx(Et,{nameInput:c,setEditingName:h,setNameInput:f,profileSaving:b,handleSaveName:l}),actions:t.jsx(Ot,{name:e})})}function It({github:e}){const{editingGithub:n,githubError:i,githubInput:s,githubUrl:o,handleSaveGithub:r,handleShowGithubToggle:l,profileLoading:c,profileSaving:u,setEditingGithub:b,setGithubError:h,setGithubInput:f,showGithubOn:v,startEditingGithub:g}=e;return t.jsx(t.Fragment,{children:t.jsx(z,{label:a("settings.account.githubUrl"),editing:n,hint:o||a("settings.account.githubUrlHint"),editor:t.jsx(Pt,{githubError:i,githubInput:s,handleSaveGithub:r,profileSaving:u,setEditingGithub:b,setGithubError:h,setGithubInput:f}),actions:t.jsxs("div",{className:"flex shrink-0 items-center gap-2",children:[t.jsx(V,{label:a("settings.account.edit"),onClick:g}),t.jsx(x,{checked:v,onChange:l,disabled:c||u,ariaLabel:a("settings.account.githubUrl")})]})})})}function Tt(){const{openLoginModal:e}=ce();return t.jsx(S,{title:a("settings.section.account"),children:t.jsxs("div",{className:"flex items-center justify-between gap-4 py-3",children:[t.jsx("p",{className:"text-sm text-oai-gray-500 dark:text-oai-gray-400",children:a("settings.account.signedOutHint")}),t.jsx("button",{type:"button",onClick:e,className:"inline-flex h-8 shrink-0 items-center justify-center rounded-md bg-oai-gray-900 px-4 text-xs font-medium text-white transition-colors hover:bg-oai-gray-800 dark:bg-white dark:text-oai-gray-900 dark:hover:bg-oai-gray-100",children:a("settings.account.signIn")})]})})}function Gt({name:e,github:n}){return t.jsxs(t.Fragment,{children:[t.jsx(_t,{name:e}),t.jsx(It,{github:n})]})}function Ut(){const e=At();return e.enabled?e.signedIn?t.jsxs(S,{title:a("settings.section.account"),subtitle:e.email||e.name.customDisplayName||e.name.displayName,action:t.jsx(Mt,{onSignOut:e.signOut}),children:[t.jsx(Rt,{userId:e.userId}),t.jsx(Dt,{settings:e}),t.jsx(Ft,{checked:e.publicProfileOn,disabled:e.profileLoading||e.profileSaving,onChange:e.handlePublicProfileToggle}),t.jsx(Ht,{visible:e.publicProfileOn,name:e.name,github:e.github})]}):t.jsx(Tt,{}):null}function Rt({userId:e}){const[n,i]=E.useState(!1);if(!e)return null;const s=async()=>{try{if(typeof navigator>"u"||!navigator.clipboard?.writeText)return;await navigator.clipboard.writeText(e),i(!0),globalThis.setTimeout(()=>i(!1),1200)}catch{i(!1)}};return t.jsxs("div",{className:"flex items-center justify-between gap-4 py-3",children:[t.jsxs("div",{className:"min-w-0 flex-1",children:[t.jsx("div",{className:"text-sm text-oai-gray-900 dark:text-oai-gray-200",children:a("settings.account.userId")}),t.jsx("div",{className:"mt-0.5 truncate font-mono text-xs text-oai-gray-500 dark:text-oai-gray-400",children:e})]}),t.jsxs("button",{type:"button",onClick:s,className:"inline-flex h-8 shrink-0 items-center gap-1.5 rounded-md border border-oai-gray-200 px-3 text-xs font-medium text-oai-gray-700 transition-colors hover:bg-oai-gray-100 dark:border-oai-gray-800 dark:text-oai-gray-300 dark:hover:bg-oai-gray-800","aria-label":a("settings.account.copyUserId"),children:[n?t.jsx(ze,{className:"h-3.5 w-3.5","aria-hidden":!0}):t.jsx(Ke,{className:"h-3.5 w-3.5","aria-hidden":!0}),n?a("settings.account.copied"):a("settings.account.copy")]})]})}function Mt({onSignOut:e}){return t.jsxs("button",{type:"button",onClick:()=>e(),className:"inline-flex h-7 items-center gap-1.5 text-xs font-medium text-oai-gray-500 transition-colors hover:text-oai-gray-700 dark:hover:text-oai-gray-300",children:[t.jsx(rt,{className:"h-3.5 w-3.5","aria-hidden":!0}),a("settings.account.signOut")]})}function Dt({settings:e}){return e.showLocalCloudSync?t.jsx(m,{label:a("settings.account.cloudSync"),hint:a("settings.account.cloudSyncHint"),control:t.jsx(x,{checked:e.cloudSyncOn,onChange:e.handleCloudSyncToggle,ariaLabel:a("settings.account.cloudSync")})}):null}function Ft({checked:e,disabled:n,onChange:i}){return t.jsx(m,{label:a("settings.account.publicProfile"),hint:a("settings.account.publicProfileHint"),control:t.jsx(x,{checked:e,onChange:i,disabled:n,ariaLabel:a("settings.account.publicProfile")})})}function Ht({visible:e,name:n,github:i}){return t.jsx(qe,{initial:!1,children:e?t.jsx(He.div,{initial:{height:0,opacity:0},animate:{height:"auto",opacity:1},exit:{height:0,opacity:0},transition:{height:{duration:.28,ease:[.22,1,.36,1]},opacity:{duration:.2,ease:[.22,1,.36,1]}},style:{overflow:"hidden"},className:"divide-y divide-oai-gray-200/60 dark:divide-oai-gray-800/60",children:t.jsx(Gt,{name:n,github:i})},"public-profile-fields"):null})}function $t(){return[{value:"light",label:a("settings.appearance.theme.light"),Icon:de},{value:"dark",label:a("settings.appearance.theme.dark"),Icon:ge},{value:"system",label:a("settings.appearance.theme.system"),Icon:H}]}function Bt(){return[{value:be,label:a("settings.appearance.language.system")},{value:pe,label:a("settings.appearance.language.english")},{value:xe,label:a("settings.appearance.language.chinese")},{value:fe,label:a("settings.appearance.language.traditional_chinese")},{value:ye,label:a("settings.appearance.language.japanese")},{value:ve,label:a("settings.appearance.language.korean")},{value:je,label:a("settings.appearance.language.german")}]}function Vt(e){if(!e)return null;try{const n=new Date(e);return Number.isNaN(n.getTime())?null:n.toLocaleString()}catch{return null}}function zt(e,n){const i=a(`settings.appearance.currency.rate_source.${e}`),s=Vt(n),o=s?a("settings.appearance.currency.rate_updated",{when:s}):a("settings.appearance.currency.rate_never");return`${i} · ${o}`}function Kt({locale:e,setLocale:n}){const i=Bt();return t.jsx($,{value:e,onValueChange:n,options:i,ariaLabel:a("settings.appearance.language.label"),className:"px-2.5 py-1.5 text-xs font-medium",leadingIcon:t.jsx(st,{className:"h-3.5 w-3.5 text-oai-gray-500 dark:text-oai-gray-400","aria-hidden":!0})})}function qt({currency:e,setCurrency:n}){const i=me().map(s=>({value:s.code,label:a(s.labelKey)}));return t.jsx($,{value:e,onValueChange:n,options:i,ariaLabel:a("settings.appearance.currency.label"),className:"px-3 py-1.5 text-xs font-medium"})}function Zt({currency:e,rate:n,rateSource:i,rateFetchedAt:s}){if(e===he)return t.jsx(t.Fragment,{children:a("settings.appearance.currency.hint")});const o=zt(i,s);return t.jsxs("span",{className:"inline-flex items-center gap-1.5",children:[t.jsx("span",{children:`1 USD = ${n.toFixed(4)} ${e}`}),t.jsx("span",{role:"img","aria-label":o,title:o,className:"inline-flex h-4 w-4 cursor-help items-center justify-center text-oai-gray-400 hover:text-oai-gray-600 dark:text-oai-gray-500 dark:hover:text-oai-gray-300",children:t.jsx(Ye,{className:"h-3.5 w-3.5","aria-hidden":!0})})]})}function Wt(){const{theme:e,setTheme:n}=ue(),{locale:i,setLocale:s}=F(),{currency:o,rate:r,rateSource:l,rateFetchedAt:c,setCurrency:u}=Ze(),{mode:b,setMode:h}=We();return t.jsxs(S,{title:a("settings.section.appearance"),children:[t.jsx(m,{label:a("settings.appearance.theme.label"),hint:a("settings.appearance.theme.hint"),control:t.jsx(P,{options:$t(),value:e,onChange:n})}),t.jsx(m,{label:a("settings.appearance.language.label"),hint:a("settings.appearance.language.hint"),control:t.jsx(Kt,{locale:i,setLocale:s})}),t.jsx(m,{label:a("settings.appearance.currency.label"),hint:t.jsx(Zt,{currency:o,rate:r,rateSource:l,rateFetchedAt:c}),control:t.jsx(qt,{currency:o,setCurrency:u})}),t.jsx(m,{label:a("settings.appearance.token_format.label"),hint:a("settings.appearance.token_format.hint"),control:t.jsx(P,{options:[{value:I.COMPACT,label:a("settings.appearance.token_format.compact")},{value:I.FULL,label:a("settings.appearance.token_format.full")}],value:b,onChange:h})})]})}function A({labelKey:e}){return t.jsxs("div",{className:"flex items-center gap-1.5",children:[t.jsx("span",{children:a(e)}),t.jsx("span",{className:"px-1.5 py-0.5 text-[8px] font-semibold tracking-wider text-oai-gray-500 bg-oai-gray-100 dark:text-oai-gray-400 dark:bg-oai-gray-800/80 rounded uppercase scale-90 origin-left",children:a("qpd.card.badge")})]})}function Yt(){const{enabled:e,toggle:n}=Be(),{enabled:i,toggle:s}=Ve(),{available:o,settings:r,setSetting:l}=L(),c=o&&!!r?.dynamicIslandSupported,u=!!r?.dynamicIslandEnabled;return t.jsxs(S,{title:a("settings.section.labs"),children:[c&&t.jsxs(t.Fragment,{children:[t.jsx(m,{label:t.jsx(A,{labelKey:"settings.labs.island.label"}),hint:a("settings.labs.island.hint"),control:t.jsx(x,{checked:u,onChange:()=>l("dynamicIslandEnabled",!u),ariaLabel:a("settings.labs.island.aria")})}),u&&t.jsx(m,{label:a("settings.labs.island_hide_menubar.label"),hint:a("settings.labs.island_hide_menubar.hint"),control:t.jsx(x,{checked:!!r?.hideMenuBarIcon,onChange:()=>l("hideMenuBarIcon",!r?.hideMenuBarIcon),ariaLabel:a("settings.labs.island_hide_menubar.aria")})})]}),t.jsx(m,{label:t.jsx(A,{labelKey:"settings.labs.qpd.label"}),hint:a("settings.labs.qpd.hint"),control:t.jsx(x,{checked:e,onChange:n,ariaLabel:a("settings.labs.qpd.aria")})}),t.jsx(m,{label:t.jsx(A,{labelKey:"settings.labs.sessions.label"}),hint:a("settings.labs.sessions.hint"),control:t.jsx(x,{checked:i,onChange:s,ariaLabel:a("settings.labs.sessions.aria")})})]})}function Qt(){const{available:e,settings:n,setSetting:i,runAction:s}=L();if(!e)return null;const o=!!n?.launchAtLogin,r=n?.toastOnReset!==!1,l=n?.confettiOnReset!==!1,c=n?.launchAtLoginSupported!==!1,u=n?.autoUpdateEnabled!==!1,b=n?.updateStatus||null,h=!!n?.updateBusy,f=!!n?.isSyncing;return t.jsxs(S,{title:a("settings.section.menubar"),children:[t.jsx(m,{label:a("settings.menubar.appearance"),hint:a("settings.menubar.appearanceHint"),control:t.jsxs(ke,{to:"/widgets",className:"inline-flex h-8 items-center gap-1.5 rounded-md border border-oai-gray-200 px-3 text-xs font-medium text-oai-gray-700 no-underline transition-colors hover:bg-oai-gray-100 dark:border-oai-gray-800 dark:text-oai-gray-300 dark:hover:bg-oai-gray-800",children:[a("settings.menubar.appearanceLink"),t.jsx(Je,{className:"h-3.5 w-3.5","aria-hidden":!0})]})}),t.jsx(m,{label:a("settings.menubar.toastOnReset"),hint:a("settings.menubar.toastOnResetHint"),control:t.jsx(x,{checked:r,onChange:()=>i("toastOnReset",!r),ariaLabel:a("settings.menubar.toastOnReset")})}),t.jsx(m,{label:a("settings.menubar.confettiOnReset"),hint:a("settings.menubar.confettiOnResetHint"),control:t.jsx(x,{checked:l,onChange:()=>i("confettiOnReset",!l),ariaLabel:a("settings.menubar.confettiOnReset")})}),c?t.jsx(m,{label:a("settings.menubar.launchAtLogin"),hint:a("settings.menubar.launchAtLoginHint"),control:t.jsx(x,{checked:o,onChange:()=>i("launchAtLogin",!o),ariaLabel:a("settings.menubar.launchAtLogin")})}):null,t.jsx(m,{label:a("settings.menubar.syncNow"),hint:a("settings.menubar.syncNowHint"),control:t.jsxs("button",{type:"button",onClick:()=>s("syncNow"),disabled:f,className:"inline-flex h-8 items-center gap-1.5 rounded-md border border-oai-gray-200 px-3 text-xs font-medium text-oai-gray-700 transition-colors hover:bg-oai-gray-100 disabled:cursor-not-allowed disabled:opacity-50 dark:border-oai-gray-800 dark:text-oai-gray-300 dark:hover:bg-oai-gray-800",children:[t.jsx(Ne,{className:N("h-3.5 w-3.5",f&&"animate-spin"),"aria-hidden":!0}),f?a("settings.menubar.syncing"):a("settings.menubar.syncNow")]})}),t.jsx(m,{label:a("settings.menubar.autoUpdate"),hint:a("settings.menubar.autoUpdateHint"),control:t.jsx(x,{checked:u,onChange:()=>i("autoUpdateEnabled",!u),ariaLabel:a("settings.menubar.autoUpdate")})}),t.jsx(m,{label:a("settings.menubar.updates"),hint:b||void 0,control:t.jsxs("button",{type:"button",onClick:()=>s("checkForUpdates"),disabled:h,className:"inline-flex h-8 items-center gap-1.5 rounded-md border border-oai-gray-200 px-3 text-xs font-medium text-oai-gray-700 transition-colors hover:bg-oai-gray-100 disabled:cursor-not-allowed disabled:opacity-50 dark:border-oai-gray-800 dark:text-oai-gray-300 dark:hover:bg-oai-gray-800",children:[t.jsx(Xe,{className:"h-3.5 w-3.5","aria-hidden":!0}),a("settings.menubar.checkUpdates")]})})]})}function Jt(e,n){function i(r){return r.replace(/^v/,"").split(".").map(Number)}const s=i(e),o=i(n);for(let r=0;r<Math.max(s.length,o.length);r++){const l=s[r]||0,c=o[r]||0;if(l<c)return!0;if(l>c)return!1}return!1}function Xt(){const{available:e,settings:n,runAction:i}=L(),s=e&&n?.version,[o,r]=E.useState(!1),[l,c]=E.useState({open:!1,latestVersion:"",htmlUrl:""}),{resolvedLocale:u}=F(),b="0.89.0",h=async()=>{r(!0);try{const p=await fetch("https://api.github.com/repos/xiufengsun/TokenTracker/releases/latest");if(!p.ok)throw new Error("Failed to fetch");const j=await p.json(),w=j.tag_name;Jt(b,w)?c({open:!0,latestVersion:w,htmlUrl:j.html_url}):T({title:a("settings.menubar.updates.upToDate")})}catch(p){console.error("Check updates failed:",p),T({title:a("settings.menubar.updates.failed")})}finally{r(!1)}},f=a("settings.menubar.updates.modalTitle"),v=a("settings.menubar.updates.modalDescription",{version:l.latestVersion}),g=a("settings.menubar.updates.modalConfirm"),y=a("settings.menubar.updates.modalCancel");return t.jsxs("div",{className:"mt-6 flex flex-col items-center justify-center gap-4 text-xs text-oai-gray-500 dark:text-oai-gray-500",children:[t.jsxs("div",{className:"flex flex-wrap items-center justify-center gap-2",children:[s?t.jsxs(t.Fragment,{children:[t.jsx("span",{children:a("settings.menubar.updates.footerCombined",{barVersion:n.version,coreVersion:b})}),t.jsx("span",{"aria-hidden":!0,children:"·"}),t.jsx("button",{type:"button",onClick:()=>i("openAbout"),className:"underline-offset-2 transition-colors hover:text-oai-gray-700 hover:underline dark:hover:text-oai-gray-300",children:"GitHub"}),t.jsx("span",{"aria-hidden":!0,children:"·"})]}):t.jsxs(t.Fragment,{children:[t.jsx("span",{children:a("settings.menubar.updates.footerCore",{version:b})}),t.jsx("span",{"aria-hidden":!0,children:"·"}),t.jsx("button",{type:"button",onClick:h,disabled:o,className:"underline-offset-2 transition-colors hover:text-oai-gray-700 hover:underline dark:hover:text-oai-gray-300 disabled:opacity-50",children:o?a("settings.menubar.updates.checking"):a("settings.menubar.checkUpdates")}),t.jsx("span",{"aria-hidden":!0,children:"·"})]}),t.jsxs("a",{href:Se,target:"_blank",rel:"noopener noreferrer",className:"inline-flex items-center gap-1.5 underline-offset-2 transition-colors hover:text-oai-gray-700 hover:underline dark:hover:text-oai-gray-300",children:[t.jsx(Ce,{className:"h-3.5 w-3.5","aria-hidden":!0}),a("settings.footer.statusPage")]})]}),t.jsx(Qe,{open:l.open,title:f,description:v,confirmLabel:g,cancelLabel:y,onConfirm:()=>{window.open(l.htmlUrl,"_blank"),c(p=>({...p,open:!1}))},onCancel:()=>c(p=>({...p,open:!1}))})]})}const k={APPEARANCE:"appearance",NATIVE_APP:"native-app",ACCOUNT:"account",LIMITS:"limits",LABS:"labs"};function en({prefs:e}){return t.jsx(P,{options:[{value:U.USED,label:a("limits.settings.display_mode_used")},{value:U.REMAINING,label:a("limits.settings.display_mode_remaining")}],value:e.displayMode,onChange:e.setDisplayMode})}function An(){const e=De(),{available:n,settings:i,setSetting:s}=L(),o=i?.toastOnReset!==!1,r=i?.confettiOnReset!==!1,[l,c]=we(),u=l.get("section"),h=Object.values(k).includes(u)&&(u!==k.NATIVE_APP||n)?u:k.APPEARANCE,f=g=>{const y=new URLSearchParams(l);g===k.APPEARANCE?y.delete("section"):y.set("section",g),c(y,{replace:!0})},v=[{id:k.APPEARANCE,label:a("settings.section.appearance"),Icon:ct,content:t.jsx(Wt,{})},...n?[{id:k.NATIVE_APP,label:a("settings.section.menubar"),Icon:H,content:t.jsx(Qt,{})}]:[],{id:k.ACCOUNT,label:a("settings.section.account"),Icon:dt,content:t.jsx(Ut,{})},{id:k.LIMITS,label:a("settings.section.limits"),Icon:Le,content:t.jsxs("div",{className:"space-y-4",children:[t.jsxs(S,{title:a("settings.section.limits"),children:[t.jsx(m,{label:a("limits.settings.display_mode_label"),control:t.jsx(en,{prefs:e})}),t.jsx(m,{label:a("settings.menubar.toastOnReset"),hint:a("settings.menubar.toastOnResetHint"),control:t.jsx(x,{checked:o,disabled:!n,onChange:()=>s("toastOnReset",!o),ariaLabel:a("settings.menubar.toastOnReset")})}),t.jsx(m,{label:a("settings.menubar.confettiOnReset"),hint:a("settings.menubar.confettiOnResetHint"),control:t.jsx(x,{checked:r,disabled:!n,onChange:()=>s("confettiOnReset",!r),ariaLabel:a("settings.menubar.confettiOnReset")})})]}),t.jsx(S,{title:a("settings.limits.providers"),children:t.jsx(bt,{prefs:e})})]})},{id:k.LABS,label:a("settings.section.labs"),Icon:tt,content:t.jsx(Yt,{})}];return t.jsx("div",{className:"flex flex-1 flex-col font-oai text-oai-black antialiased dark:text-oai-white",children:t.jsx("main",{className:"flex-1 pb-12 pt-8 sm:pb-16 sm:pt-10",children:t.jsxs("div",{className:"mx-auto w-full max-w-5xl px-4 sm:px-6",children:[t.jsx("div",{className:"mb-7",children:t.jsx("h1",{className:"text-3xl font-semibold tracking-tight text-oai-black dark:text-white sm:text-4xl",children:a("settings.page.title")})}),t.jsxs("div",{className:"grid min-w-0 gap-6 md:grid-cols-[12rem_minmax(0,1fr)] md:gap-8 lg:grid-cols-[13.5rem_minmax(0,1fr)]",children:[t.jsx("aside",{className:"min-w-0 border-b border-oai-gray-200 pb-3 dark:border-oai-gray-800 md:border-b-0 md:border-r md:pb-0 md:pr-5",children:t.jsx("nav",{"aria-label":a("settings.page.title"),className:"flex gap-0 overflow-x-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden md:sticky md:top-6 md:flex-col md:gap-1 md:overflow-visible",children:v.map(({id:g,label:y,Icon:p})=>{const j=h===g;return t.jsxs("button",{id:`settings-nav-${g}`,type:"button","aria-current":j?"page":void 0,"aria-controls":`settings-panel-${g}`,onClick:()=>f(g),className:N("inline-flex min-h-10 min-w-max shrink-0 items-center gap-1.5 rounded-md px-2 py-2 text-left text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-oai-brand-500 md:w-full md:min-w-0 md:gap-2 md:px-3",j?"bg-oai-gray-100 text-oai-black dark:bg-oai-gray-800 dark:text-white":"text-oai-gray-500 hover:bg-oai-gray-50 hover:text-oai-gray-900 dark:text-oai-gray-400 dark:hover:bg-oai-gray-900 dark:hover:text-oai-gray-200"),children:[t.jsx(p,{className:N("h-4 w-4 shrink-0",j?"text-oai-black dark:text-white":"text-oai-gray-400 dark:text-oai-gray-500"),"aria-hidden":!0}),t.jsx("span",{className:"truncate",children:y})]},g)})})}),t.jsxs("div",{className:"min-w-0",children:[v.map(({id:g,label:y,content:p})=>t.jsx("section",{id:`settings-panel-${g}`,"aria-labelledby":`settings-nav-${g}`,"aria-label":y,"data-settings-panel":g,hidden:h!==g,children:p},g)),t.jsx(Xt,{})]})]})]})})})}export{An as SettingsPage};
@@ -1 +0,0 @@
1
- import{c as r}from"./__vite-browser-external-B-CAZ5HB.js";const t=["claude","codex","cursor","gemini","kimi","kiro","grok","copilot","antigravity","zcode","opencodeGo","qoder","qoderCn"],e={claude:"CLAUDE",codex:"CODEX",cursor:"CURSOR",gemini:"GEMINI",kimi:"KIMI",kiro:"KIRO",grok:"GROK",copilot:"COPILOT",antigravity:"ANTIGRAVITY",zcode:"ZCODE",opencodeGo:"OPENCODE",qoder:"QODER",qoderCn:"QODER-CN"};function c(i){return e[i]||null}function n(i){switch(i){case"claude":return r("limits.provider.claude");case"codex":return r("limits.provider.codex");case"cursor":return r("limits.provider.cursor");case"gemini":return r("limits.provider.gemini");case"kimi":return r("limits.provider.kimi");case"kiro":return r("limits.provider.kiro");case"grok":return r("limits.provider.grok");case"copilot":return r("limits.provider.copilot");case"antigravity":return r("limits.provider.antigravity");case"zcode":return r("limits.provider.zcode");case"opencodeGo":return r("limits.provider.opencode_go");case"qoder":return r("limits.provider.qoder");case"qoderCn":return r("limits.provider.qoder_cn");default:return String(i||"")}}export{t as L,c as a,n as l};
@@ -1 +0,0 @@
1
- import{r as o}from"./__vite-browser-external-B-CAZ5HB.js";import{h as r,i as t,p as s}from"./react-CExpcnBO.js";function i(){!r.current&&t();const[e]=o.useState(s.current);return e}export{i as u};