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/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/lib/http.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,kBAAkB,CAAC,GAAyB;IAC1D,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACvC,IAAI,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACzB,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAC5C,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,IAAI,
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/lib/http.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,kBAAkB,CAAC,GAAyB;IAC1D,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACvC,IAAI,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACzB,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAC5C,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,IAAI,CAClB,GAAwB,EACxB,MAAc,EACd,IAAa,EACb,YAAuC;IAEvC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE;QACpB,GAAG,YAAY;QACf,cAAc,EAAE,kBAAkB;KACnC,CAAC,CAAC;IACH,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,GAAwB,EACxB,YAAuC;IAEvC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;QACjB,GAAG,YAAY;QACf,cAAc,EAAE,mBAAmB;QACnC,eAAe,EAAE,UAAU;QAC3B,UAAU,EAAE,YAAY;QACxB,mBAAmB,EAAE,IAAI;KAC1B,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAyB;IACtD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACxB,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACvB,IAAI,IAAI,KAAK,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACnC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
* Write maxMode: true to the first writable cli-config.json.
|
|
3
3
|
* Best-effort: ignores errors (e.g. missing or read-only config).
|
|
4
4
|
*/
|
|
5
|
-
export declare function runMaxModePreflight(agentScriptPath?: string): void;
|
|
5
|
+
export declare function runMaxModePreflight(agentScriptPath?: string, configDirOverride?: string): void;
|
|
@@ -7,7 +7,13 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import * as fs from "node:fs";
|
|
9
9
|
import * as path from "node:path";
|
|
10
|
-
function getCandidates(agentScriptPath) {
|
|
10
|
+
function getCandidates(agentScriptPath, configDirOverride) {
|
|
11
|
+
// When a specific config dir is given (multi-account rotation), only target
|
|
12
|
+
// that directory — never fall through to platform defaults which could
|
|
13
|
+
// accidentally write maxMode to a different account's config.
|
|
14
|
+
if (configDirOverride) {
|
|
15
|
+
return [path.join(configDirOverride, "cli-config.json")];
|
|
16
|
+
}
|
|
11
17
|
const result = [];
|
|
12
18
|
if (process.env.CURSOR_CONFIG_DIR) {
|
|
13
19
|
result.push(path.join(process.env.CURSOR_CONFIG_DIR, "cli-config.json"));
|
|
@@ -34,8 +40,8 @@ function getCandidates(agentScriptPath) {
|
|
|
34
40
|
* Write maxMode: true to the first writable cli-config.json.
|
|
35
41
|
* Best-effort: ignores errors (e.g. missing or read-only config).
|
|
36
42
|
*/
|
|
37
|
-
export function runMaxModePreflight(agentScriptPath) {
|
|
38
|
-
for (const candidate of getCandidates(agentScriptPath)) {
|
|
43
|
+
export function runMaxModePreflight(agentScriptPath, configDirOverride) {
|
|
44
|
+
for (const candidate of getCandidates(agentScriptPath, configDirOverride)) {
|
|
39
45
|
try {
|
|
40
46
|
const rawStr = fs.readFileSync(candidate, "utf-8");
|
|
41
47
|
const raw = JSON.parse(rawStr.replace(/^\uFEFF/, ""));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"max-mode-preflight.js","sourceRoot":"","sources":["../../src/lib/max-mode-preflight.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,SAAS,aAAa,
|
|
1
|
+
{"version":3,"file":"max-mode-preflight.js","sourceRoot":"","sources":["../../src/lib/max-mode-preflight.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/openai.d.ts
CHANGED
|
@@ -2,6 +2,16 @@ export type OpenAiChatCompletionRequest = {
|
|
|
2
2
|
model?: string;
|
|
3
3
|
messages: any[];
|
|
4
4
|
stream?: boolean;
|
|
5
|
+
tools?: any[];
|
|
6
|
+
tool_choice?: any;
|
|
7
|
+
functions?: any[];
|
|
8
|
+
function_call?: any;
|
|
5
9
|
};
|
|
6
10
|
export declare function normalizeModelId(raw: string | undefined): string | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* Serialise tool/function schemas into a text block for the system prompt.
|
|
13
|
+
* This allows the model to be aware of available tools even though we can't
|
|
14
|
+
* return tool_call deltas natively.
|
|
15
|
+
*/
|
|
16
|
+
export declare function toolsToSystemText(tools?: any[], functions?: any[]): string | undefined;
|
|
7
17
|
export declare function buildPromptFromMessages(messages: any[]): string;
|
package/dist/lib/openai.js
CHANGED
|
@@ -7,6 +7,22 @@ export function normalizeModelId(raw) {
|
|
|
7
7
|
const parts = trimmed.split("/");
|
|
8
8
|
return parts[parts.length - 1] || undefined;
|
|
9
9
|
}
|
|
10
|
+
function imageUrlToText(imageUrl) {
|
|
11
|
+
if (!imageUrl)
|
|
12
|
+
return "[Image]";
|
|
13
|
+
const url = typeof imageUrl === "string"
|
|
14
|
+
? imageUrl
|
|
15
|
+
: typeof imageUrl?.url === "string"
|
|
16
|
+
? imageUrl.url
|
|
17
|
+
: "";
|
|
18
|
+
if (!url)
|
|
19
|
+
return "[Image]";
|
|
20
|
+
if (url.startsWith("data:")) {
|
|
21
|
+
const mime = url.slice(5, url.indexOf(";")) || "image";
|
|
22
|
+
return `[Image: base64 ${mime}]`;
|
|
23
|
+
}
|
|
24
|
+
return `[Image: ${url}]`;
|
|
25
|
+
}
|
|
10
26
|
function messageContentToText(content) {
|
|
11
27
|
if (typeof content === "string")
|
|
12
28
|
return content;
|
|
@@ -19,12 +35,48 @@ function messageContentToText(content) {
|
|
|
19
35
|
return p;
|
|
20
36
|
if (p.type === "text" && typeof p.text === "string")
|
|
21
37
|
return p.text;
|
|
38
|
+
if (p.type === "image_url")
|
|
39
|
+
return imageUrlToText(p.image_url);
|
|
40
|
+
if (p.type === "image")
|
|
41
|
+
return imageUrlToText(p.source?.url ?? p.url ?? p.source);
|
|
22
42
|
return "";
|
|
23
43
|
})
|
|
24
|
-
.
|
|
44
|
+
.filter(Boolean)
|
|
45
|
+
.join(" ");
|
|
25
46
|
}
|
|
26
47
|
return "";
|
|
27
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* Serialise tool/function schemas into a text block for the system prompt.
|
|
51
|
+
* This allows the model to be aware of available tools even though we can't
|
|
52
|
+
* return tool_call deltas natively.
|
|
53
|
+
*/
|
|
54
|
+
export function toolsToSystemText(tools, functions) {
|
|
55
|
+
const defs = [];
|
|
56
|
+
if (tools && tools.length > 0) {
|
|
57
|
+
for (const t of tools) {
|
|
58
|
+
const fn = t?.type === "function" ? t.function : t;
|
|
59
|
+
if (fn)
|
|
60
|
+
defs.push(fn);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (functions && functions.length > 0) {
|
|
64
|
+
defs.push(...functions);
|
|
65
|
+
}
|
|
66
|
+
if (defs.length === 0)
|
|
67
|
+
return undefined;
|
|
68
|
+
const lines = [
|
|
69
|
+
"Available tools (respond with a JSON object to call one):",
|
|
70
|
+
"",
|
|
71
|
+
...defs.map((fn) => {
|
|
72
|
+
const params = fn.parameters
|
|
73
|
+
? JSON.stringify(fn.parameters, null, 2)
|
|
74
|
+
: "{}";
|
|
75
|
+
return `Function: ${fn.name}\nDescription: ${fn.description ?? ""}\nParameters: ${params}`;
|
|
76
|
+
}),
|
|
77
|
+
];
|
|
78
|
+
return lines.join("\n");
|
|
79
|
+
}
|
|
28
80
|
export function buildPromptFromMessages(messages) {
|
|
29
81
|
const systemParts = [];
|
|
30
82
|
const convo = [];
|
package/dist/lib/openai.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/lib/openai.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/lib/openai.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/process.d.ts
CHANGED
|
@@ -8,10 +8,16 @@ export type RunOptions = {
|
|
|
8
8
|
timeoutMs?: number;
|
|
9
9
|
/** Enable Cursor Max Mode (preflight writes maxMode to cli-config.json). */
|
|
10
10
|
maxMode?: boolean;
|
|
11
|
+
/** Custom config dir for round-robin account rotation */
|
|
12
|
+
configDir?: string;
|
|
13
|
+
/** Abort signal — when aborted, the child process is killed immediately */
|
|
14
|
+
signal?: AbortSignal;
|
|
11
15
|
};
|
|
12
16
|
export type RunStreamingOptions = RunOptions & {
|
|
13
17
|
onLine: (line: string) => void;
|
|
14
18
|
};
|
|
19
|
+
/** Kill all in-flight agent child processes. Called on server shutdown. */
|
|
20
|
+
export declare function killAllChildProcesses(): void;
|
|
15
21
|
export declare function runStreaming(cmd: string, args: string[], opts: RunStreamingOptions): Promise<{
|
|
16
22
|
code: number;
|
|
17
23
|
stderr: string;
|
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":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAuB9D,8EAA8E;AAC9E,6DAA6D;AAC7D,8EAA8E;AAE9E,MAAM,cAAc,GAAG,IAAI,GAAG,EAAgB,CAAC;AAE/C,2EAA2E;AAC3E,MAAM,UAAU,qBAAqB;IACnC,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,oBAAoB;QACtB,CAAC;IACH,CAAC;IACD,cAAc,CAAC,KAAK,EAAE,CAAC;AACzB,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,SAAS,UAAU,CACjB,GAAW,EACX,IAAc,EACd,IAA8D;IAE9D,MAAM,QAAQ,GAAG,mBAAmB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAEhD,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC;QAClB,mBAAmB,CAAC,QAAQ,CAAC,eAAe,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,GAAG,GAAG,EAAE,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC;IAChC,IAAI,IAAI,EAAE,SAAS,EAAE,CAAC;QACpB,GAAG,CAAC,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC;IACzC,CAAC;SAAM,IAAI,QAAQ,CAAC,SAAS,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;QACxD,GAAG,CAAC,iBAAiB,GAAG,QAAQ,CAAC,SAAS,CAAC;IAC7C,CAAC;IAED,OAAO,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,EAAE;QAC5C,GAAG,EAAE,IAAI,EAAE,GAAG;QACd,GAAG;QACH,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;QACjC,wBAAwB,EAAE,QAAQ,CAAC,wBAAwB;KAC5D,CAAC,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E,MAAM,UAAU,YAAY,CAC1B,GAAW,EACX,IAAc,EACd,IAAyB;IAEzB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE;YAClC,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAC;QAEH,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAE1B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QACjC,MAAM,OAAO,GACX,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,GAAG,CAAC;YAC5C,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE;gBACd,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACxB,CAAC,EAAE,SAAS,CAAC;YACf,CAAC,CAAC,SAAS,CAAC;QAEhB,4DAA4D;QAC5D,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QAED,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,UAAU,GAAG,EAAE,CAAC;QAEpB,KAAK,CAAC,MAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAClC,KAAK,CAAC,MAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;QAE/C,KAAK,CAAC,MAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAClC,KAAK,CAAC,MAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACzC,UAAU,IAAI,KAAK,CAAC;YACpB,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrC,UAAU,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;YAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,IAAI,CAAC,IAAI,EAAE;oBAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACrC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAA0B,EAAE,EAAE;YAC/C,IAAI,OAAO;gBAAE,YAAY,CAAC,OAAO,CAAC,CAAC;YACnC,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACnD,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC7B,IAAI,GAAG,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC3B,MAAM,CACJ,IAAI,KAAK,CACP,sBAAsB,GAAG,mEAAmE,CAC7F,CACF,CAAC;gBACF,OAAO;YACT,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YACjC,IAAI,OAAO;gBAAE,YAAY,CAAC,OAAO,CAAC,CAAC;YACnC,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACnD,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC7B,IAAI,UAAU,CAAC,IAAI,EAAE;gBAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;YACtD,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,GAAG,CACjB,GAAW,EACX,IAAc,EACd,OAAmB,EAAE;IAErB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE;YAClC,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAC;QAEH,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAE1B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QACjC,MAAM,OAAO,GACX,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,GAAG,CAAC;YAC5C,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE;gBACd,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACxB,CAAC,EAAE,SAAS,CAAC;YACf,CAAC,CAAC,SAAS,CAAC;QAEhB,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QAED,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,KAAK,CAAC,MAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAClC,KAAK,CAAC,MAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAClC,KAAK,CAAC,MAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/C,KAAK,CAAC,MAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;QAE/C,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAA0B,EAAE,EAAE;YAC/C,IAAI,OAAO;gBAAE,YAAY,CAAC,OAAO,CAAC,CAAC;YACnC,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACnD,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC7B,IAAI,GAAG,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC3B,MAAM,CACJ,IAAI,KAAK,CACP,sBAAsB,GAAG,mEAAmE,CAC7F,CACF,CAAC;gBACF,OAAO;YACT,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YACjC,IAAI,OAAO;gBAAE,YAAY,CAAC,OAAO,CAAC,CAAC;YACnC,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACnD,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC7B,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -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;
|