cursor-api-proxy 0.3.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 (80) hide show
  1. package/README.md +219 -0
  2. package/dist/cli.d.ts +5 -0
  3. package/dist/cli.js +53 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/client.d.ts +95 -0
  6. package/dist/client.js +316 -0
  7. package/dist/client.js.map +1 -0
  8. package/dist/lib/agent-cmd-args.d.ts +5 -0
  9. package/dist/lib/agent-cmd-args.js +24 -0
  10. package/dist/lib/agent-cmd-args.js.map +1 -0
  11. package/dist/lib/agent-runner.d.ts +12 -0
  12. package/dist/lib/agent-runner.js +38 -0
  13. package/dist/lib/agent-runner.js.map +1 -0
  14. package/dist/lib/anthropic.d.ts +26 -0
  15. package/dist/lib/anthropic.js +59 -0
  16. package/dist/lib/anthropic.js.map +1 -0
  17. package/dist/lib/cli-stream-parser.d.ts +8 -0
  18. package/dist/lib/cli-stream-parser.js +46 -0
  19. package/dist/lib/cli-stream-parser.js.map +1 -0
  20. package/dist/lib/config.d.ts +28 -0
  21. package/dist/lib/config.js +24 -0
  22. package/dist/lib/config.js.map +1 -0
  23. package/dist/lib/cursor-cli.d.ts +9 -0
  24. package/dist/lib/cursor-cli.js +30 -0
  25. package/dist/lib/cursor-cli.js.map +1 -0
  26. package/dist/lib/cursorCli.d.ts +9 -0
  27. package/dist/lib/cursorCli.js +30 -0
  28. package/dist/lib/cursorCli.js.map +1 -0
  29. package/dist/lib/env.d.ts +41 -0
  30. package/dist/lib/env.js +138 -0
  31. package/dist/lib/env.js.map +1 -0
  32. package/dist/lib/handlers/anthropic-messages.d.ts +9 -0
  33. package/dist/lib/handlers/anthropic-messages.js +124 -0
  34. package/dist/lib/handlers/anthropic-messages.js.map +1 -0
  35. package/dist/lib/handlers/chat-completions.d.ts +9 -0
  36. package/dist/lib/handlers/chat-completions.js +98 -0
  37. package/dist/lib/handlers/chat-completions.js.map +1 -0
  38. package/dist/lib/handlers/health.d.ts +7 -0
  39. package/dist/lib/handlers/health.js +15 -0
  40. package/dist/lib/handlers/health.js.map +1 -0
  41. package/dist/lib/handlers/models.d.ts +14 -0
  42. package/dist/lib/handlers/models.js +34 -0
  43. package/dist/lib/handlers/models.js.map +1 -0
  44. package/dist/lib/http.d.ts +5 -0
  45. package/dist/lib/http.js +32 -0
  46. package/dist/lib/http.js.map +1 -0
  47. package/dist/lib/max-mode-preflight.d.ts +5 -0
  48. package/dist/lib/max-mode-preflight.js +56 -0
  49. package/dist/lib/max-mode-preflight.js.map +1 -0
  50. package/dist/lib/model-map.d.ts +17 -0
  51. package/dist/lib/model-map.js +62 -0
  52. package/dist/lib/model-map.js.map +1 -0
  53. package/dist/lib/modelMap.d.ts +17 -0
  54. package/dist/lib/modelMap.js +62 -0
  55. package/dist/lib/modelMap.js.map +1 -0
  56. package/dist/lib/openai.d.ts +7 -0
  57. package/dist/lib/openai.js +59 -0
  58. package/dist/lib/openai.js.map +1 -0
  59. package/dist/lib/process.d.ts +19 -0
  60. package/dist/lib/process.js +92 -0
  61. package/dist/lib/process.js.map +1 -0
  62. package/dist/lib/request-listener.d.ts +7 -0
  63. package/dist/lib/request-listener.js +70 -0
  64. package/dist/lib/request-listener.js.map +1 -0
  65. package/dist/lib/request-log.d.ts +13 -0
  66. package/dist/lib/request-log.js +110 -0
  67. package/dist/lib/request-log.js.map +1 -0
  68. package/dist/lib/requestLog.d.ts +2 -0
  69. package/dist/lib/requestLog.js +19 -0
  70. package/dist/lib/requestLog.js.map +1 -0
  71. package/dist/lib/resolve-model.d.ts +8 -0
  72. package/dist/lib/resolve-model.js +18 -0
  73. package/dist/lib/resolve-model.js.map +1 -0
  74. package/dist/lib/server.d.ts +8 -0
  75. package/dist/lib/server.js +35 -0
  76. package/dist/lib/server.js.map +1 -0
  77. package/dist/lib/workspace.d.ts +6 -0
  78. package/dist/lib/workspace.js +15 -0
  79. package/dist/lib/workspace.js.map +1 -0
  80. package/package.json +50 -0
