cursor-api-proxy 0.4.0 → 0.6.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 +91 -36
- 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-cmd-args.d.ts +4 -0
- package/dist/lib/agent-cmd-args.js +8 -3
- package/dist/lib/agent-cmd-args.js.map +1 -1
- 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 +6 -0
- package/dist/lib/config.js +3 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/env.d.ts +9 -0
- package/dist/lib/env.js +71 -8
- package/dist/lib/env.js.map +1 -1
- package/dist/lib/handlers/anthropic-messages.js +83 -15
- package/dist/lib/handlers/anthropic-messages.js.map +1 -1
- package/dist/lib/handlers/chat-completions.js +77 -11
- 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/http.d.ts +2 -2
- package/dist/lib/http.js +7 -3
- package/dist/lib/http.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 +76 -0
- package/dist/lib/server.js.map +1 -1
- package/dist/lib/win-cmdline-limit.d.ts +32 -0
- package/dist/lib/win-cmdline-limit.js +92 -0
- package/dist/lib/win-cmdline-limit.js.map +1 -0
- package/package.json +5 -2
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,10 @@ 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
|
+
console.log(`- Windows cmdline budget: ${config.winCmdlineMax} (prompt tail truncation when over limit; Windows only)`);
|
|
105
|
+
if (config.configDirs && config.configDirs.length > 0) {
|
|
106
|
+
console.log(`- account pool: enabled with ${config.configDirs.length} configuration directories`);
|
|
107
|
+
}
|
|
32
108
|
});
|
|
33
109
|
return server;
|
|
34
110
|
}
|
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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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { AgentCommand } from "./env.js";
|
|
2
|
+
import { type EnvOptions } from "./env.js";
|
|
3
|
+
/** Shown at the start of the prompt when earlier text was dropped on Windows. */
|
|
4
|
+
export declare const WIN_PROMPT_OMISSION_PREFIX = "[Earlier messages omitted: Windows command-line length limit.]\n\n";
|
|
5
|
+
export type FitPromptOk = {
|
|
6
|
+
ok: true;
|
|
7
|
+
args: string[];
|
|
8
|
+
truncated: boolean;
|
|
9
|
+
originalLength: number;
|
|
10
|
+
finalPromptLength: number;
|
|
11
|
+
};
|
|
12
|
+
export type FitPromptErr = {
|
|
13
|
+
ok: false;
|
|
14
|
+
error: string;
|
|
15
|
+
};
|
|
16
|
+
export type FitPromptResult = FitPromptOk | FitPromptErr;
|
|
17
|
+
/**
|
|
18
|
+
* Pessimistic upper bound on UTF-16 code units in the Windows command line
|
|
19
|
+
* Node/libuv passes to CreateProcess (see libuv `make_program_args` sizing).
|
|
20
|
+
*/
|
|
21
|
+
export declare function estimateCmdlineLength(resolved: AgentCommand): number;
|
|
22
|
+
/**
|
|
23
|
+
* On Windows, shrinks the prompt (keeping the tail) so spawn argv stays under
|
|
24
|
+
* `maxCmdline`. Other platforms return the full prompt unchanged.
|
|
25
|
+
*/
|
|
26
|
+
export declare function fitPromptToWinCmdline(agentBin: string, fixedArgs: string[], prompt: string, opts: {
|
|
27
|
+
maxCmdline: number;
|
|
28
|
+
platform: NodeJS.Platform;
|
|
29
|
+
cwd?: string;
|
|
30
|
+
env?: EnvOptions["env"];
|
|
31
|
+
}): FitPromptResult;
|
|
32
|
+
export declare function warnPromptTruncated(originalLength: number, finalLength: number): void;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { resolveAgentCommand } from "./env.js";
|
|
2
|
+
/** Shown at the start of the prompt when earlier text was dropped on Windows. */
|
|
3
|
+
export const WIN_PROMPT_OMISSION_PREFIX = "[Earlier messages omitted: Windows command-line length limit.]\n\n";
|
|
4
|
+
/**
|
|
5
|
+
* Pessimistic upper bound on UTF-16 code units in the Windows command line
|
|
6
|
+
* Node/libuv passes to CreateProcess (see libuv `make_program_args` sizing).
|
|
7
|
+
*/
|
|
8
|
+
export function estimateCmdlineLength(resolved) {
|
|
9
|
+
const argv = [resolved.command, ...resolved.args];
|
|
10
|
+
if (resolved.windowsVerbatimArguments) {
|
|
11
|
+
let n = 0;
|
|
12
|
+
for (const a of argv) {
|
|
13
|
+
n += a.length;
|
|
14
|
+
}
|
|
15
|
+
n += Math.max(0, argv.length - 1);
|
|
16
|
+
return n + 512;
|
|
17
|
+
}
|
|
18
|
+
let dstLen = 0;
|
|
19
|
+
for (const a of argv) {
|
|
20
|
+
dstLen += a.length;
|
|
21
|
+
}
|
|
22
|
+
dstLen = dstLen * 2 + argv.length * 2 + Math.max(0, argv.length - 1);
|
|
23
|
+
return dstLen + 512;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* On Windows, shrinks the prompt (keeping the tail) so spawn argv stays under
|
|
27
|
+
* `maxCmdline`. Other platforms return the full prompt unchanged.
|
|
28
|
+
*/
|
|
29
|
+
export function fitPromptToWinCmdline(agentBin, fixedArgs, prompt, opts) {
|
|
30
|
+
const { maxCmdline, platform, cwd, env } = opts;
|
|
31
|
+
const resolveOpts = { cwd, env, platform };
|
|
32
|
+
if (platform !== "win32") {
|
|
33
|
+
return {
|
|
34
|
+
ok: true,
|
|
35
|
+
args: [...fixedArgs, prompt],
|
|
36
|
+
truncated: false,
|
|
37
|
+
originalLength: prompt.length,
|
|
38
|
+
finalPromptLength: prompt.length,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
const measured = (p) => estimateCmdlineLength(resolveAgentCommand(agentBin, [...fixedArgs, p], resolveOpts));
|
|
42
|
+
const emptyTail = measured("");
|
|
43
|
+
if (emptyTail > maxCmdline) {
|
|
44
|
+
return {
|
|
45
|
+
ok: false,
|
|
46
|
+
error: "Windows command line exceeds the configured limit even without a prompt; shorten workspace path, model id, or CURSOR_BRIDGE_WIN_CMDLINE_MAX.",
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
if (measured(prompt) <= maxCmdline) {
|
|
50
|
+
return {
|
|
51
|
+
ok: true,
|
|
52
|
+
args: [...fixedArgs, prompt],
|
|
53
|
+
truncated: false,
|
|
54
|
+
originalLength: prompt.length,
|
|
55
|
+
finalPromptLength: prompt.length,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
const prefix = WIN_PROMPT_OMISSION_PREFIX;
|
|
59
|
+
if (measured(prefix) > maxCmdline) {
|
|
60
|
+
return {
|
|
61
|
+
ok: false,
|
|
62
|
+
error: "Windows command line too long to fit even the truncation notice; shorten workspace path or flags.",
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
let lo = 0;
|
|
66
|
+
let hi = prompt.length;
|
|
67
|
+
let best = 0;
|
|
68
|
+
while (lo <= hi) {
|
|
69
|
+
const mid = (lo + hi) >> 1;
|
|
70
|
+
const tail = mid === 0 ? "" : prompt.slice(-mid);
|
|
71
|
+
const candidate = prefix + tail;
|
|
72
|
+
if (measured(candidate) <= maxCmdline) {
|
|
73
|
+
best = mid;
|
|
74
|
+
lo = mid + 1;
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
hi = mid - 1;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
const finalPrompt = best === 0 ? prefix : prefix + prompt.slice(-best);
|
|
81
|
+
return {
|
|
82
|
+
ok: true,
|
|
83
|
+
args: [...fixedArgs, finalPrompt],
|
|
84
|
+
truncated: true,
|
|
85
|
+
originalLength: prompt.length,
|
|
86
|
+
finalPromptLength: finalPrompt.length,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
export function warnPromptTruncated(originalLength, finalLength) {
|
|
90
|
+
console.warn(`[${new Date().toISOString()}] Windows: prompt truncated for CreateProcess limit (${originalLength} -> ${finalLength} chars, tail preserved).`);
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=win-cmdline-limit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"win-cmdline-limit.js","sourceRoot":"","sources":["../../src/lib/win-cmdline-limit.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.6.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
|
}
|