cursor-api-proxy 0.6.0 → 0.7.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 (38) 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/lib/acp-client.d.ts +42 -0
  8. package/dist/lib/acp-client.js +472 -0
  9. package/dist/lib/acp-client.js.map +1 -0
  10. package/dist/lib/agent-runner.d.ts +2 -2
  11. package/dist/lib/agent-runner.js +97 -5
  12. package/dist/lib/agent-runner.js.map +1 -1
  13. package/dist/lib/config.d.ts +18 -0
  14. package/dist/lib/config.js +21 -1
  15. package/dist/lib/config.js.map +1 -1
  16. package/dist/lib/env.d.ts +4 -0
  17. package/dist/lib/env.js +48 -0
  18. package/dist/lib/env.js.map +1 -1
  19. package/dist/lib/handlers/anthropic-messages.js +106 -17
  20. package/dist/lib/handlers/anthropic-messages.js.map +1 -1
  21. package/dist/lib/handlers/chat-completions.js +128 -17
  22. package/dist/lib/handlers/chat-completions.js.map +1 -1
  23. package/dist/lib/process.d.ts +7 -0
  24. package/dist/lib/process.js +22 -2
  25. package/dist/lib/process.js.map +1 -1
  26. package/dist/lib/request-listener.js +7 -2
  27. package/dist/lib/request-listener.js.map +1 -1
  28. package/dist/lib/request-log.js +1 -1
  29. package/dist/lib/request-log.js.map +1 -1
  30. package/dist/lib/server.js +7 -0
  31. package/dist/lib/server.js.map +1 -1
  32. package/dist/lib/token-cache.d.ts +6 -0
  33. package/dist/lib/token-cache.js +40 -0
  34. package/dist/lib/token-cache.js.map +1 -0
  35. package/dist/lib/workspace.d.ts +5 -0
  36. package/dist/lib/workspace.js +53 -2
  37. package/dist/lib/workspace.js.map +1 -1
  38. package/package.json +1 -1
@@ -1,15 +1,66 @@
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
+ export function getChatOnlyEnvOverrides(workspaceDir) {
9
+ const cursorDir = path.join(workspaceDir, ".cursor");
10
+ const overrides = {
11
+ CURSOR_CONFIG_DIR: cursorDir,
12
+ HOME: workspaceDir,
13
+ USERPROFILE: workspaceDir,
14
+ };
15
+ if (process.platform === "win32") {
16
+ const appDataRoaming = path.join(workspaceDir, "AppData", "Roaming");
17
+ const appDataLocal = path.join(workspaceDir, "AppData", "Local");
18
+ overrides.APPDATA = appDataRoaming;
19
+ overrides.LOCALAPPDATA = appDataLocal;
20
+ }
21
+ else {
22
+ overrides.XDG_CONFIG_HOME = path.join(workspaceDir, ".config");
23
+ }
24
+ return overrides;
25
+ }
4
26
  export function resolveWorkspace(config, workspaceHeader) {
5
27
  if (config.chatOnlyWorkspace) {
6
28
  const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "cursor-proxy-"));
29
+ const cursorDir = path.join(tempDir, ".cursor");
30
+ fs.mkdirSync(cursorDir, { recursive: true });
31
+ fs.mkdirSync(path.join(cursorDir, "rules"), { recursive: true });
32
+ const minimalConfig = {
33
+ version: 1,
34
+ editor: { vimMode: false },
35
+ permissions: { allow: [], deny: [] },
36
+ };
37
+ fs.writeFileSync(path.join(cursorDir, "cli-config.json"), JSON.stringify(minimalConfig, null, 0), "utf8");
38
+ if (process.platform === "win32") {
39
+ fs.mkdirSync(path.join(tempDir, "AppData", "Roaming"), { recursive: true });
40
+ fs.mkdirSync(path.join(tempDir, "AppData", "Local"), { recursive: true });
41
+ }
42
+ else {
43
+ fs.mkdirSync(path.join(tempDir, ".config"), { recursive: true });
44
+ }
7
45
  return { workspaceDir: tempDir, tempDir };
8
46
  }
9
47
  const headerWs = typeof workspaceHeader === "string" && workspaceHeader.trim()
10
48
  ? workspaceHeader.trim()
11
49
  : null;
12
- const workspaceDir = headerWs ?? config.workspace;
13
- return { workspaceDir };
50
+ const base = path.resolve(config.workspace);
51
+ if (!headerWs) {
52
+ return { workspaceDir: base };
53
+ }
54
+ const candidate = path.resolve(headerWs);
55
+ if (!fs.existsSync(candidate) || !fs.statSync(candidate).isDirectory()) {
56
+ throw new Error("X-Cursor-Workspace must be an existing directory on the proxy host");
57
+ }
58
+ const realBase = fs.existsSync(base) ? fs.realpathSync(base) : base;
59
+ const realRequested = fs.realpathSync(candidate);
60
+ const rel = path.relative(realBase, realRequested);
61
+ if (rel.startsWith("..") || path.isAbsolute(rel)) {
62
+ throw new Error("X-Cursor-Workspace must resolve to a directory under the configured workspace base");
63
+ }
64
+ return { workspaceDir: realRequested };
14
65
  }
15
66
  //# 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.0",
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",