cursor-api-proxy 0.4.0 → 0.5.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 +81 -34
- package/dist/cli/accounts.d.ts +18 -0
- package/dist/cli/accounts.js +149 -0
- package/dist/cli/accounts.js.map +1 -0
- package/dist/cli/args.d.ts +14 -0
- package/dist/cli/args.js +93 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/constants.d.ts +1 -0
- package/dist/cli/constants.js +4 -0
- package/dist/cli/constants.js.map +1 -0
- package/dist/cli/login.d.ts +1 -0
- package/dist/cli/login.js +143 -0
- package/dist/cli/login.js.map +1 -0
- package/dist/cli/reset-hwid.d.ts +24 -0
- package/dist/cli/reset-hwid.js +277 -0
- package/dist/cli/reset-hwid.js.map +1 -0
- package/dist/cli/usage.d.ts +31 -0
- package/dist/cli/usage.js +214 -0
- package/dist/cli/usage.js.map +1 -0
- package/dist/cli.d.ts +1 -4
- package/dist/cli.js +40 -35
- package/dist/cli.js.map +1 -1
- package/dist/lib/account-pool.d.ts +35 -0
- package/dist/lib/account-pool.js +143 -0
- package/dist/lib/account-pool.js.map +1 -0
- package/dist/lib/agent-runner.d.ts +2 -2
- package/dist/lib/agent-runner.js +18 -6
- package/dist/lib/agent-runner.js.map +1 -1
- package/dist/lib/anthropic.js +22 -11
- package/dist/lib/anthropic.js.map +1 -1
- package/dist/lib/config.d.ts +4 -0
- package/dist/lib/config.js +2 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/env.d.ts +4 -0
- package/dist/lib/env.js +68 -8
- package/dist/lib/env.js.map +1 -1
- package/dist/lib/handlers/anthropic-messages.js +60 -11
- package/dist/lib/handlers/anthropic-messages.js.map +1 -1
- package/dist/lib/handlers/chat-completions.js +54 -7
- package/dist/lib/handlers/chat-completions.js.map +1 -1
- package/dist/lib/handlers/models.d.ts +1 -0
- package/dist/lib/handlers/models.js +16 -6
- package/dist/lib/handlers/models.js.map +1 -1
- package/dist/lib/max-mode-preflight.d.ts +1 -1
- package/dist/lib/max-mode-preflight.js +9 -3
- package/dist/lib/max-mode-preflight.js.map +1 -1
- package/dist/lib/openai.d.ts +10 -0
- package/dist/lib/openai.js +53 -1
- package/dist/lib/openai.js.map +1 -1
- package/dist/lib/process.d.ts +6 -0
- package/dist/lib/process.js +71 -9
- package/dist/lib/process.js.map +1 -1
- package/dist/lib/request-listener.js +28 -4
- package/dist/lib/request-listener.js.map +1 -1
- package/dist/lib/request-log.d.ts +3 -0
- package/dist/lib/request-log.js +37 -0
- package/dist/lib/request-log.js.map +1 -1
- package/dist/lib/sanitize.d.ts +21 -0
- package/dist/lib/sanitize.js +79 -0
- package/dist/lib/sanitize.js.map +1 -0
- package/dist/lib/server.d.ts +6 -1
- package/dist/lib/server.js +75 -0
- package/dist/lib/server.js.map +1 -1
- package/package.json +5 -2
package/dist/lib/process.js
CHANGED
|
@@ -1,13 +1,35 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
2
|
import { resolveAgentCommand } from "./env.js";
|
|
3
3
|
import { runMaxModePreflight } from "./max-mode-preflight.js";
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
// Global child process registry — used for graceful shutdown
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
const activeChildren = new Set();
|
|
8
|
+
/** Kill all in-flight agent child processes. Called on server shutdown. */
|
|
9
|
+
export function killAllChildProcesses() {
|
|
10
|
+
for (const child of activeChildren) {
|
|
11
|
+
try {
|
|
12
|
+
child.kill("SIGTERM");
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
/* already exited */
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
activeChildren.clear();
|
|
19
|
+
}
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// Internal helpers
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
4
23
|
function spawnChild(cmd, args, opts) {
|
|
5
24
|
const resolved = resolveAgentCommand(cmd, args);
|
|
6
|
-
if (opts?.maxMode
|
|
7
|
-
runMaxModePreflight(resolved.agentScriptPath);
|
|
25
|
+
if (opts?.maxMode) {
|
|
26
|
+
runMaxModePreflight(resolved.agentScriptPath, opts?.configDir);
|
|
8
27
|
}
|
|
9
28
|
const env = { ...resolved.env };
|
|
10
|
-
if (
|
|
29
|
+
if (opts?.configDir) {
|
|
30
|
+
env.CURSOR_CONFIG_DIR = opts.configDir;
|
|
31
|
+
}
|
|
32
|
+
else if (resolved.configDir && !env.CURSOR_CONFIG_DIR) {
|
|
11
33
|
env.CURSOR_CONFIG_DIR = resolved.configDir;
|
|
12
34
|
}
|
|
13
35
|
return spawn(resolved.command, resolved.args, {
|
|
@@ -17,15 +39,33 @@ function spawnChild(cmd, args, opts) {
|
|
|
17
39
|
windowsVerbatimArguments: resolved.windowsVerbatimArguments,
|
|
18
40
|
});
|
|
19
41
|
}
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
// Public API
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
20
45
|
export function runStreaming(cmd, args, opts) {
|
|
21
46
|
return new Promise((resolve, reject) => {
|
|
22
|
-
const child = spawnChild(cmd, args, {
|
|
47
|
+
const child = spawnChild(cmd, args, {
|
|
48
|
+
cwd: opts.cwd,
|
|
49
|
+
maxMode: opts.maxMode,
|
|
50
|
+
configDir: opts.configDir,
|
|
51
|
+
});
|
|
52
|
+
activeChildren.add(child);
|
|
23
53
|
const timeoutMs = opts.timeoutMs;
|
|
24
54
|
const timeout = typeof timeoutMs === "number" && timeoutMs > 0
|
|
25
55
|
? setTimeout(() => {
|
|
26
56
|
child.kill("SIGKILL");
|
|
27
57
|
}, timeoutMs)
|
|
28
58
|
: undefined;
|
|
59
|
+
// Abort signal support — kill child when client disconnects
|
|
60
|
+
const onAbort = () => child.kill("SIGTERM");
|
|
61
|
+
if (opts.signal) {
|
|
62
|
+
if (opts.signal.aborted) {
|
|
63
|
+
child.kill("SIGTERM");
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
opts.signal.addEventListener("abort", onAbort, { once: true });
|
|
67
|
+
}
|
|
68
|
+
}
|
|
29
69
|
let stderr = "";
|
|
30
70
|
let lineBuffer = "";
|
|
31
71
|
child.stderr.setEncoding("utf8");
|
|
@@ -43,30 +83,48 @@ export function runStreaming(cmd, args, opts) {
|
|
|
43
83
|
child.on("error", (err) => {
|
|
44
84
|
if (timeout)
|
|
45
85
|
clearTimeout(timeout);
|
|
86
|
+
opts.signal?.removeEventListener("abort", onAbort);
|
|
87
|
+
activeChildren.delete(child);
|
|
46
88
|
if (err?.code === "ENOENT") {
|
|
47
89
|
reject(new Error(`Command not found: ${cmd}. Install Cursor CLI (agent) or set CURSOR_AGENT_BIN to its path.`));
|
|
48
90
|
return;
|
|
49
91
|
}
|
|
50
92
|
reject(err);
|
|
51
93
|
});
|
|
52
|
-
child.on("close", (code) => {
|
|
94
|
+
child.on("close", (code, signal) => {
|
|
53
95
|
if (timeout)
|
|
54
96
|
clearTimeout(timeout);
|
|
97
|
+
opts.signal?.removeEventListener("abort", onAbort);
|
|
98
|
+
activeChildren.delete(child);
|
|
55
99
|
if (lineBuffer.trim())
|
|
56
100
|
opts.onLine(lineBuffer.trim());
|
|
57
|
-
resolve({ code: code ?? 0, stderr });
|
|
101
|
+
resolve({ code: code ?? (signal ? -1 : 0), stderr });
|
|
58
102
|
});
|
|
59
103
|
});
|
|
60
104
|
}
|
|
61
105
|
export function run(cmd, args, opts = {}) {
|
|
62
106
|
return new Promise((resolve, reject) => {
|
|
63
|
-
const child = spawnChild(cmd, args, {
|
|
107
|
+
const child = spawnChild(cmd, args, {
|
|
108
|
+
cwd: opts.cwd,
|
|
109
|
+
maxMode: opts.maxMode,
|
|
110
|
+
configDir: opts.configDir,
|
|
111
|
+
});
|
|
112
|
+
activeChildren.add(child);
|
|
64
113
|
const timeoutMs = opts.timeoutMs;
|
|
65
114
|
const timeout = typeof timeoutMs === "number" && timeoutMs > 0
|
|
66
115
|
? setTimeout(() => {
|
|
67
116
|
child.kill("SIGKILL");
|
|
68
117
|
}, timeoutMs)
|
|
69
118
|
: undefined;
|
|
119
|
+
const onAbort = () => child.kill("SIGTERM");
|
|
120
|
+
if (opts.signal) {
|
|
121
|
+
if (opts.signal.aborted) {
|
|
122
|
+
child.kill("SIGTERM");
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
opts.signal.addEventListener("abort", onAbort, { once: true });
|
|
126
|
+
}
|
|
127
|
+
}
|
|
70
128
|
let stdout = "";
|
|
71
129
|
let stderr = "";
|
|
72
130
|
child.stdout.setEncoding("utf8");
|
|
@@ -76,16 +134,20 @@ export function run(cmd, args, opts = {}) {
|
|
|
76
134
|
child.on("error", (err) => {
|
|
77
135
|
if (timeout)
|
|
78
136
|
clearTimeout(timeout);
|
|
137
|
+
opts.signal?.removeEventListener("abort", onAbort);
|
|
138
|
+
activeChildren.delete(child);
|
|
79
139
|
if (err?.code === "ENOENT") {
|
|
80
140
|
reject(new Error(`Command not found: ${cmd}. Install Cursor CLI (agent) or set CURSOR_AGENT_BIN to its path.`));
|
|
81
141
|
return;
|
|
82
142
|
}
|
|
83
143
|
reject(err);
|
|
84
144
|
});
|
|
85
|
-
child.on("close", (code) => {
|
|
145
|
+
child.on("close", (code, signal) => {
|
|
86
146
|
if (timeout)
|
|
87
147
|
clearTimeout(timeout);
|
|
88
|
-
|
|
148
|
+
opts.signal?.removeEventListener("abort", onAbort);
|
|
149
|
+
activeChildren.delete(child);
|
|
150
|
+
resolve({ code: code ?? (signal ? -1 : 0), stdout, stderr });
|
|
89
151
|
});
|
|
90
152
|
});
|
|
91
153
|
}
|
package/dist/lib/process.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/lib/process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/lib/process.ts"],"names":[],"mappings":"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"}
|
|
@@ -47,7 +47,26 @@ export function createRequestListener(opts) {
|
|
|
47
47
|
await handleAnthropicMessages(req, res, { config, lastRequestedModelRef }, raw, method, pathname, remoteAddress);
|
|
48
48
|
return;
|
|
49
49
|
}
|
|
50
|
-
|
|
50
|
+
if ((req.method === "POST" || req.method === "GET") &&
|
|
51
|
+
pathname === "/v1/completions") {
|
|
52
|
+
json(res, 404, {
|
|
53
|
+
error: {
|
|
54
|
+
message: "Legacy completions endpoint is not supported. Use POST /v1/chat/completions instead.",
|
|
55
|
+
code: "not_found",
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
else if (pathname === "/v1/embeddings") {
|
|
60
|
+
json(res, 404, {
|
|
61
|
+
error: {
|
|
62
|
+
message: "Embeddings are not supported by this proxy.",
|
|
63
|
+
code: "not_found",
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
json(res, 404, { error: { message: "Not found", code: "not_found" } });
|
|
69
|
+
}
|
|
51
70
|
}
|
|
52
71
|
catch (err) {
|
|
53
72
|
const msg = err instanceof Error ? err.message : String(err);
|
|
@@ -61,9 +80,14 @@ export function createRequestListener(opts) {
|
|
|
61
80
|
catch {
|
|
62
81
|
/* ignore */
|
|
63
82
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
83
|
+
if (!res.headersSent) {
|
|
84
|
+
json(res, 500, {
|
|
85
|
+
error: { message: msg, code: "internal_error" },
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
res.end();
|
|
90
|
+
}
|
|
67
91
|
}
|
|
68
92
|
};
|
|
69
93
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-listener.js","sourceRoot":"","sources":["../../src/lib/request-listener.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAK9B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAOlE,MAAM,UAAU,qBAAqB,CAAC,IAAyB;IAC7D,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACxB,MAAM,aAAa,GAA6B,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IACvE,MAAM,qBAAqB,GAAyB,EAAE,CAAC;IAEvD,OAAO,KAAK,EAAE,GAAyB,EAAE,GAAwB,EAAE,EAAE;QACnE,MAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"request-listener.js","sourceRoot":"","sources":["../../src/lib/request-listener.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
import type { AccountStat } from "./account-pool.js";
|
|
1
2
|
export declare function logIncoming(method: string, pathname: string, remoteAddress: string): void;
|
|
2
3
|
export type TrafficMessage = {
|
|
3
4
|
role: string;
|
|
4
5
|
content: string;
|
|
5
6
|
};
|
|
7
|
+
export declare function logAccountAssigned(configDir: string | undefined): void;
|
|
8
|
+
export declare function logAccountStats(verbose: boolean, stats: AccountStat[]): void;
|
|
6
9
|
export declare function logTrafficRequest(verbose: boolean, model: string, messages: TrafficMessage[], isStream: boolean): void;
|
|
7
10
|
export declare function logTrafficResponse(verbose: boolean, model: string, text: string, isStream: boolean): void;
|
|
8
11
|
export declare function appendSessionLine(logPath: string, method: string, pathname: string, remoteAddress: string, statusCode: number): void;
|
package/dist/lib/request-log.js
CHANGED
|
@@ -46,6 +46,43 @@ function truncate(s, max) {
|
|
|
46
46
|
function hr(char = "─", len = 60) {
|
|
47
47
|
return C.gray + char.repeat(len) + C.reset;
|
|
48
48
|
}
|
|
49
|
+
export function logAccountAssigned(configDir) {
|
|
50
|
+
if (!configDir)
|
|
51
|
+
return;
|
|
52
|
+
const name = path.basename(configDir);
|
|
53
|
+
console.log(`[${new Date().toISOString()}] ${C.bCyan}→ account${C.reset} ${C.bold}${name}${C.reset}`);
|
|
54
|
+
}
|
|
55
|
+
export function logAccountStats(verbose, stats) {
|
|
56
|
+
if (!verbose || stats.length === 0)
|
|
57
|
+
return;
|
|
58
|
+
const now = Date.now();
|
|
59
|
+
const lines = [];
|
|
60
|
+
for (const s of stats) {
|
|
61
|
+
const name = path.basename(s.configDir).padEnd(20);
|
|
62
|
+
const active = s.activeRequests > 0
|
|
63
|
+
? `${C.bCyan}active:${s.activeRequests}${C.reset}`
|
|
64
|
+
: `${C.dim}active:0${C.reset}`;
|
|
65
|
+
const total = `total:${C.bold}${s.totalRequests}${C.reset}`;
|
|
66
|
+
const ok = `${C.green}ok:${s.totalSuccess}${C.reset}`;
|
|
67
|
+
const err = s.totalErrors > 0
|
|
68
|
+
? `${C.red}err:${s.totalErrors}${C.reset}`
|
|
69
|
+
: `${C.dim}err:0${C.reset}`;
|
|
70
|
+
const rl = s.totalRateLimits > 0
|
|
71
|
+
? `${C.yellow}rl:${s.totalRateLimits}${C.reset}`
|
|
72
|
+
: `${C.dim}rl:0${C.reset}`;
|
|
73
|
+
const avg = s.totalRequests > 0
|
|
74
|
+
? `avg:${Math.round(s.totalLatencyMs / s.totalRequests)}ms`
|
|
75
|
+
: `avg:-`;
|
|
76
|
+
const status = s.isRateLimited
|
|
77
|
+
? `${C.red}⛔ rate-limited (recovers ${new Date(s.rateLimitUntil).toISOString()})${C.reset}`
|
|
78
|
+
: `${C.green}✓${C.reset}`;
|
|
79
|
+
lines.push(` ${C.bold}${name}${C.reset} ${active} ${total} ${ok} ${err} ${rl} ${C.dim}${avg}${C.reset} ${status}`);
|
|
80
|
+
}
|
|
81
|
+
console.log(`${C.gray}┌─ Account Stats ${"─".repeat(44)}┐${C.reset}`);
|
|
82
|
+
for (const l of lines)
|
|
83
|
+
console.log(l);
|
|
84
|
+
console.log(`${C.gray}└${"─".repeat(60)}┘${C.reset}`);
|
|
85
|
+
}
|
|
49
86
|
export function logTrafficRequest(verbose, model, messages, isStream) {
|
|
50
87
|
if (!verbose)
|
|
51
88
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-log.js","sourceRoot":"","sources":["../../src/lib/request-log.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"request-log.js","sourceRoot":"","sources":["../../src/lib/request-log.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sanitizes prompts passed to the Cursor CLI agent by stripping/replacing
|
|
3
|
+
* third-party AI branding, telemetry headers, and identifying metadata that
|
|
4
|
+
* could indicate the request originated outside of Cursor.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Apply all sanitization rules to a string.
|
|
8
|
+
* Safe to call with any string; returns the original value if nothing matched.
|
|
9
|
+
*/
|
|
10
|
+
export declare function sanitizeText(text: string): string;
|
|
11
|
+
/** Alias kept for backwards compat. */
|
|
12
|
+
export declare const sanitizePrompt: typeof sanitizeText;
|
|
13
|
+
/**
|
|
14
|
+
* Sanitize an OpenAI-style messages array in place (returns a new array).
|
|
15
|
+
* Handles both string and array content parts.
|
|
16
|
+
*/
|
|
17
|
+
export declare function sanitizeMessages(messages: any[]): any[];
|
|
18
|
+
/**
|
|
19
|
+
* Sanitize an Anthropic-style system field (string or content-block array).
|
|
20
|
+
*/
|
|
21
|
+
export declare function sanitizeSystem(system: any): any;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sanitizes prompts passed to the Cursor CLI agent by stripping/replacing
|
|
3
|
+
* third-party AI branding, telemetry headers, and identifying metadata that
|
|
4
|
+
* could indicate the request originated outside of Cursor.
|
|
5
|
+
*/
|
|
6
|
+
const RULES = [
|
|
7
|
+
// Strip x-anthropic-billing-header prefix (injected by Claude Code CLI)
|
|
8
|
+
[/x-anthropic-billing-header:[^\n]*\n?/gi, ""],
|
|
9
|
+
// Strip individual telemetry tokens that may appear in headers or text
|
|
10
|
+
[/\bcc_version=[^\s;,\n]+[;,]?\s*/gi, ""],
|
|
11
|
+
[/\bcc_entrypoint=[^\s;,\n]+[;,]?\s*/gi, ""],
|
|
12
|
+
[/\bcch=[a-f0-9]+[;,]?\s*/gi, ""],
|
|
13
|
+
// Replace "Claude Code" product name with "Cursor"
|
|
14
|
+
[/\bClaude Code\b/g, "Cursor"],
|
|
15
|
+
// Replace full Anthropic CLI description
|
|
16
|
+
[/Anthropic['']s official CLI for Claude/gi, "Cursor AI assistant"],
|
|
17
|
+
// Replace remaining Anthropic company brand references
|
|
18
|
+
[/\bAnthropic\b/g, "Cursor"],
|
|
19
|
+
// Replace known Anthropic domains
|
|
20
|
+
[/anthropic\.com/gi, "cursor.com"],
|
|
21
|
+
[/claude\.ai/gi, "cursor.sh"],
|
|
22
|
+
// Normalise leftover leading semicolons/whitespace at start of content
|
|
23
|
+
[/^[;,\s]+/, ""],
|
|
24
|
+
];
|
|
25
|
+
/**
|
|
26
|
+
* Apply all sanitization rules to a string.
|
|
27
|
+
* Safe to call with any string; returns the original value if nothing matched.
|
|
28
|
+
*/
|
|
29
|
+
export function sanitizeText(text) {
|
|
30
|
+
let s = text;
|
|
31
|
+
for (const [pattern, replacement] of RULES) {
|
|
32
|
+
s = s.replace(pattern, replacement);
|
|
33
|
+
}
|
|
34
|
+
return s;
|
|
35
|
+
}
|
|
36
|
+
/** Alias kept for backwards compat. */
|
|
37
|
+
export const sanitizePrompt = sanitizeText;
|
|
38
|
+
/**
|
|
39
|
+
* Sanitize an OpenAI-style messages array in place (returns a new array).
|
|
40
|
+
* Handles both string and array content parts.
|
|
41
|
+
*/
|
|
42
|
+
export function sanitizeMessages(messages) {
|
|
43
|
+
return (messages ?? []).map((m) => {
|
|
44
|
+
if (!m)
|
|
45
|
+
return m;
|
|
46
|
+
if (typeof m.content === "string") {
|
|
47
|
+
return { ...m, content: sanitizeText(m.content) };
|
|
48
|
+
}
|
|
49
|
+
if (Array.isArray(m.content)) {
|
|
50
|
+
return {
|
|
51
|
+
...m,
|
|
52
|
+
content: m.content.map((p) => {
|
|
53
|
+
if (p?.type === "text" && typeof p.text === "string") {
|
|
54
|
+
return { ...p, text: sanitizeText(p.text) };
|
|
55
|
+
}
|
|
56
|
+
return p;
|
|
57
|
+
}),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
return m;
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Sanitize an Anthropic-style system field (string or content-block array).
|
|
65
|
+
*/
|
|
66
|
+
export function sanitizeSystem(system) {
|
|
67
|
+
if (typeof system === "string")
|
|
68
|
+
return sanitizeText(system);
|
|
69
|
+
if (Array.isArray(system)) {
|
|
70
|
+
return system.map((p) => {
|
|
71
|
+
if (p?.type === "text" && typeof p.text === "string") {
|
|
72
|
+
return { ...p, text: sanitizeText(p.text) };
|
|
73
|
+
}
|
|
74
|
+
return p;
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
return system;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=sanitize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../../src/lib/sanitize.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,KAAK,GAA4B;IACrC,wEAAwE;IACxE,CAAC,wCAAwC,EAAE,EAAE,CAAC;IAC9C,uEAAuE;IACvE,CAAC,mCAAmC,EAAE,EAAE,CAAC;IACzC,CAAC,sCAAsC,EAAE,EAAE,CAAC;IAC5C,CAAC,2BAA2B,EAAE,EAAE,CAAC;IACjC,mDAAmD;IACnD,CAAC,kBAAkB,EAAE,QAAQ,CAAC;IAC9B,yCAAyC;IACzC,CAAC,0CAA0C,EAAE,qBAAqB,CAAC;IACnE,uDAAuD;IACvD,CAAC,gBAAgB,EAAE,QAAQ,CAAC;IAC5B,kCAAkC;IAClC,CAAC,kBAAkB,EAAE,YAAY,CAAC;IAClC,CAAC,cAAc,EAAE,WAAW,CAAC;IAC7B,uEAAuE;IACvE,CAAC,UAAU,EAAE,EAAE,CAAC;CACjB,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,IAAI,CAAC,GAAG,IAAI,CAAC;IACb,KAAK,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,KAAK,EAAE,CAAC;QAC3C,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,uCAAuC;AACvC,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAC;AAE3C;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAe;IAC9C,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE;QACrC,IAAI,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;QACjB,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YAClC,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;QACpD,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,OAAO;gBACL,GAAG,CAAC;gBACJ,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE;oBAChC,IAAI,CAAC,EAAE,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;wBACrD,OAAO,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC9C,CAAC;oBACD,OAAO,CAAC,CAAC;gBACX,CAAC,CAAC;aACH,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAW;IACxC,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;IAC5D,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE;YAC3B,IAAI,CAAC,EAAE,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrD,OAAO,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9C,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/lib/server.d.ts
CHANGED
|
@@ -5,4 +5,9 @@ export type BridgeServerOptions = {
|
|
|
5
5
|
version: string;
|
|
6
6
|
config: BridgeConfig;
|
|
7
7
|
};
|
|
8
|
-
export declare function startBridgeServer(opts: BridgeServerOptions): http.Server | https.Server;
|
|
8
|
+
export declare function startBridgeServer(opts: BridgeServerOptions): (http.Server | https.Server)[];
|
|
9
|
+
/**
|
|
10
|
+
* Register SIGTERM / SIGINT handlers for graceful shutdown.
|
|
11
|
+
* Closes all HTTP(S) servers, kills in-flight agent processes, then exits.
|
|
12
|
+
*/
|
|
13
|
+
export declare function setupGracefulShutdown(servers: (http.Server | https.Server)[], timeoutMs?: number): void;
|
package/dist/lib/server.js
CHANGED
|
@@ -2,7 +2,70 @@ import * as fs from "node:fs";
|
|
|
2
2
|
import * as http from "node:http";
|
|
3
3
|
import * as https from "node:https";
|
|
4
4
|
import { createRequestListener } from "./request-listener.js";
|
|
5
|
+
import { initAccountPool } from "./account-pool.js";
|
|
6
|
+
import { killAllChildProcesses } from "./process.js";
|
|
5
7
|
export function startBridgeServer(opts) {
|
|
8
|
+
const { config } = opts;
|
|
9
|
+
const servers = [];
|
|
10
|
+
if (config.configDirs && config.configDirs.length > 0) {
|
|
11
|
+
if (config.multiPort) {
|
|
12
|
+
// In multi-port mode, we don't need a central pool. We spawn a server for each configDir
|
|
13
|
+
config.configDirs.forEach((dir, index) => {
|
|
14
|
+
const port = config.port + index;
|
|
15
|
+
const serverOpts = {
|
|
16
|
+
...opts,
|
|
17
|
+
config: {
|
|
18
|
+
...config,
|
|
19
|
+
port,
|
|
20
|
+
configDirs: [dir], // each server gets only one configDir
|
|
21
|
+
multiPort: false, // Disable multi-port for child servers to prevent recursion
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
const server = startSingleServer(serverOpts);
|
|
25
|
+
servers.push(server);
|
|
26
|
+
});
|
|
27
|
+
return servers;
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
initAccountPool(config.configDirs);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
servers.push(startSingleServer(opts));
|
|
34
|
+
return servers;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Register SIGTERM / SIGINT handlers for graceful shutdown.
|
|
38
|
+
* Closes all HTTP(S) servers, kills in-flight agent processes, then exits.
|
|
39
|
+
*/
|
|
40
|
+
export function setupGracefulShutdown(servers, timeoutMs = 10_000) {
|
|
41
|
+
let shuttingDown = false;
|
|
42
|
+
const shutdown = (signal) => {
|
|
43
|
+
if (shuttingDown)
|
|
44
|
+
return;
|
|
45
|
+
shuttingDown = true;
|
|
46
|
+
console.log(`\n[${new Date().toISOString()}] ${signal} received — shutting down gracefully…`);
|
|
47
|
+
// Stop accepting new connections and kill all in-flight agent processes
|
|
48
|
+
killAllChildProcesses();
|
|
49
|
+
const closePromises = servers.map((s) => new Promise((resolve) => {
|
|
50
|
+
// closeAllConnections available since Node 18.2
|
|
51
|
+
if (typeof s.closeAllConnections === "function") {
|
|
52
|
+
s.closeAllConnections();
|
|
53
|
+
}
|
|
54
|
+
s.close(() => resolve());
|
|
55
|
+
}));
|
|
56
|
+
const forceExit = setTimeout(() => {
|
|
57
|
+
console.error("[shutdown] Timed out waiting for connections to drain — forcing exit.");
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}, timeoutMs).unref();
|
|
60
|
+
Promise.all(closePromises).then(() => {
|
|
61
|
+
clearTimeout(forceExit);
|
|
62
|
+
process.exit(0);
|
|
63
|
+
});
|
|
64
|
+
};
|
|
65
|
+
process.once("SIGTERM", () => shutdown("SIGTERM"));
|
|
66
|
+
process.once("SIGINT", () => shutdown("SIGINT"));
|
|
67
|
+
}
|
|
68
|
+
function startSingleServer(opts) {
|
|
6
69
|
const { config } = opts;
|
|
7
70
|
const requestListener = createRequestListener(opts);
|
|
8
71
|
const useTls = Boolean(config.tlsCertPath && config.tlsKeyPath);
|
|
@@ -15,6 +78,15 @@ export function startBridgeServer(opts) {
|
|
|
15
78
|
else {
|
|
16
79
|
server = http.createServer(requestListener);
|
|
17
80
|
}
|
|
81
|
+
server.on("error", (err) => {
|
|
82
|
+
if (err.code === "EADDRINUSE") {
|
|
83
|
+
console.error(`\u274c Port ${config.port} is already in use. Set CURSOR_BRIDGE_PORT to use a different port.`);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
console.error(`\u274c Server error:`, err.message);
|
|
87
|
+
}
|
|
88
|
+
process.exit(1);
|
|
89
|
+
});
|
|
18
90
|
server.listen(config.port, config.host, () => {
|
|
19
91
|
const scheme = useTls ? "https" : "http";
|
|
20
92
|
console.log(`cursor-api-proxy listening on ${scheme}://${config.host}:${config.port}`);
|
|
@@ -29,6 +101,9 @@ export function startBridgeServer(opts) {
|
|
|
29
101
|
console.log(`- chat-only workspace: ${config.chatOnlyWorkspace ? "yes (isolated temp dir)" : "no"}`);
|
|
30
102
|
console.log(`- verbose traffic: ${config.verbose ? "yes (CURSOR_BRIDGE_VERBOSE=true)" : "no"}`);
|
|
31
103
|
console.log(`- max mode: ${config.maxMode ? "yes (CURSOR_BRIDGE_MAX_MODE=true)" : "no"}`);
|
|
104
|
+
if (config.configDirs && config.configDirs.length > 0) {
|
|
105
|
+
console.log(`- account pool: enabled with ${config.configDirs.length} configuration directories`);
|
|
106
|
+
}
|
|
32
107
|
});
|
|
33
108
|
return server;
|
|
34
109
|
}
|
package/dist/lib/server.js.map
CHANGED
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/lib/server.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.
|
|
3
|
+
"version": "0.5.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",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"./package.json": "./package.json"
|
|
21
21
|
},
|
|
22
22
|
"bin": {
|
|
23
|
-
"cursor-api-proxy": "
|
|
23
|
+
"cursor-api-proxy": "dist/cli.js"
|
|
24
24
|
},
|
|
25
25
|
"scripts": {
|
|
26
26
|
"prepare": "tsc -p tsconfig.json",
|
|
@@ -46,5 +46,8 @@
|
|
|
46
46
|
"@types/node": "^22.0.0",
|
|
47
47
|
"typescript": "^5.6.0",
|
|
48
48
|
"vitest": "^4.0.18"
|
|
49
|
+
},
|
|
50
|
+
"dependencies": {
|
|
51
|
+
"chrome-launcher": "^1.2.1"
|
|
49
52
|
}
|
|
50
53
|
}
|