cursor-composer-in-claude 0.7.3

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 (104) hide show
  1. package/README.md +303 -0
  2. package/dist/cli/accounts.d.ts +18 -0
  3. package/dist/cli/accounts.js +149 -0
  4. package/dist/cli/accounts.js.map +1 -0
  5. package/dist/cli/args.d.ts +14 -0
  6. package/dist/cli/args.js +93 -0
  7. package/dist/cli/args.js.map +1 -0
  8. package/dist/cli/constants.d.ts +1 -0
  9. package/dist/cli/constants.js +4 -0
  10. package/dist/cli/constants.js.map +1 -0
  11. package/dist/cli/login.d.ts +1 -0
  12. package/dist/cli/login.js +143 -0
  13. package/dist/cli/login.js.map +1 -0
  14. package/dist/cli/reset-hwid.d.ts +24 -0
  15. package/dist/cli/reset-hwid.js +286 -0
  16. package/dist/cli/reset-hwid.js.map +1 -0
  17. package/dist/cli/usage.d.ts +27 -0
  18. package/dist/cli/usage.js +177 -0
  19. package/dist/cli/usage.js.map +1 -0
  20. package/dist/cli.d.ts +2 -0
  21. package/dist/cli.js +58 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/client.d.ts +95 -0
  24. package/dist/client.js +316 -0
  25. package/dist/client.js.map +1 -0
  26. package/dist/lib/account-pool.d.ts +35 -0
  27. package/dist/lib/account-pool.js +143 -0
  28. package/dist/lib/account-pool.js.map +1 -0
  29. package/dist/lib/acp-client.d.ts +53 -0
  30. package/dist/lib/acp-client.js +517 -0
  31. package/dist/lib/acp-client.js.map +1 -0
  32. package/dist/lib/agent-cmd-args.d.ts +9 -0
  33. package/dist/lib/agent-cmd-args.js +29 -0
  34. package/dist/lib/agent-cmd-args.js.map +1 -0
  35. package/dist/lib/agent-runner.d.ts +12 -0
  36. package/dist/lib/agent-runner.js +144 -0
  37. package/dist/lib/agent-runner.js.map +1 -0
  38. package/dist/lib/anthropic.d.ts +26 -0
  39. package/dist/lib/anthropic.js +70 -0
  40. package/dist/lib/anthropic.js.map +1 -0
  41. package/dist/lib/cli-stream-parser.d.ts +8 -0
  42. package/dist/lib/cli-stream-parser.js +46 -0
  43. package/dist/lib/cli-stream-parser.js.map +1 -0
  44. package/dist/lib/config.d.ts +52 -0
  45. package/dist/lib/config.js +47 -0
  46. package/dist/lib/config.js.map +1 -0
  47. package/dist/lib/cursor-cli.d.ts +9 -0
  48. package/dist/lib/cursor-cli.js +30 -0
  49. package/dist/lib/cursor-cli.js.map +1 -0
  50. package/dist/lib/env.d.ts +54 -0
  51. package/dist/lib/env.js +247 -0
  52. package/dist/lib/env.js.map +1 -0
  53. package/dist/lib/handlers/anthropic-messages.d.ts +9 -0
  54. package/dist/lib/handlers/anthropic-messages.js +281 -0
  55. package/dist/lib/handlers/anthropic-messages.js.map +1 -0
  56. package/dist/lib/handlers/chat-completions.d.ts +9 -0
  57. package/dist/lib/handlers/chat-completions.js +275 -0
  58. package/dist/lib/handlers/chat-completions.js.map +1 -0
  59. package/dist/lib/handlers/health.d.ts +7 -0
  60. package/dist/lib/handlers/health.js +15 -0
  61. package/dist/lib/handlers/health.js.map +1 -0
  62. package/dist/lib/handlers/models.d.ts +15 -0
  63. package/dist/lib/handlers/models.js +44 -0
  64. package/dist/lib/handlers/models.js.map +1 -0
  65. package/dist/lib/http.d.ts +5 -0
  66. package/dist/lib/http.js +36 -0
  67. package/dist/lib/http.js.map +1 -0
  68. package/dist/lib/max-mode-preflight.d.ts +5 -0
  69. package/dist/lib/max-mode-preflight.js +62 -0
  70. package/dist/lib/max-mode-preflight.js.map +1 -0
  71. package/dist/lib/model-map.d.ts +17 -0
  72. package/dist/lib/model-map.js +62 -0
  73. package/dist/lib/model-map.js.map +1 -0
  74. package/dist/lib/openai.d.ts +17 -0
  75. package/dist/lib/openai.js +111 -0
  76. package/dist/lib/openai.js.map +1 -0
  77. package/dist/lib/process.d.ts +32 -0
  78. package/dist/lib/process.js +174 -0
  79. package/dist/lib/process.js.map +1 -0
  80. package/dist/lib/request-listener.d.ts +7 -0
  81. package/dist/lib/request-listener.js +99 -0
  82. package/dist/lib/request-listener.js.map +1 -0
  83. package/dist/lib/request-log.d.ts +16 -0
  84. package/dist/lib/request-log.js +147 -0
  85. package/dist/lib/request-log.js.map +1 -0
  86. package/dist/lib/resolve-model.d.ts +8 -0
  87. package/dist/lib/resolve-model.js +18 -0
  88. package/dist/lib/resolve-model.js.map +1 -0
  89. package/dist/lib/sanitize.d.ts +21 -0
  90. package/dist/lib/sanitize.js +79 -0
  91. package/dist/lib/sanitize.js.map +1 -0
  92. package/dist/lib/server.d.ts +13 -0
  93. package/dist/lib/server.js +118 -0
  94. package/dist/lib/server.js.map +1 -0
  95. package/dist/lib/token-cache.d.ts +10 -0
  96. package/dist/lib/token-cache.js +35 -0
  97. package/dist/lib/token-cache.js.map +1 -0
  98. package/dist/lib/win-cmdline-limit.d.ts +32 -0
  99. package/dist/lib/win-cmdline-limit.js +92 -0
  100. package/dist/lib/win-cmdline-limit.js.map +1 -0
  101. package/dist/lib/workspace.d.ts +19 -0
  102. package/dist/lib/workspace.js +77 -0
  103. package/dist/lib/workspace.js.map +1 -0
  104. package/package.json +51 -0
