tokentracker-cli 1.5.7 → 1.5.9
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/dashboard/dist/assets/{AchievementBadge-DIHKXKgm.js → AchievementBadge-DxevOMMv.js} +1 -1
- package/dashboard/dist/assets/{AchievementsPage-U66jjKFf.js → AchievementsPage-wQh6dPiW.js} +2 -2
- package/dashboard/dist/assets/{AchievementsSection-BAW79xKg.js → AchievementsSection-vYIgdSyO.js} +1 -1
- package/dashboard/dist/assets/{BadgeDetailModal-IfomOw9B.js → BadgeDetailModal-isUD2b76.js} +1 -1
- package/dashboard/dist/assets/{BotAnimated-B33gSUM3.js → BotAnimated-DRT695hH.js} +1 -1
- package/dashboard/dist/assets/{Card-dtrkef-y.js → Card-CtiqYzpy.js} +1 -1
- package/dashboard/dist/assets/{CloudCheckoutPage-jYPgHJYE.js → CloudCheckoutPage-BjtTYFRB.js} +1 -1
- package/dashboard/dist/assets/{CloudPage-BumdgM5w.js → CloudPage-Ca9vK72O.js} +2 -2
- package/dashboard/dist/assets/{CommandPalette-CFEeoIo3.js → CommandPalette-DFNVDGDw.js} +1 -1
- package/dashboard/dist/assets/{CommunityStatsModal-DL3MrPmb.js → CommunityStatsModal-CBhB1FCI.js} +1 -1
- package/dashboard/dist/assets/{ConfirmModal-BRdtCv2g.js → ConfirmModal-BpxbxobQ.js} +1 -1
- package/dashboard/dist/assets/{Controls-Bb-_ZAsT.js → Controls-alGdX7nF.js} +1 -1
- package/dashboard/dist/assets/{DashboardPage-GXwt6DoC.js → DashboardPage-BzcooUrM.js} +1 -1
- package/dashboard/dist/assets/{DateRangePopover-CHkFCFkE.js → DateRangePopover-CV7k3TK2.js} +1 -1
- package/dashboard/dist/assets/{DevicePage-Da753sLS.js → DevicePage-BK3-XhwI.js} +1 -1
- package/dashboard/dist/assets/{DialogClose-4A_jISLc.js → DialogClose-D5qE4Ncq.js} +1 -1
- package/dashboard/dist/assets/DialogDescription-bgtuNhON.js +1 -0
- package/dashboard/dist/assets/{DialogTitle-C0oQdI9n.js → DialogTitle-DD0PN4lA.js} +1 -1
- package/dashboard/dist/assets/{ElectricLogo-Bv-sB-O-.js → ElectricLogo-BkeGognF.js} +1 -1
- package/dashboard/dist/assets/{FadeIn-Ch2AuGxY.js → FadeIn-WKLfxTCh.js} +1 -1
- package/dashboard/dist/assets/{HeaderGithubStar-C_dy8a5K.js → HeaderGithubStar-CAe4FRv5.js} +1 -1
- package/dashboard/dist/assets/{HoverTooltip-iuzo5YeN.js → HoverTooltip-By_5OH4b.js} +1 -1
- package/dashboard/dist/assets/{IpCheckPage-BKEID9fw.js → IpCheckPage-CsLsYWer.js} +1 -1
- package/dashboard/dist/assets/{LandingPage-DZt5JWZ7.js → LandingPage-Dz7Kwfno.js} +2 -2
- package/dashboard/dist/assets/{LeaderboardPage-CYrCQF5P.js → LeaderboardPage-Bwk5cUdL.js} +2 -2
- package/dashboard/dist/assets/{LeaderboardProBadge-B8vG2SAW.js → LeaderboardProBadge-DuuM_Qd4.js} +1 -1
- package/dashboard/dist/assets/{LeaderboardProfileModal-DpAvBJPT.js → LeaderboardProfileModal-dLdTP76d.js} +3 -3
- package/dashboard/dist/assets/{LeaderboardProfilePage-CofOk8GO.js → LeaderboardProfilePage-BC8q5Yiz.js} +1 -1
- package/dashboard/dist/assets/LimitsPage-B_joQM6T.js +6 -0
- package/dashboard/dist/assets/{LocalOnlyNotice-BBVCEm5Q.js → LocalOnlyNotice-Df1TymDu.js} +1 -1
- package/dashboard/dist/assets/{LoginCard-DcPazHo1.js → LoginCard-CSadewRf.js} +1 -1
- package/dashboard/dist/assets/{LoginModal-CGXPaeWD.js → LoginModal-xa_R4jkx.js} +1 -1
- package/dashboard/dist/assets/{LoginPage-Ct6Al1pz.js → LoginPage-DQKRFd-i.js} +1 -1
- package/dashboard/dist/assets/{PetPage-8NPEAa-c.js → PetPage-DXjUI-Fm.js} +2 -2
- package/dashboard/dist/assets/{PopoverPopup-R69ks89h.js → PopoverPopup-C9nxf0YB.js} +1 -1
- package/dashboard/dist/assets/{ProviderIcon-svF44YE0.js → ProviderIcon-COeK1iE9.js} +1 -1
- package/dashboard/dist/assets/{ResetPasswordPage-DJIYKu8C.js → ResetPasswordPage-yFhu0KjP.js} +1 -1
- package/dashboard/dist/assets/{Select-BVK4XZD5.js → Select-WAuTo5wB.js} +1 -1
- package/dashboard/dist/assets/{SelectItemText-Bh74D8lr.js → SelectItemText-Ft1My1rn.js} +1 -1
- package/dashboard/dist/assets/{SelfHostPage-8gj2lAFp.js → SelfHostPage-BxF88Cud.js} +1 -1
- package/dashboard/dist/assets/{ServiceStatusPage-CWPV_Mou.js → ServiceStatusPage-Bwphp1_T.js} +1 -1
- package/dashboard/dist/assets/{SessionsPage-Bo5plK6O.js → SessionsPage-BDZoT8S9.js} +1 -1
- package/dashboard/dist/assets/{SettingsPage-BptJrWn-.js → SettingsPage-BpQqI7sS.js} +3 -3
- package/dashboard/dist/assets/{SkillsPage-CRgGXnJS.js → SkillsPage-DPS8DP98.js} +1 -1
- package/dashboard/dist/assets/{TokenGalaxy-dgOy0Eo7.js → TokenGalaxy-Bqdu32RZ.js} +1 -1
- package/dashboard/dist/assets/{TooltipPopup-DpGnyoFz.js → TooltipPopup-CpC_9aso.js} +1 -1
- package/dashboard/dist/assets/{TrendMonitor-BEy_GbMg.js → TrendMonitor-DVWB1_L7.js} +1 -1
- package/dashboard/dist/assets/{WidgetsPage-ChUelFrP.js → WidgetsPage-BQSjbWew.js} +1 -1
- package/dashboard/dist/assets/{WrappedPage-n63RsX8z.js → WrappedPage-DLQyBtR9.js} +1 -1
- package/dashboard/dist/assets/__vite-browser-external-D-6XhI1J.css +1 -0
- package/dashboard/dist/assets/__vite-browser-external-DtVR8sgH.js +45 -0
- package/dashboard/dist/assets/{agent-logos-DQ1h5uQF.js → agent-logos-BcEyTuIb.js} +1 -1
- package/dashboard/dist/assets/{arrow-left-Bo3Sg_cg.js → arrow-left-C8aE6WcJ.js} +1 -1
- package/dashboard/dist/assets/{arrow-right-DdxkL8Ul.js → arrow-right-Dt4QZ45w.js} +1 -1
- package/dashboard/dist/assets/{arrow-up-right-CpvelPD2.js → arrow-up-right-DR4MOP3X.js} +1 -1
- package/dashboard/dist/assets/{calendar-days-BvNVya0e.js → calendar-days-DHwLFNka.js} +1 -1
- package/dashboard/dist/assets/{check-tO40Glrg.js → check-D57wJVNi.js} +1 -1
- package/dashboard/dist/assets/{chevron-down-Dnrra3mC.js → chevron-down-1Am_McS5.js} +1 -1
- package/dashboard/dist/assets/{cloud-checkout-COC4zB8s.js → cloud-checkout-D1uji-1j.js} +1 -1
- package/dashboard/dist/assets/{composite-C0NgnRTl.js → composite-CWdL18RN.js} +1 -1
- package/dashboard/dist/assets/{copy-DTKN2SO4.js → copy-Bv-Of2CY.js} +1 -1
- package/dashboard/dist/assets/{download-CSq2Yd3D.js → download-C6CZhQJ_.js} +1 -1
- package/dashboard/dist/assets/{external-link-BtGedmuQ.js → external-link-DluFPan_.js} +1 -1
- package/dashboard/dist/assets/{flame-ChjXIFSx.js → flame-Q-O2BjcZ.js} +1 -1
- package/dashboard/dist/assets/{format-tokens-CXqZY114.js → format-tokens-D6xfDQk6.js} +1 -1
- package/dashboard/dist/assets/{gift-YFwBvsUA.js → gift-CjyNlhMb.js} +1 -1
- package/dashboard/dist/assets/{icons-DCiBpbK0.js → icons-C7bLOnL0.js} +1 -1
- package/dashboard/dist/assets/{index-B7sRX2EC.js → index-C0c77eg0.js} +1 -1
- package/dashboard/dist/assets/{index-Dpmdg98T.js → index-CuFScIzn.js} +1 -1
- package/dashboard/dist/assets/{index-XSya-vft.js → index-CxtJQkWU.js} +1 -1
- package/dashboard/dist/assets/{index-DMqIbTL4.js → index-dN_XEOTc.js} +1 -1
- package/dashboard/dist/assets/{info-PYzcoobJ.js → info-DVIccqnI.js} +1 -1
- package/dashboard/dist/assets/{link-2-BxSrdKyR.js → link-2-C70V-255.js} +1 -1
- package/dashboard/dist/assets/{loader-circle-CgvCCDTH.js → loader-circle-B-Rab-PT.js} +1 -1
- package/dashboard/dist/assets/{local-usage-transfer-eTzMdhbs.js → local-usage-transfer-qvjPuuZr.js} +1 -1
- package/dashboard/dist/assets/{modifiers.esm-B796CRz-.js → modifiers.esm-BHs-2K1Y.js} +1 -1
- package/dashboard/dist/assets/{monitor-smartphone-M5nbcGRy.js → monitor-smartphone-CgrOD78L.js} +1 -1
- package/dashboard/dist/assets/{play-12ZzPH9r.js → play-Ip40EFaD.js} +1 -1
- package/dashboard/dist/assets/{plus-OqDA7xZy.js → plus-CbCC4SC4.js} +1 -1
- package/dashboard/dist/assets/{provider-display-JlEBv1VB.js → provider-display-CZGQ6_EQ.js} +1 -1
- package/dashboard/dist/assets/{react-CeDcnQho.js → react-CgvoKjQY.js} +1 -1
- package/dashboard/dist/assets/{safePolygon-B_SGhQbo.js → safePolygon-BxArCd9t.js} +1 -1
- package/dashboard/dist/assets/{search-D9wz4rWp.js → search-Cc1m7nId.js} +1 -1
- package/dashboard/dist/assets/{server-UCMw4AQF.js → server-B9RX1Vuc.js} +1 -1
- package/dashboard/dist/assets/{shield-check-lJ0-Z5Ot.js → shield-check-DFuUPXVr.js} +1 -1
- package/dashboard/dist/assets/{skills-api-Da-WZbvW.js → skills-api-NyM68NUT.js} +1 -1
- package/dashboard/dist/assets/{sortable.esm-Bj1ZkbqW.js → sortable.esm-CYnTi7kq.js} +1 -1
- package/dashboard/dist/assets/{store-Bpwwxxsy.js → store-DDaZ-mNZ.js} +1 -1
- package/dashboard/dist/assets/{terminal-BHQMC4hm.js → terminal-RKmu3r3J.js} +1 -1
- package/dashboard/dist/assets/{trash-yTV6vhGX.js → trash-V0PYmC5p.js} +1 -1
- package/dashboard/dist/assets/{use-community-stats-rrE4Ohic.js → use-community-stats-48odwOSW.js} +1 -1
- package/dashboard/dist/assets/{use-latest-request-guard-D4Y1aCyd.js → use-latest-request-guard-CwOWDCBH.js} +1 -1
- package/dashboard/dist/assets/{use-limits-display-prefs-ChHr4XEF.js → use-limits-display-prefs-Lo9XLIUG.js} +1 -1
- package/dashboard/dist/assets/{use-native-settings-BmoCls3D.js → use-native-settings-BjPp_hnp.js} +1 -1
- package/dashboard/dist/assets/{use-ordered-list-BZSSYcLx.js → use-ordered-list-DdTbfk26.js} +1 -1
- package/dashboard/dist/assets/use-reduced-motion-C58neEWc.js +1 -0
- package/dashboard/dist/assets/{use-transform-CJO1b0Iu.js → use-transform-CmzDZQtp.js} +1 -1
- package/dashboard/dist/assets/{use-usage-limits-BbAC_LWP.js → use-usage-limits-DT684bcx.js} +1 -1
- package/dashboard/dist/assets/{useCurrency-B2enOMwJ.js → useCurrency-CNQ1UMsM.js} +1 -1
- package/dashboard/dist/assets/{usePositioner-BaoW4QRL.js → usePositioner-KdfYUR_c.js} +1 -1
- package/dashboard/dist/assets/{useTokenFormat-B2bbeEu-.js → useTokenFormat-CregnoYF.js} +1 -1
- package/dashboard/dist/assets/{zap-CT5a8-_j.js → zap-CMv1W1Qs.js} +1 -1
- package/dashboard/dist/index.html +2 -2
- package/dashboard/dist/ip-check.html +2 -2
- package/dashboard/dist/leaderboard.html +2 -2
- package/dashboard/dist/share.html +2 -2
- package/package.json +1 -1
- package/src/commands/sync.js +2 -2
- package/src/lib/cursor-config.js +21 -54
- package/src/lib/cursor-login.js +157 -0
- package/src/lib/local-api.js +43 -0
- package/src/lib/pricing/seed-snapshot.json +1 -1
- package/src/lib/usage-limits.js +14 -9
- package/dashboard/dist/assets/DialogDescription-CiEhDvt9.js +0 -1
- package/dashboard/dist/assets/LimitsPage-DXknvxtI.js +0 -6
- package/dashboard/dist/assets/__vite-browser-external-CMBWGkOq.css +0 -1
- package/dashboard/dist/assets/__vite-browser-external-D_JnEwiu.js +0 -45
- package/dashboard/dist/assets/use-reduced-motion-CKTIXp4-.js +0 -1
- package/src/lib/cursor-safe-storage.js +0 -119
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as o}from"./__vite-browser-external-D_JnEwiu.js";import{h as r,i as t,p as s}from"./react-CeDcnQho.js";function i(){!r.current&&t();const[e]=o.useState(s.current);return e}export{i as u};
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
const crypto = require("node:crypto");
|
|
2
|
-
const cp = require("node:child_process");
|
|
3
|
-
const fs = require("node:fs");
|
|
4
|
-
const path = require("node:path");
|
|
5
|
-
|
|
6
|
-
const PREFIX = "cursor-safe-storage:v1:";
|
|
7
|
-
|
|
8
|
-
function decodeBase64(value) {
|
|
9
|
-
if (typeof value !== "string" || !/^[A-Za-z0-9+/]+={0,2}$/.test(value)) return null;
|
|
10
|
-
const bytes = Buffer.from(value, "base64");
|
|
11
|
-
return bytes.toString("base64").replace(/=+$/, "") === value.replace(/=+$/, "")
|
|
12
|
-
? bytes : null;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
function isJwt(value) {
|
|
16
|
-
if (typeof value !== "string" || !/^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/.test(value)) return false;
|
|
17
|
-
try {
|
|
18
|
-
const payload = JSON.parse(Buffer.from(value.split(".")[1], "base64url").toString("utf8"));
|
|
19
|
-
return payload !== null && typeof payload === "object" && !Array.isArray(payload);
|
|
20
|
-
} catch {
|
|
21
|
-
return false;
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
// Capture every stream: execFileSync otherwise forwards a failing child's stderr.
|
|
26
|
-
// Never include secrets in argv, errors, logs, or temporary files.
|
|
27
|
-
function runSecretCommand(command, args, deps, input) {
|
|
28
|
-
return (deps.execFileSync || cp.execFileSync)(command, args, {
|
|
29
|
-
encoding: "utf8",
|
|
30
|
-
timeout: 5000,
|
|
31
|
-
maxBuffer: 1024 * 1024,
|
|
32
|
-
windowsHide: true,
|
|
33
|
-
stdio: ["pipe", "pipe", "pipe"],
|
|
34
|
-
...(input === undefined ? {} : { input }),
|
|
35
|
-
}).replace(/\r?\n$/, "");
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function unprotectWindows(bytes, deps) {
|
|
39
|
-
// A fixed script keeps the encrypted data out of process listings as well.
|
|
40
|
-
const script = [
|
|
41
|
-
"$ErrorActionPreference = 'Stop'",
|
|
42
|
-
"Add-Type -AssemblyName System.Security",
|
|
43
|
-
"$data = [Convert]::FromBase64String([Console]::In.ReadToEnd())",
|
|
44
|
-
"$plain = [System.Security.Cryptography.ProtectedData]::Unprotect($data, $null, [System.Security.Cryptography.DataProtectionScope]::CurrentUser)",
|
|
45
|
-
"[Console]::Out.Write([Convert]::ToBase64String($plain))",
|
|
46
|
-
].join("; ");
|
|
47
|
-
return decodeBase64(runSecretCommand("powershell.exe", [
|
|
48
|
-
"-NoProfile", "-NonInteractive", "-Command", script,
|
|
49
|
-
], deps, bytes.toString("base64")));
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
function decryptWindows(bytes, appDir, deps) {
|
|
53
|
-
const unprotect = deps.unprotectWindows || ((data) => unprotectWindows(data, deps));
|
|
54
|
-
if (bytes.subarray(0, 3).toString() !== "v10") {
|
|
55
|
-
// Older OSCrypt used DPAPI directly, with no version prefix.
|
|
56
|
-
return unprotect(bytes)?.toString("utf8");
|
|
57
|
-
}
|
|
58
|
-
// Chromium v10: DPAPI-protected AES-256-GCM key in Cursor's Local State.
|
|
59
|
-
if (!appDir || bytes.length < 3 + 12 + 16) return null;
|
|
60
|
-
const localState = JSON.parse((deps.readFileSync || fs.readFileSync)(
|
|
61
|
-
path.win32.join(appDir, "Local State"), "utf8",
|
|
62
|
-
));
|
|
63
|
-
const wrappedKey = decodeBase64(localState?.os_crypt?.encrypted_key);
|
|
64
|
-
if (!wrappedKey || wrappedKey.subarray(0, 5).toString() !== "DPAPI") return null;
|
|
65
|
-
const key = unprotect(wrappedKey.subarray(5));
|
|
66
|
-
if (!Buffer.isBuffer(key) || key.length !== 32) return null;
|
|
67
|
-
const decipher = crypto.createDecipheriv("aes-256-gcm", key, bytes.subarray(3, 15));
|
|
68
|
-
decipher.setAuthTag(bytes.subarray(-16));
|
|
69
|
-
return Buffer.concat([decipher.update(bytes.subarray(15, -16)), decipher.final()]).toString("utf8");
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
function decryptCbc(bytes, password, iterations) {
|
|
73
|
-
const key = crypto.pbkdf2Sync(password, "saltysalt", iterations, 16, "sha1");
|
|
74
|
-
const decipher = crypto.createDecipheriv("aes-128-cbc", key, Buffer.alloc(16, 0x20));
|
|
75
|
-
return Buffer.concat([decipher.update(bytes.subarray(3)), decipher.final()]).toString("utf8");
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/** Decode Cursor's base64 Electron safeStorage envelope, or retain a legacy JWT.
|
|
79
|
-
* OS access is injectable. Unavailable/locked stores and unknown formats fail
|
|
80
|
-
* closed, without exposing child-process errors (which can contain secrets).
|
|
81
|
-
*/
|
|
82
|
-
function decodeCursorAccessToken(value, { platform = process.platform, appDir, deps = {} } = {}) {
|
|
83
|
-
if (isJwt(value)) return value;
|
|
84
|
-
if (typeof value !== "string" || !value.startsWith(PREFIX)) return null;
|
|
85
|
-
const bytes = decodeBase64(value.slice(PREFIX.length));
|
|
86
|
-
if (!bytes?.length) return null;
|
|
87
|
-
try {
|
|
88
|
-
let token;
|
|
89
|
-
const version = bytes.subarray(0, 3).toString();
|
|
90
|
-
if (platform === "win32") {
|
|
91
|
-
token = decryptWindows(bytes, appDir, deps);
|
|
92
|
-
} else if (platform === "darwin" || platform === "linux") {
|
|
93
|
-
if (bytes.length <= 3 || (bytes.length - 3) % 16 !== 0) return null;
|
|
94
|
-
let password;
|
|
95
|
-
if (platform === "darwin") {
|
|
96
|
-
if (version !== "v10") return null;
|
|
97
|
-
password = runSecretCommand("/usr/bin/security", [
|
|
98
|
-
"find-generic-password", "-s", "Cursor Safe Storage", "-w",
|
|
99
|
-
], deps);
|
|
100
|
-
if (!password) return null;
|
|
101
|
-
} else if (version === "v10") {
|
|
102
|
-
password = "peanuts"; // Chromium's basic_text backend.
|
|
103
|
-
} else if (version === "v11") {
|
|
104
|
-
// Best effort for Secret Service stores. KWallet-only/locked stores
|
|
105
|
-
// and hosts without secret-tool are intentionally unavailable.
|
|
106
|
-
password = runSecretCommand("secret-tool", ["lookup", "application", "cursor"], deps);
|
|
107
|
-
if (!password) return null;
|
|
108
|
-
} else {
|
|
109
|
-
return null;
|
|
110
|
-
}
|
|
111
|
-
token = decryptCbc(bytes, password, platform === "darwin" ? 1003 : 1);
|
|
112
|
-
}
|
|
113
|
-
return isJwt(token) ? token : null;
|
|
114
|
-
} catch {
|
|
115
|
-
return null;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
module.exports = { decodeCursorAccessToken };
|