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.
- package/README.md +219 -0
- package/dist/cli.d.ts +5 -0
- package/dist/cli.js +53 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +95 -0
- package/dist/client.js +316 -0
- package/dist/client.js.map +1 -0
- package/dist/lib/agent-cmd-args.d.ts +5 -0
- package/dist/lib/agent-cmd-args.js +24 -0
- package/dist/lib/agent-cmd-args.js.map +1 -0
- package/dist/lib/agent-runner.d.ts +12 -0
- package/dist/lib/agent-runner.js +38 -0
- package/dist/lib/agent-runner.js.map +1 -0
- package/dist/lib/anthropic.d.ts +26 -0
- package/dist/lib/anthropic.js +59 -0
- package/dist/lib/anthropic.js.map +1 -0
- package/dist/lib/cli-stream-parser.d.ts +8 -0
- package/dist/lib/cli-stream-parser.js +46 -0
- package/dist/lib/cli-stream-parser.js.map +1 -0
- package/dist/lib/config.d.ts +28 -0
- package/dist/lib/config.js +24 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/cursor-cli.d.ts +9 -0
- package/dist/lib/cursor-cli.js +30 -0
- package/dist/lib/cursor-cli.js.map +1 -0
- package/dist/lib/cursorCli.d.ts +9 -0
- package/dist/lib/cursorCli.js +30 -0
- package/dist/lib/cursorCli.js.map +1 -0
- package/dist/lib/env.d.ts +41 -0
- package/dist/lib/env.js +138 -0
- package/dist/lib/env.js.map +1 -0
- package/dist/lib/handlers/anthropic-messages.d.ts +9 -0
- package/dist/lib/handlers/anthropic-messages.js +124 -0
- package/dist/lib/handlers/anthropic-messages.js.map +1 -0
- package/dist/lib/handlers/chat-completions.d.ts +9 -0
- package/dist/lib/handlers/chat-completions.js +98 -0
- package/dist/lib/handlers/chat-completions.js.map +1 -0
- package/dist/lib/handlers/health.d.ts +7 -0
- package/dist/lib/handlers/health.js +15 -0
- package/dist/lib/handlers/health.js.map +1 -0
- package/dist/lib/handlers/models.d.ts +14 -0
- package/dist/lib/handlers/models.js +34 -0
- package/dist/lib/handlers/models.js.map +1 -0
- package/dist/lib/http.d.ts +5 -0
- package/dist/lib/http.js +32 -0
- package/dist/lib/http.js.map +1 -0
- package/dist/lib/max-mode-preflight.d.ts +5 -0
- package/dist/lib/max-mode-preflight.js +56 -0
- package/dist/lib/max-mode-preflight.js.map +1 -0
- package/dist/lib/model-map.d.ts +17 -0
- package/dist/lib/model-map.js +62 -0
- package/dist/lib/model-map.js.map +1 -0
- package/dist/lib/modelMap.d.ts +17 -0
- package/dist/lib/modelMap.js +62 -0
- package/dist/lib/modelMap.js.map +1 -0
- package/dist/lib/openai.d.ts +7 -0
- package/dist/lib/openai.js +59 -0
- package/dist/lib/openai.js.map +1 -0
- package/dist/lib/process.d.ts +19 -0
- package/dist/lib/process.js +92 -0
- package/dist/lib/process.js.map +1 -0
- package/dist/lib/request-listener.d.ts +7 -0
- package/dist/lib/request-listener.js +70 -0
- package/dist/lib/request-listener.js.map +1 -0
- package/dist/lib/request-log.d.ts +13 -0
- package/dist/lib/request-log.js +110 -0
- package/dist/lib/request-log.js.map +1 -0
- package/dist/lib/requestLog.d.ts +2 -0
- package/dist/lib/requestLog.js +19 -0
- package/dist/lib/requestLog.js.map +1 -0
- package/dist/lib/resolve-model.d.ts +8 -0
- package/dist/lib/resolve-model.js +18 -0
- package/dist/lib/resolve-model.js.map +1 -0
- package/dist/lib/server.d.ts +8 -0
- package/dist/lib/server.js +35 -0
- package/dist/lib/server.js.map +1 -0
- package/dist/lib/workspace.d.ts +6 -0
- package/dist/lib/workspace.js +15 -0
- package/dist/lib/workspace.js.map +1 -0
- 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,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,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
|
+
}
|