@@ -0,0 +1,110 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ export function logIncoming(method, pathname, remoteAddress) {
4
+ console.log(`[${new Date().toISOString()}] Incoming: ${method} ${pathname} (from ${remoteAddress})`);
5
+ }
6
+ // ANSI color helpers
7
+ const C = {
8
+ reset: "\x1b[0m",
9
+ bold: "\x1b[1m",
10
+ dim: "\x1b[2m",
11
+ cyan: "\x1b[36m",
12
+ bCyan: "\x1b[1;96m",
13
+ green: "\x1b[32m",
14
+ bGreen: "\x1b[1;92m",
15
+ yellow: "\x1b[33m",
16
+ magenta: "\x1b[35m",
17
+ bMagenta: "\x1b[1;95m",
18
+ red: "\x1b[31m",
19
+ gray: "\x1b[90m",
20
+ white: "\x1b[97m",
21
+ };
22
+ const ROLE_STYLE = {
23
+ system: C.yellow,
24
+ user: C.cyan,
25
+ assistant: C.green,
26
+ };
27
+ const ROLE_EMOJI = {
28
+ system: "🔧",
29
+ user: "👤",
30
+ assistant: "🤖",
31
+ };
32
+ function ts() {
33
+ return `${C.gray}${new Date().toISOString()}${C.reset}`;
34
+ }
35
+ function truncate(s, max) {
36
+ if (s.length <= max)
37
+ return s;
38
+ const head = Math.floor(max * 0.6);
39
+ const tail = max - head;
40
+ const omitted = s.length - head - tail;
41
+ return (s.slice(0, head) +
42
+ `${C.dim} … (${omitted} chars omitted) … ` +
43
+ s.slice(s.length - tail) +
44
+ C.reset);
45
+ }
46
+ function hr(char = "─", len = 60) {
47
+ return C.gray + char.repeat(len) + C.reset;
48
+ }
49
+ export function logTrafficRequest(verbose, model, messages, isStream) {
50
+ if (!verbose)
51
+ return;
52
+ const modeTag = isStream
53
+ ? `${C.bCyan}⚡ stream${C.reset}`
54
+ : `${C.dim}sync${C.reset}`;
55
+ const modelStr = `${C.bMagenta}✦ ${model}${C.reset}`;
56
+ console.log(hr());
57
+ console.log(`${ts()} 📤 ${C.bCyan}${C.bold}REQUEST${C.reset} ${modelStr} ${modeTag}`);
58
+ for (const m of messages) {
59
+ const roleColor = ROLE_STYLE[m.role] ?? C.white;
60
+ const emoji = ROLE_EMOJI[m.role] ?? "💬";
61
+ const label = `${roleColor}${C.bold}[${m.role}]${C.reset}`;
62
+ const charCount = `${C.dim}(${m.content.length} chars)${C.reset}`;
63
+ const preview = truncate(m.content.replace(/\n/g, "↵ "), 280);
64
+ console.log(` ${emoji} ${label} ${charCount}`);
65
+ console.log(` ${C.dim}${preview}${C.reset}`);
66
+ }
67
+ }
68
+ export function logTrafficResponse(verbose, model, text, isStream) {
69
+ if (!verbose)
70
+ return;
71
+ const modeTag = isStream
72
+ ? `${C.bGreen}⚡ stream${C.reset}`
73
+ : `${C.dim}sync${C.reset}`;
74
+ const modelStr = `${C.bMagenta}✦ ${model}${C.reset}`;
75
+ const charCount = `${C.bold}${text.length}${C.reset}${C.dim} chars${C.reset}`;
76
+ const preview = truncate(text.replace(/\n/g, "↵ "), 480);
77
+ console.log(`${ts()} 📥 ${C.bGreen}${C.bold}RESPONSE${C.reset} ${modelStr} ${modeTag} ${charCount}`);
78
+ console.log(` 🤖 ${C.green}${preview}${C.reset}`);
79
+ console.log(hr("─", 60));
80
+ }
81
+ export function appendSessionLine(logPath, method, pathname, remoteAddress, statusCode) {
82
+ const line = `${new Date().toISOString()} ${method} ${pathname} ${remoteAddress} ${statusCode}\n`;
83
+ try {
84
+ const dir = path.dirname(logPath);
85
+ if (!fs.existsSync(dir)) {
86
+ fs.mkdirSync(dir, { recursive: true });
87
+ }
88
+ fs.appendFileSync(logPath, line);
89
+ }
90
+ catch (err) {
91
+ console.error("Failed to write sessions log:", err);
92
+ }
93
+ }
94
+ /**
95
+ * Log an agent execution error to console and sessions log.
96
+ * Returns the error message for use in API responses.
97
+ */
98
+ export function logAgentError(logPath, method, pathname, remoteAddress, exitCode, stderr) {
99
+ const errMsg = `Cursor CLI failed (exit ${exitCode}): ${stderr.trim()}`;
100
+ console.error(`[${new Date().toISOString()}] Agent error: ${errMsg}`);
101
+ try {
102
+ const truncated = stderr.trim().slice(0, 200).replace(/\n/g, " ");
103
+ fs.appendFileSync(logPath, `${new Date().toISOString()} ERROR ${method} ${pathname} ${remoteAddress} agent_exit_${exitCode} ${truncated}\n`);
104
+ }
105
+ catch {
106
+ /* ignore */
107
+ }
108
+ return errMsg;
109
+ }
110
+ //# sourceMappingURL=request-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-log.js","sourceRoot":"","sources":["../../src/lib/request-log.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function logIncoming(method: string, pathname: string, remoteAddress: string): void;
2
+ export declare function appendSessionLine(logPath: string, method: string, pathname: string, remoteAddress: string, statusCode: number): void;
@@ -0,0 +1,19 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ export function logIncoming(method, pathname, remoteAddress) {
4
+ console.log(`[${new Date().toISOString()}] Incoming: ${method} ${pathname} (from ${remoteAddress})`);
5
+ }
6
+ export function appendSessionLine(logPath, method, pathname, remoteAddress, statusCode) {
7
+ const line = `${new Date().toISOString()} ${method} ${pathname} ${remoteAddress} ${statusCode}\n`;
8
+ try {
9
+ const dir = path.dirname(logPath);
10
+ if (!fs.existsSync(dir)) {
11
+ fs.mkdirSync(dir, { recursive: true });
12
+ }
13
+ fs.appendFileSync(logPath, line);
14
+ }
15
+ catch (err) {
16
+ console.error("Failed to write sessions log:", err);
17
+ }
18
+ }
19
+ //# sourceMappingURL=requestLog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestLog.js","sourceRoot":"","sources":["../../src/lib/requestLog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,QAAgB,EAAE,aAAqB;IACjF,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,eAAe,MAAM,IAAI,QAAQ,UAAU,aAAa,GAAG,CAAC,CAAC;AACvG,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,OAAe,EACf,MAAc,EACd,QAAgB,EAChB,aAAqB,EACrB,UAAkB;IAElB,MAAM,IAAI,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,MAAM,IAAI,QAAQ,IAAI,aAAa,IAAI,UAAU,IAAI,CAAC;IAClG,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;QACD,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAC;IACtD,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { BridgeConfig } from "./config.js";
2
+ /**
3
+ * Resolve the requested model (already normalized) to the final model string,
4
+ * applying strictModel and lastRequestedModelRef semantics.
5
+ */
6
+ export declare function resolveModel(requested: string | undefined, lastRequestedModelRef: {
7
+ current?: string;
8
+ }, config: BridgeConfig): string;
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Resolve the requested model (already normalized) to the final model string,
3
+ * applying strictModel and lastRequestedModelRef semantics.
4
+ */
5
+ export function resolveModel(requested, lastRequestedModelRef, config) {
6
+ const isAuto = requested === "auto";
7
+ const explicitModel = requested && !isAuto ? requested : undefined;
8
+ if (explicitModel)
9
+ lastRequestedModelRef.current = explicitModel;
10
+ // "auto" is a valid Cursor model identifier — pass it through directly
11
+ if (isAuto)
12
+ return "auto";
13
+ return (explicitModel ??
14
+ (config.strictModel ? lastRequestedModelRef.current : undefined) ??
15
+ lastRequestedModelRef.current ??
16
+ config.defaultModel);
17
+ }
18
+ //# sourceMappingURL=resolve-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-model.js","sourceRoot":"","sources":["../../src/lib/resolve-model.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,SAA6B,EAC7B,qBAA2C,EAC3C,MAAoB;IAEpB,MAAM,MAAM,GAAG,SAAS,KAAK,MAAM,CAAC;IACpC,MAAM,aAAa,GAAG,SAAS,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IACnE,IAAI,aAAa;QAAE,qBAAqB,CAAC,OAAO,GAAG,aAAa,CAAC;IAEjE,uEAAuE;IACvE,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,OAAO,CACL,aAAa;QACb,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QAChE,qBAAqB,CAAC,OAAO;QAC7B,MAAM,CAAC,YAAY,CACpB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import * as http from "node:http";
2
+ import * as https from "node:https";
3
+ import type { BridgeConfig } from "./config.js";
4
+ export type BridgeServerOptions = {
5
+ version: string;
6
+ config: BridgeConfig;
7
+ };
8
+ export declare function startBridgeServer(opts: BridgeServerOptions): http.Server | https.Server;
@@ -0,0 +1,35 @@
1
+ import * as fs from "node:fs";
2
+ import * as http from "node:http";
3
+ import * as https from "node:https";
4
+ import { createRequestListener } from "./request-listener.js";
5
+ export function startBridgeServer(opts) {
6
+ const { config } = opts;
7
+ const requestListener = createRequestListener(opts);
8
+ const useTls = Boolean(config.tlsCertPath && config.tlsKeyPath);
9
+ let server;
10
+ if (useTls) {
11
+ const cert = fs.readFileSync(config.tlsCertPath, "utf8");
12
+ const key = fs.readFileSync(config.tlsKeyPath, "utf8");
13
+ server = https.createServer({ cert, key }, requestListener);
14
+ }
15
+ else {
16
+ server = http.createServer(requestListener);
17
+ }
18
+ server.listen(config.port, config.host, () => {
19
+ const scheme = useTls ? "https" : "http";
20
+ console.log(`cursor-api-proxy listening on ${scheme}://${config.host}:${config.port}`);
21
+ console.log(`- agent bin: ${config.agentBin}`);
22
+ console.log(`- workspace: ${config.workspace}`);
23
+ console.log(`- mode: ${config.mode}`);
24
+ console.log(`- default model: ${config.defaultModel}`);
25
+ console.log(`- force: ${config.force}`);
26
+ console.log(`- approve mcps: ${config.approveMcps}`);
27
+ console.log(`- required api key: ${config.requiredKey ? "yes" : "no"}`);
28
+ console.log(`- sessions log: ${config.sessionsLogPath}`);
29
+ console.log(`- chat-only workspace: ${config.chatOnlyWorkspace ? "yes (isolated temp dir)" : "no"}`);
30
+ console.log(`- verbose traffic: ${config.verbose ? "yes (CURSOR_BRIDGE_VERBOSE=true)" : "no"}`);
31
+ console.log(`- max mode: ${config.maxMode ? "yes (CURSOR_BRIDGE_MAX_MODE=true)" : "no"}`);
32
+ });
33
+ return server;
34
+ }
35
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/lib/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AAGpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAO9D,MAAM,UAAU,iBAAiB,CAC/B,IAAyB;IAEzB,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACxB,MAAM,eAAe,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAEpD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC;IAChE,IAAI,MAAkC,CAAC;IAEvC,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,WAAY,EAAE,MAAM,CAAC,CAAC;QAC1D,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,UAAW,EAAE,MAAM,CAAC,CAAC;QACxD,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,eAAe,CAAC,CAAC;IAC9D,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;QAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QACzC,OAAO,CAAC,GAAG,CACT,iCAAiC,MAAM,MAAM,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,CAC1E,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,oBAAoB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACxE,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CACT,0BAA0B,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,IAAI,EAAE,CACxF,CAAC;QACF,OAAO,CAAC,GAAG,CACT,sBAAsB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC,IAAI,EAAE,CACnF,CAAC;QACF,OAAO,CAAC,GAAG,CACT,eAAe,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,mCAAmC,CAAC,CAAC,CAAC,IAAI,EAAE,CAC7E,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { BridgeConfig } from "./config.js";
2
+ export type WorkspaceResult = {
3
+ workspaceDir: string;
4
+ tempDir?: string;
5
+ };
6
+ export declare function resolveWorkspace(config: BridgeConfig, workspaceHeader?: string | string[] | null): WorkspaceResult;
@@ -0,0 +1,15 @@
1
+ import * as fs from "node:fs";
2
+ import * as os from "node:os";
3
+ import * as path from "node:path";
4
+ export function resolveWorkspace(config, workspaceHeader) {
5
+ if (config.chatOnlyWorkspace) {
6
+ const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "cursor-proxy-"));
7
+ return { workspaceDir: tempDir, tempDir };
8
+ }
9
+ const headerWs = typeof workspaceHeader === "string" && workspaceHeader.trim()
10
+ ? workspaceHeader.trim()
11
+ : null;
12
+ const workspaceDir = headerWs ?? config.workspace;
13
+ return { workspaceDir };
14
+ }
15
+ //# sourceMappingURL=workspace.js.map
@@ -0,0 +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"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "cursor-api-proxy",
3
+ "version": "0.3.0",
4
+ "description": "OpenAI-compatible proxy for Cursor CLI — use Cursor models from any LLM client on localhost",
5
+ "private": false,
6
+ "type": "module",
7
+ "files": [
8
+ "dist",
9
+ "!dist/**/*.test.*",
10
+ "package.json"
11
+ ],
12
+ "main": "./dist/client.js",
13
+ "types": "./dist/client.d.ts",
14
+ "exports": {
15
+ ".": {
16
+ "types": "./dist/client.d.ts",
17
+ "import": "./dist/client.js",
18
+ "default": "./dist/client.js"
19
+ },
20
+ "./package.json": "./package.json"
21
+ },
22
+ "bin": {
23
+ "cursor-api-proxy": "./dist/cli.js"
24
+ },
25
+ "scripts": {
26
+ "prepare": "tsc -p tsconfig.json",
27
+ "build": "tsc -p tsconfig.json",
28
+ "start": "node ./dist/cli.js",
29
+ "typecheck": "tsc -p tsconfig.json --noEmit",
30
+ "test": "vitest run",
31
+ "test:watch": "vitest",
32
+ "prepublishOnly": "npm run build && npm test"
33
+ },
34
+ "engines": {
35
+ "node": ">=18"
36
+ },
37
+ "keywords": [
38
+ "cursor",
39
+ "openai",
40
+ "proxy",
41
+ "llm",
42
+ "api"
43
+ ],
44
+ "license": "MIT",
45
+ "devDependencies": {
46
+ "@types/node": "^22.0.0",
47
+ "typescript": "^5.6.0",
48
+ "vitest": "^4.0.18"
49
+ }
50
+ }