@@ -0,0 +1,143 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { spawn } from "node:child_process";
4
+ import { launch as launchChrome } from "chrome-launcher";
5
+ import { loadEnvConfig } from "../lib/env.js";
6
+ import { ACCOUNTS_DIR } from "./constants.js";
7
+ import { readKeychainToken, writeCachedToken } from "./usage.js";
8
+ // ---------------------------------------------------------------------------
9
+ // Internal helpers
10
+ // ---------------------------------------------------------------------------
11
+ const LOGIN_URL_RE = /(https:\/\/cursor\.com\/loginDeepControl.*?redirectTarget=cli)/s;
12
+ async function openIncognito(url, proxies) {
13
+ const chromeFlags = [
14
+ "--incognito",
15
+ "--new-window",
16
+ "--no-first-run",
17
+ "--no-default-browser-check",
18
+ "--disable-translate",
19
+ ];
20
+ if (proxies.length > 0) {
21
+ const proxy = proxies[Math.floor(Math.random() * proxies.length)];
22
+ chromeFlags.push(`--proxy-server=${proxy}`);
23
+ console.log(`๐Ÿ”€ Using proxy: ${proxy}`);
24
+ }
25
+ try {
26
+ await launchChrome({
27
+ startingUrl: url,
28
+ chromeFlags,
29
+ ignoreDefaultFlags: true,
30
+ handleSIGINT: false,
31
+ logLevel: "silent",
32
+ });
33
+ }
34
+ catch (e) {
35
+ const msg = e instanceof Error ? e.message : String(e);
36
+ console.log(`\n๐ŸŒ Could not open Chrome automatically: ${msg}`);
37
+ console.log(`Please open this URL in a private/incognito window:\n${url}\n`);
38
+ }
39
+ }
40
+ // ---------------------------------------------------------------------------
41
+ // Command
42
+ // ---------------------------------------------------------------------------
43
+ export async function handleLogin(accountName, proxies = []) {
44
+ const envCfg = loadEnvConfig();
45
+ const name = accountName || `account-${Date.now().toString().slice(-4)}`;
46
+ const configDir = path.join(ACCOUNTS_DIR, name);
47
+ const dirWasNew = !fs.existsSync(configDir);
48
+ fs.mkdirSync(ACCOUNTS_DIR, { recursive: true });
49
+ fs.mkdirSync(configDir, { recursive: true });
50
+ console.log(`๐Ÿ”‘ Logging into Cursor account: ${name}`);
51
+ console.log(`๐Ÿ“ Config: ${configDir}`);
52
+ console.log("");
53
+ console.log("A Chrome incognito window will open โ€” complete the login there.");
54
+ console.log("");
55
+ return new Promise((resolve, reject) => {
56
+ let browserOpened = false;
57
+ let stdoutBuffer = "";
58
+ const cleanupDir = () => {
59
+ if (!dirWasNew)
60
+ return;
61
+ try {
62
+ fs.rmSync(configDir, { recursive: true, force: true });
63
+ }
64
+ catch {
65
+ // best-effort
66
+ }
67
+ };
68
+ const child = spawn(envCfg.agentBin, ["login"], {
69
+ stdio: ["inherit", "pipe", "pipe"],
70
+ env: {
71
+ ...process.env,
72
+ CURSOR_CONFIG_DIR: configDir,
73
+ NO_OPEN_BROWSER: "1",
74
+ },
75
+ });
76
+ // Remove all signal handlers once the child exits (success or failure)
77
+ const onCancel = (signal) => {
78
+ child.kill();
79
+ cleanupDir();
80
+ if (signal === "SIGINT")
81
+ console.log("\n\nโŒ Login cancelled.");
82
+ process.exit(0);
83
+ };
84
+ const onSigint = () => onCancel("SIGINT");
85
+ const onSigterm = () => onCancel("SIGTERM");
86
+ const onSighup = () => onCancel("SIGHUP");
87
+ const removeSignalHandlers = () => {
88
+ process.removeListener("SIGINT", onSigint);
89
+ process.removeListener("SIGTERM", onSigterm);
90
+ process.removeListener("SIGHUP", onSighup);
91
+ };
92
+ process.once("SIGINT", onSigint);
93
+ process.once("SIGTERM", onSigterm);
94
+ process.once("SIGHUP", onSighup);
95
+ child.stdout?.on("data", (data) => {
96
+ const text = data.toString();
97
+ process.stdout.write(text);
98
+ stdoutBuffer += text;
99
+ // The agent prints the login URL across multiple chunks โ€” buffer until complete
100
+ if (!browserOpened &&
101
+ stdoutBuffer.includes("https://cursor.com/loginDeepControl")) {
102
+ const match = stdoutBuffer.match(LOGIN_URL_RE);
103
+ if (match?.[1]) {
104
+ const url = match[1].replace(/\s+/g, "");
105
+ openIncognito(url, proxies).catch(() => { });
106
+ browserOpened = true;
107
+ }
108
+ }
109
+ });
110
+ child.stderr?.on("data", (data) => {
111
+ process.stderr.write(data.toString());
112
+ });
113
+ child.on("error", (err) => {
114
+ removeSignalHandlers();
115
+ cleanupDir();
116
+ if (err.code === "ENOENT") {
117
+ console.error(`โŒ Could not find '${envCfg.agentBin}'. Make sure the Cursor CLI is installed.`);
118
+ }
119
+ else {
120
+ console.error("โŒ Error launching agent login:", err);
121
+ }
122
+ reject(err);
123
+ });
124
+ child.on("exit", (code) => {
125
+ removeSignalHandlers();
126
+ if (code === 0) {
127
+ // Immediately cache the keychain token for this account so that
128
+ // 'accounts list' can show live usage without needing a prior request.
129
+ const token = readKeychainToken();
130
+ if (token)
131
+ writeCachedToken(configDir, token);
132
+ console.log(`\nโœ… Account '${name}' saved โ€” it will be auto-discovered when you start the proxy.`);
133
+ resolve();
134
+ }
135
+ else {
136
+ cleanupDir();
137
+ console.error(`\nโŒ Login failed (exit code ${code}).`);
138
+ reject(new Error(`Login failed with code ${code}`));
139
+ }
140
+ });
141
+ });
142
+ }
143
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/cli/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * cursor-api-proxy reset-hwid
3
+ *
4
+ * Resets Cursor's telemetry / machine IDs so the app appears as a fresh
5
+ * installation. Mirrors the logic from the open-source cursor-reset tool:
6
+ * โ€ข telemetry.machineId โ€” SHA-256 of 32 random bytes
7
+ * โ€ข telemetry.macMachineId โ€” SHA-512 of 64 random bytes
8
+ * โ€ข telemetry.devDeviceId โ€” random UUID v4
9
+ * โ€ข telemetry.sqmId โ€” {UUID_UPPER}
10
+ * โ€ข storage.serviceMachineId โ€” random UUID v4
11
+ *
12
+ * Files touched (macOS):
13
+ * ~/Library/Application Support/Cursor/User/globalStorage/storage.json
14
+ * ~/Library/Application Support/Cursor/User/globalStorage/state.vscdb
15
+ * ~/Library/Application Support/Cursor/machineId
16
+ *
17
+ * Optionally wipes Cookies / Session Storage / Local Storage so Cursor
18
+ * cannot fingerprint the session.
19
+ */
20
+ export declare function generateNewIds(): Record<string, string>;
21
+ export declare function handleResetHwid(opts?: {
22
+ deepClean?: boolean;
23
+ dryRun?: boolean;
24
+ }): Promise<void>;
@@ -0,0 +1,286 @@
1
+ /**
2
+ * cursor-api-proxy reset-hwid
3
+ *
4
+ * Resets Cursor's telemetry / machine IDs so the app appears as a fresh
5
+ * installation. Mirrors the logic from the open-source cursor-reset tool:
6
+ * โ€ข telemetry.machineId โ€” SHA-256 of 32 random bytes
7
+ * โ€ข telemetry.macMachineId โ€” SHA-512 of 64 random bytes
8
+ * โ€ข telemetry.devDeviceId โ€” random UUID v4
9
+ * โ€ข telemetry.sqmId โ€” {UUID_UPPER}
10
+ * โ€ข storage.serviceMachineId โ€” random UUID v4
11
+ *
12
+ * Files touched (macOS):
13
+ * ~/Library/Application Support/Cursor/User/globalStorage/storage.json
14
+ * ~/Library/Application Support/Cursor/User/globalStorage/state.vscdb
15
+ * ~/Library/Application Support/Cursor/machineId
16
+ *
17
+ * Optionally wipes Cookies / Session Storage / Local Storage so Cursor
18
+ * cannot fingerprint the session.
19
+ */
20
+ import * as crypto from "node:crypto";
21
+ import { execSync, spawnSync } from "node:child_process";
22
+ import * as fs from "node:fs";
23
+ import * as os from "node:os";
24
+ import * as path from "node:path";
25
+ // ---------------------------------------------------------------------------
26
+ // Helpers
27
+ // ---------------------------------------------------------------------------
28
+ function uuid() {
29
+ return crypto.randomUUID();
30
+ }
31
+ function sha256() {
32
+ return crypto.createHash("sha256").update(crypto.randomBytes(32)).digest("hex");
33
+ }
34
+ function sha512() {
35
+ return crypto.createHash("sha512").update(crypto.randomBytes(64)).digest("hex");
36
+ }
37
+ function log(icon, msg) {
38
+ console.log(` ${icon} ${msg}`);
39
+ }
40
+ // ---------------------------------------------------------------------------
41
+ // Path resolution
42
+ // ---------------------------------------------------------------------------
43
+ function getCursorGlobalStorage() {
44
+ if (process.platform === "darwin") {
45
+ return path.join(os.homedir(), "Library", "Application Support", "Cursor", "User", "globalStorage");
46
+ }
47
+ if (process.platform === "win32") {
48
+ const appdata = process.env.APPDATA ?? "";
49
+ return path.join(appdata, "Cursor", "User", "globalStorage");
50
+ }
51
+ // Linux
52
+ const xdg = process.env.XDG_CONFIG_HOME ?? path.join(os.homedir(), ".config");
53
+ return path.join(xdg, "Cursor", "User", "globalStorage");
54
+ }
55
+ function getCursorRoot() {
56
+ return path.dirname(path.dirname(getCursorGlobalStorage()));
57
+ }
58
+ // ---------------------------------------------------------------------------
59
+ // ID generation
60
+ // ---------------------------------------------------------------------------
61
+ export function generateNewIds() {
62
+ return {
63
+ "telemetry.machineId": sha256(),
64
+ "telemetry.macMachineId": sha512(),
65
+ "telemetry.devDeviceId": uuid(),
66
+ "telemetry.sqmId": `{${uuid().toUpperCase()}}`,
67
+ "storage.serviceMachineId": uuid(),
68
+ };
69
+ }
70
+ // ---------------------------------------------------------------------------
71
+ // Kill Cursor
72
+ // ---------------------------------------------------------------------------
73
+ function killCursor() {
74
+ log("๐Ÿ”ช", "Stopping Cursor processes...");
75
+ try {
76
+ if (process.platform === "win32") {
77
+ spawnSync("taskkill", ["/F", "/IM", "Cursor.exe"], { stdio: "pipe" });
78
+ }
79
+ else {
80
+ spawnSync("pkill", ["-x", "Cursor"], { stdio: "pipe" });
81
+ spawnSync("pkill", ["-f", "Cursor.app"], { stdio: "pipe" });
82
+ }
83
+ }
84
+ catch {
85
+ /* cursor might not be running */
86
+ }
87
+ log("โœ…", "Cursor stopped (or was not running)");
88
+ }
89
+ // ---------------------------------------------------------------------------
90
+ // storage.json
91
+ // ---------------------------------------------------------------------------
92
+ function updateStorageJson(storagePath, ids) {
93
+ if (!fs.existsSync(storagePath)) {
94
+ log("โš ๏ธ ", `storage.json not found: ${storagePath}`);
95
+ return;
96
+ }
97
+ try {
98
+ // Remove immutable flag on macOS
99
+ if (process.platform === "darwin") {
100
+ try {
101
+ execSync(`chflags nouchg "${storagePath}"`, { stdio: "pipe" });
102
+ execSync(`chmod 644 "${storagePath}"`, { stdio: "pipe" });
103
+ }
104
+ catch { /* ignore */ }
105
+ }
106
+ const raw = fs.readFileSync(storagePath, "utf-8");
107
+ const data = JSON.parse(raw);
108
+ Object.assign(data, ids);
109
+ fs.writeFileSync(storagePath, JSON.stringify(data, null, 2), "utf-8");
110
+ log("โœ…", "storage.json updated");
111
+ }
112
+ catch (e) {
113
+ log("โŒ", `storage.json error: ${e}`);
114
+ }
115
+ }
116
+ // ---------------------------------------------------------------------------
117
+ // state.vscdb (SQLite)
118
+ // ---------------------------------------------------------------------------
119
+ function updateStateVscdb(dbPath, ids) {
120
+ if (!fs.existsSync(dbPath)) {
121
+ log("โš ๏ธ ", `state.vscdb not found: ${dbPath}`);
122
+ return;
123
+ }
124
+ const sqlite3 = findSqlite3();
125
+ if (!sqlite3) {
126
+ log("โš ๏ธ ", "sqlite3 not found โ€” skipping state.vscdb (install sqlite3 to fix)");
127
+ return;
128
+ }
129
+ try {
130
+ if (process.platform === "darwin") {
131
+ try {
132
+ execSync(`chflags nouchg "${dbPath}"`, { stdio: "pipe" });
133
+ execSync(`chmod 644 "${dbPath}"`, { stdio: "pipe" });
134
+ }
135
+ catch { /* ignore */ }
136
+ }
137
+ const keyRe = /^[A-Za-z0-9._-]+$/;
138
+ /** Hex / UUID / telemetry.sqmId brace form only โ€” rejects quotes and SQL metacharacters */
139
+ const valueRe = /^[A-Fa-f0-9\-{}]+$/i;
140
+ for (const [k, v] of Object.entries(ids)) {
141
+ if (!keyRe.test(k) || !valueRe.test(v)) {
142
+ log("โš ๏ธ ", "state.vscdb: skipping update โ€” unexpected key/value format");
143
+ return;
144
+ }
145
+ }
146
+ // Build SQL (values validated as hex/UUID-shaped only)
147
+ const stmts = Object.entries(ids)
148
+ .map(([k, v]) => `INSERT OR REPLACE INTO ItemTable (key, value) VALUES ('${k}', '${v}');`)
149
+ .join("\n");
150
+ const result = spawnSync(sqlite3, [dbPath], {
151
+ input: `CREATE TABLE IF NOT EXISTS ItemTable (key TEXT PRIMARY KEY, value TEXT NOT NULL);\n${stmts}`,
152
+ stdio: ["pipe", "pipe", "pipe"],
153
+ encoding: "utf-8",
154
+ });
155
+ if (result.status !== 0) {
156
+ log("โš ๏ธ ", `state.vscdb error: ${result.stderr?.trim()}`);
157
+ }
158
+ else {
159
+ log("โœ…", "state.vscdb updated");
160
+ }
161
+ }
162
+ catch (e) {
163
+ log("โŒ", `state.vscdb error: ${e}`);
164
+ }
165
+ }
166
+ function findSqlite3() {
167
+ for (const candidate of ["/usr/bin/sqlite3", "/usr/local/bin/sqlite3", "sqlite3"]) {
168
+ try {
169
+ const r = spawnSync(candidate, ["--version"], { stdio: "pipe" });
170
+ if (r.status === 0)
171
+ return candidate;
172
+ }
173
+ catch { /* try next */ }
174
+ }
175
+ return null;
176
+ }
177
+ // ---------------------------------------------------------------------------
178
+ // machineId file
179
+ // ---------------------------------------------------------------------------
180
+ function updateMachineIdFile(machineId, cursorRoot) {
181
+ const candidates = process.platform === "linux"
182
+ ? [
183
+ path.join(cursorRoot, "machineid"),
184
+ path.join(cursorRoot, "machineId"),
185
+ ]
186
+ : [path.join(cursorRoot, "machineId")];
187
+ const filePath = candidates.find(fs.existsSync) ?? candidates[0];
188
+ try {
189
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
190
+ if (fs.existsSync(filePath) && process.platform === "darwin") {
191
+ try {
192
+ execSync(`chflags nouchg "${filePath}"`, { stdio: "pipe" });
193
+ execSync(`chmod 644 "${filePath}"`, { stdio: "pipe" });
194
+ }
195
+ catch { /* ignore */ }
196
+ }
197
+ fs.writeFileSync(filePath, machineId + "\n", "utf-8");
198
+ log("โœ…", `machineId file updated (${path.basename(filePath)})`);
199
+ }
200
+ catch (e) {
201
+ log("โš ๏ธ ", `machineId file error: ${e}`);
202
+ }
203
+ }
204
+ // ---------------------------------------------------------------------------
205
+ // Optional: wipe session / cookie data
206
+ // ---------------------------------------------------------------------------
207
+ const DIRS_TO_WIPE = [
208
+ "Session Storage",
209
+ "Local Storage",
210
+ "IndexedDB",
211
+ "Cache",
212
+ "Code Cache",
213
+ "GPUCache",
214
+ "Service Worker",
215
+ "Network",
216
+ "Cookies",
217
+ "Cookies-journal",
218
+ ];
219
+ function deepClean(cursorRoot) {
220
+ log("๐Ÿงน", "Deep-cleaning session data...");
221
+ let wiped = 0;
222
+ for (const name of DIRS_TO_WIPE) {
223
+ const target = path.join(cursorRoot, name);
224
+ if (!fs.existsSync(target))
225
+ continue;
226
+ try {
227
+ const stat = fs.statSync(target);
228
+ if (stat.isDirectory()) {
229
+ fs.rmSync(target, { recursive: true, force: true });
230
+ }
231
+ else {
232
+ fs.unlinkSync(target);
233
+ }
234
+ wiped++;
235
+ }
236
+ catch { /* ignore */ }
237
+ }
238
+ log("โœ…", `Wiped ${wiped} cache/session items`);
239
+ }
240
+ // ---------------------------------------------------------------------------
241
+ // Main export
242
+ // ---------------------------------------------------------------------------
243
+ export async function handleResetHwid(opts = {}) {
244
+ console.log("\n๐Ÿ”„ Cursor HWID Reset\n");
245
+ console.log(" Resets all machine / telemetry IDs so Cursor sees a fresh install.");
246
+ console.log(" Cursor must be closed โ€” it will be killed automatically.\n");
247
+ const globalStorage = getCursorGlobalStorage();
248
+ const cursorRoot = getCursorRoot();
249
+ if (!fs.existsSync(globalStorage)) {
250
+ console.log(`โŒ Cursor config not found at:\n ${globalStorage}`);
251
+ console.log(" Make sure Cursor is installed and has been run at least once.");
252
+ process.exit(1);
253
+ }
254
+ if (opts.dryRun) {
255
+ console.log(" [DRY RUN] Would reset IDs in:");
256
+ console.log(` ${path.join(globalStorage, "storage.json")}`);
257
+ console.log(` ${path.join(globalStorage, "state.vscdb")}`);
258
+ console.log(` ${path.join(cursorRoot, "machineId")}`);
259
+ return;
260
+ }
261
+ // 1. Kill Cursor
262
+ killCursor();
263
+ // Small delay so the OS can release file handles
264
+ await new Promise((r) => setTimeout(r, 800));
265
+ // 2. Generate new IDs
266
+ const newIds = generateNewIds();
267
+ log("๐ŸŽฒ", "Generated new IDs:");
268
+ for (const [k, v] of Object.entries(newIds)) {
269
+ console.log(` ${k}: ${v}`);
270
+ }
271
+ console.log();
272
+ // 3. Update files
273
+ log("๐Ÿ“", "Updating storage.json...");
274
+ updateStorageJson(path.join(globalStorage, "storage.json"), newIds);
275
+ log("๐Ÿ—„๏ธ ", "Updating state.vscdb...");
276
+ updateStateVscdb(path.join(globalStorage, "state.vscdb"), newIds);
277
+ log("๐Ÿ”‘", "Updating machineId file...");
278
+ updateMachineIdFile(newIds["telemetry.machineId"], cursorRoot);
279
+ // 4. Optional deep clean
280
+ if (opts.deepClean) {
281
+ console.log();
282
+ deepClean(cursorRoot);
283
+ }
284
+ console.log("\nโœ… HWID reset complete. You can now restart Cursor.\n");
285
+ }
286
+ //# sourceMappingURL=reset-hwid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reset-hwid.js","sourceRoot":"","sources":["../../src/cli/reset-hwid.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export { TOKEN_FILE, readCachedToken, writeCachedToken, readKeychainToken, } from "../lib/token-cache.js";
2
+ export declare function decodeJwtPayload(token: string): Record<string, unknown>;
3
+ /** Extract the auth0 user sub from a Cursor access token (e.g. "auth0|user_01KKโ€ฆ"). */
4
+ export declare function tokenSub(token: string): string | undefined;
5
+ export type ModelUsage = {
6
+ numRequests: number;
7
+ numRequestsTotal: number;
8
+ numTokens: number;
9
+ maxTokenUsage: number | null;
10
+ maxRequestUsage: number | null;
11
+ };
12
+ export type UsageData = {
13
+ startOfMonth: string;
14
+ models: Record<string, ModelUsage>;
15
+ };
16
+ export declare function fetchAccountUsage(token: string): Promise<UsageData | null>;
17
+ export type StripeProfile = {
18
+ membershipType: string;
19
+ subscriptionStatus: string;
20
+ daysRemainingOnTrial: number | null;
21
+ isTeamMember: boolean;
22
+ isYearlyPlan: boolean;
23
+ };
24
+ /** Human-readable plan name + limits for display. */
25
+ export declare function describePlan(profile: StripeProfile): string;
26
+ export declare function fetchStripeProfile(token: string): Promise<StripeProfile | null>;
27
+ export declare function formatUsageSummary(usage: UsageData): string[];