cursor-api-proxy 0.6.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +54 -30
  2. package/dist/cli/reset-hwid.js +10 -1
  3. package/dist/cli/reset-hwid.js.map +1 -1
  4. package/dist/cli/usage.d.ts +1 -5
  5. package/dist/cli/usage.js +1 -38
  6. package/dist/cli/usage.js.map +1 -1
  7. package/dist/client.js +1 -1
  8. package/dist/client.js.map +1 -1
  9. package/dist/lib/acp-client.d.ts +53 -0
  10. package/dist/lib/acp-client.js +516 -0
  11. package/dist/lib/acp-client.js.map +1 -0
  12. package/dist/lib/agent-runner.d.ts +2 -2
  13. package/dist/lib/agent-runner.js +97 -5
  14. package/dist/lib/agent-runner.js.map +1 -1
  15. package/dist/lib/config.d.ts +18 -0
  16. package/dist/lib/config.js +21 -1
  17. package/dist/lib/config.js.map +1 -1
  18. package/dist/lib/env.d.ts +4 -0
  19. package/dist/lib/env.js +50 -2
  20. package/dist/lib/env.js.map +1 -1
  21. package/dist/lib/handlers/anthropic-messages.js +106 -17
  22. package/dist/lib/handlers/anthropic-messages.js.map +1 -1
  23. package/dist/lib/handlers/chat-completions.js +128 -17
  24. package/dist/lib/handlers/chat-completions.js.map +1 -1
  25. package/dist/lib/process.d.ts +7 -0
  26. package/dist/lib/process.js +22 -2
  27. package/dist/lib/process.js.map +1 -1
  28. package/dist/lib/request-listener.js +7 -2
  29. package/dist/lib/request-listener.js.map +1 -1
  30. package/dist/lib/request-log.js +1 -1
  31. package/dist/lib/request-log.js.map +1 -1
  32. package/dist/lib/resolve-model.js +5 -5
  33. package/dist/lib/resolve-model.js.map +1 -1
  34. package/dist/lib/server.js +7 -0
  35. package/dist/lib/server.js.map +1 -1
  36. package/dist/lib/token-cache.d.ts +6 -0
  37. package/dist/lib/token-cache.js +40 -0
  38. package/dist/lib/token-cache.js.map +1 -0
  39. package/dist/lib/workspace.d.ts +13 -0
  40. package/dist/lib/workspace.js +64 -2
  41. package/dist/lib/workspace.js.map +1 -1
  42. package/package.json +1 -1
@@ -1,15 +1,77 @@
1
1
  import * as fs from "node:fs";
2
2
  import * as os from "node:os";
3
3
  import * as path from "node:path";
4
+ /**
5
+ * Env overrides for chat-only (isolated) workspace so the agent cannot load
6
+ * rules from ~/.cursor or other user config paths.
7
+ *
8
+ * When `authConfigDir` is set (account pool), use it for `CURSOR_CONFIG_DIR` so the
9
+ * CLI loads credentials from that profile.
10
+ *
11
+ * We do **not** override `HOME` / `USERPROFILE` / `XDG_*` in that case: the Cursor CLI
12
+ * still resolves auth relative to the real user profile for `agent --print` / ask, and
13
+ * a fake `HOME` makes login fail even when `CURSOR_CONFIG_DIR` points at the pool.
14
+ * Without a pool, the temp `HOME` keeps rules from the real `~/.cursor` from loading.
15
+ */
16
+ export function getChatOnlyEnvOverrides(workspaceDir, authConfigDir) {
17
+ const cursorDir = authConfigDir ?? path.join(workspaceDir, ".cursor");
18
+ const overrides = {
19
+ CURSOR_CONFIG_DIR: cursorDir,
20
+ };
21
+ if (authConfigDir) {
22
+ return overrides;
23
+ }
24
+ overrides.HOME = workspaceDir;
25
+ overrides.USERPROFILE = workspaceDir;
26
+ if (process.platform === "win32") {
27
+ const appDataRoaming = path.join(workspaceDir, "AppData", "Roaming");
28
+ const appDataLocal = path.join(workspaceDir, "AppData", "Local");
29
+ overrides.APPDATA = appDataRoaming;
30
+ overrides.LOCALAPPDATA = appDataLocal;
31
+ }
32
+ else {
33
+ overrides.XDG_CONFIG_HOME = path.join(workspaceDir, ".config");
34
+ }
35
+ return overrides;
36
+ }
4
37
  export function resolveWorkspace(config, workspaceHeader) {
5
38
  if (config.chatOnlyWorkspace) {
6
39
  const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "cursor-proxy-"));
40
+ const cursorDir = path.join(tempDir, ".cursor");
41
+ fs.mkdirSync(cursorDir, { recursive: true });
42
+ fs.mkdirSync(path.join(cursorDir, "rules"), { recursive: true });
43
+ const minimalConfig = {
44
+ version: 1,
45
+ editor: { vimMode: false },
46
+ permissions: { allow: [], deny: [] },
47
+ };
48
+ fs.writeFileSync(path.join(cursorDir, "cli-config.json"), JSON.stringify(minimalConfig, null, 0), "utf8");
49
+ if (process.platform === "win32") {
50
+ fs.mkdirSync(path.join(tempDir, "AppData", "Roaming"), { recursive: true });
51
+ fs.mkdirSync(path.join(tempDir, "AppData", "Local"), { recursive: true });
52
+ }
53
+ else {
54
+ fs.mkdirSync(path.join(tempDir, ".config"), { recursive: true });
55
+ }
7
56
  return { workspaceDir: tempDir, tempDir };
8
57
  }
9
58
  const headerWs = typeof workspaceHeader === "string" && workspaceHeader.trim()
10
59
  ? workspaceHeader.trim()
11
60
  : null;
12
- const workspaceDir = headerWs ?? config.workspace;
13
- return { workspaceDir };
61
+ const base = path.resolve(config.workspace);
62
+ if (!headerWs) {
63
+ return { workspaceDir: base };
64
+ }
65
+ const candidate = path.resolve(headerWs);
66
+ if (!fs.existsSync(candidate) || !fs.statSync(candidate).isDirectory()) {
67
+ throw new Error("X-Cursor-Workspace must be an existing directory on the proxy host");
68
+ }
69
+ const realBase = fs.existsSync(base) ? fs.realpathSync(base) : base;
70
+ const realRequested = fs.realpathSync(candidate);
71
+ const rel = path.relative(realBase, realRequested);
72
+ if (rel.startsWith("..") || path.isAbsolute(rel)) {
73
+ throw new Error("X-Cursor-Workspace must resolve to a directory under the configured workspace base");
74
+ }
75
+ return { workspaceDir: realRequested };
14
76
  }
15
77
  //# sourceMappingURL=workspace.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/lib/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AASlC,MAAM,UAAU,gBAAgB,CAC9B,MAAoB,EACpB,eAA0C;IAE1C,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;QACxE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAC5C,CAAC;IACD,MAAM,QAAQ,GACZ,OAAO,eAAe,KAAK,QAAQ,IAAI,eAAe,CAAC,IAAI,EAAE;QAC3D,CAAC,CAAC,eAAe,CAAC,IAAI,EAAE;QACxB,CAAC,CAAC,IAAI,CAAC;IACX,MAAM,YAAY,GAAG,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC;IAClD,OAAO,EAAE,YAAY,EAAE,CAAC;AAC1B,CAAC"}
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/lib/workspace.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cursor-api-proxy",
3
- "version": "0.6.0",
3
+ "version": "0.7.1",
4
4
  "description": "OpenAI-compatible proxy for Cursor CLI — use Cursor models from any LLM client on localhost",
5
5
  "private": false,
6
6
  "type": "module",