cursor-api-proxy 0.3.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
|
@@ -5,15 +5,28 @@ import { runAgentStream, runAgentSync } from "../agent-runner.js";
|
|
|
5
5
|
import { createStreamParser } from "../cli-stream-parser.js";
|
|
6
6
|
import { json, writeSseHeaders } from "../http.js";
|
|
7
7
|
import { resolveToCursorModel } from "../model-map.js";
|
|
8
|
-
import { normalizeModelId } from "../openai.js";
|
|
9
|
-
import { logAgentError, logTrafficRequest, logTrafficResponse, } from "../request-log.js";
|
|
8
|
+
import { normalizeModelId, toolsToSystemText } from "../openai.js";
|
|
9
|
+
import { logAgentError, logAccountAssigned, logAccountStats, logTrafficRequest, logTrafficResponse, } from "../request-log.js";
|
|
10
10
|
import { resolveModel } from "../resolve-model.js";
|
|
11
11
|
import { resolveWorkspace } from "../workspace.js";
|
|
12
|
+
import { sanitizeMessages, sanitizeSystem } from "../sanitize.js";
|
|
13
|
+
import { getNextAccountConfigDir, reportRequestStart, reportRequestEnd, reportRateLimit, reportRequestSuccess, reportRequestError, getAccountStats, } from "../account-pool.js";
|
|
14
|
+
function isRateLimited(stderr) {
|
|
15
|
+
return /\b429\b|rate.?limit|too many requests/i.test(stderr);
|
|
16
|
+
}
|
|
12
17
|
export async function handleAnthropicMessages(req, res, ctx, rawBody, method, pathname, remoteAddress) {
|
|
13
18
|
const { config, lastRequestedModelRef } = ctx;
|
|
14
19
|
const body = JSON.parse(rawBody || "{}");
|
|
15
20
|
const requested = normalizeModelId(body.model);
|
|
16
21
|
const model = resolveModel(requested, lastRequestedModelRef, config);
|
|
22
|
+
const cleanSystem = sanitizeSystem(body.system);
|
|
23
|
+
const cleanMessages = sanitizeMessages(body.messages ?? []);
|
|
24
|
+
// Inject Anthropic tool schemas as a system text block
|
|
25
|
+
const toolsText = toolsToSystemText(body.tools);
|
|
26
|
+
const systemWithTools = toolsText
|
|
27
|
+
? [cleanSystem, toolsText].filter(Boolean).join("\n\n")
|
|
28
|
+
: cleanSystem;
|
|
29
|
+
const prompt = buildPromptFromAnthropicMessages(cleanMessages, systemWithTools);
|
|
17
30
|
if (body.max_tokens == null || typeof body.max_tokens !== "number") {
|
|
18
31
|
json(res, 400, {
|
|
19
32
|
error: {
|
|
@@ -24,19 +37,18 @@ export async function handleAnthropicMessages(req, res, ctx, rawBody, method, pa
|
|
|
24
37
|
return;
|
|
25
38
|
}
|
|
26
39
|
const cursorModel = resolveToCursorModel(model) ?? model;
|
|
27
|
-
const prompt = buildPromptFromAnthropicMessages(body.messages, body.system);
|
|
28
40
|
const trafficMessages = [];
|
|
29
|
-
if (
|
|
30
|
-
const sys = typeof
|
|
31
|
-
?
|
|
32
|
-
:
|
|
41
|
+
if (cleanSystem) {
|
|
42
|
+
const sys = typeof cleanSystem === "string"
|
|
43
|
+
? cleanSystem
|
|
44
|
+
: cleanSystem
|
|
33
45
|
.filter((p) => p.type === "text")
|
|
34
46
|
.map((p) => p.text ?? "")
|
|
35
47
|
.join("\n");
|
|
36
48
|
if (sys.trim())
|
|
37
49
|
trafficMessages.push({ role: "system", content: sys.trim() });
|
|
38
50
|
}
|
|
39
|
-
for (const m of
|
|
51
|
+
for (const m of cleanMessages) {
|
|
40
52
|
const text = typeof m.content === "string"
|
|
41
53
|
? m.content
|
|
42
54
|
: m.content
|
|
@@ -53,6 +65,9 @@ export async function handleAnthropicMessages(req, res, ctx, rawBody, method, pa
|
|
|
53
65
|
const msgId = `msg_${randomUUID().replace(/-/g, "")}`;
|
|
54
66
|
if (body.stream) {
|
|
55
67
|
writeSseHeaders(res);
|
|
68
|
+
res.on("error", () => {
|
|
69
|
+
/* client disconnected mid-stream */
|
|
70
|
+
});
|
|
56
71
|
const writeEvent = (evt) => {
|
|
57
72
|
res.write(`data: ${JSON.stringify(evt)}\n\n`);
|
|
58
73
|
};
|
|
@@ -84,33 +99,67 @@ export async function handleAnthropicMessages(req, res, ctx, rawBody, method, pa
|
|
|
84
99
|
writeEvent({ type: "content_block_stop", index: 0 });
|
|
85
100
|
writeEvent({
|
|
86
101
|
type: "message_delta",
|
|
87
|
-
delta: { stop_reason: "end_turn" },
|
|
102
|
+
delta: { stop_reason: "end_turn", stop_sequence: null },
|
|
103
|
+
usage: { output_tokens: 0 },
|
|
88
104
|
});
|
|
89
105
|
writeEvent({ type: "message_stop" });
|
|
90
106
|
});
|
|
91
|
-
|
|
107
|
+
const configDir = getNextAccountConfigDir();
|
|
108
|
+
logAccountAssigned(configDir);
|
|
109
|
+
reportRequestStart(configDir);
|
|
110
|
+
const streamStart = Date.now();
|
|
111
|
+
const abortController = new AbortController();
|
|
112
|
+
req.once("close", () => abortController.abort());
|
|
113
|
+
runAgentStream(config, workspaceDir, cmdArgs, parseLine, tempDir, configDir, abortController.signal)
|
|
92
114
|
.then(({ code, stderr: stderrOut }) => {
|
|
115
|
+
const latencyMs = Date.now() - streamStart;
|
|
116
|
+
reportRequestEnd(configDir);
|
|
117
|
+
if (stderrOut && isRateLimited(stderrOut)) {
|
|
118
|
+
reportRateLimit(configDir, 60000);
|
|
119
|
+
}
|
|
93
120
|
if (code !== 0) {
|
|
121
|
+
reportRequestError(configDir, latencyMs);
|
|
94
122
|
logAgentError(config.sessionsLogPath, method, pathname, remoteAddress, code, stderrOut);
|
|
95
123
|
}
|
|
124
|
+
else {
|
|
125
|
+
reportRequestSuccess(configDir, latencyMs);
|
|
126
|
+
}
|
|
127
|
+
logAccountStats(config.verbose, getAccountStats());
|
|
96
128
|
res.end();
|
|
97
129
|
})
|
|
98
130
|
.catch((err) => {
|
|
131
|
+
reportRequestEnd(configDir);
|
|
132
|
+
reportRequestError(configDir, Date.now() - streamStart);
|
|
99
133
|
console.error(`[${new Date().toISOString()}] Agent stream error:`, err);
|
|
100
134
|
res.end();
|
|
101
135
|
});
|
|
102
136
|
return;
|
|
103
137
|
}
|
|
104
|
-
const
|
|
138
|
+
const configDir = getNextAccountConfigDir();
|
|
139
|
+
logAccountAssigned(configDir);
|
|
140
|
+
reportRequestStart(configDir);
|
|
141
|
+
const syncStart = Date.now();
|
|
142
|
+
const abortController = new AbortController();
|
|
143
|
+
req.once("close", () => abortController.abort());
|
|
144
|
+
const out = await runAgentSync(config, workspaceDir, cmdArgs, tempDir, configDir, abortController.signal);
|
|
145
|
+
const syncLatency = Date.now() - syncStart;
|
|
146
|
+
reportRequestEnd(configDir);
|
|
147
|
+
if (out.stderr && isRateLimited(out.stderr)) {
|
|
148
|
+
reportRateLimit(configDir, 60000);
|
|
149
|
+
}
|
|
105
150
|
if (out.code !== 0) {
|
|
151
|
+
reportRequestError(configDir, syncLatency);
|
|
152
|
+
logAccountStats(config.verbose, getAccountStats());
|
|
106
153
|
const errMsg = logAgentError(config.sessionsLogPath, method, pathname, remoteAddress, out.code, out.stderr);
|
|
107
154
|
json(res, 500, {
|
|
108
155
|
error: { type: "api_error", message: errMsg },
|
|
109
156
|
});
|
|
110
157
|
return;
|
|
111
158
|
}
|
|
159
|
+
reportRequestSuccess(configDir, syncLatency);
|
|
112
160
|
const content = out.stdout.trim();
|
|
113
161
|
logTrafficResponse(config.verbose, model ?? cursorModel, content, false);
|
|
162
|
+
logAccountStats(config.verbose, getAccountStats());
|
|
114
163
|
json(res, 200, {
|
|
115
164
|
id: msgId,
|
|
116
165
|
type: "message",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic-messages.js","sourceRoot":"","sources":["../../../src/lib/handlers/anthropic-messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAIzC,OAAO,EAAE,gCAAgC,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"anthropic-messages.js","sourceRoot":"","sources":["../../../src/lib/handlers/anthropic-messages.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,18 +4,29 @@ import { runAgentStream, runAgentSync } from "../agent-runner.js";
|
|
|
4
4
|
import { createStreamParser } from "../cli-stream-parser.js";
|
|
5
5
|
import { json, writeSseHeaders } from "../http.js";
|
|
6
6
|
import { resolveToCursorModel } from "../model-map.js";
|
|
7
|
-
import { buildPromptFromMessages, normalizeModelId, } from "../openai.js";
|
|
8
|
-
import { logAgentError, logTrafficRequest, logTrafficResponse, } from "../request-log.js";
|
|
7
|
+
import { buildPromptFromMessages, normalizeModelId, toolsToSystemText, } from "../openai.js";
|
|
8
|
+
import { logAgentError, logAccountAssigned, logAccountStats, logTrafficRequest, logTrafficResponse, } from "../request-log.js";
|
|
9
9
|
import { resolveModel } from "../resolve-model.js";
|
|
10
10
|
import { resolveWorkspace } from "../workspace.js";
|
|
11
|
+
import { sanitizeMessages } from "../sanitize.js";
|
|
12
|
+
import { getNextAccountConfigDir, reportRequestStart, reportRequestEnd, reportRateLimit, reportRequestSuccess, reportRequestError, getAccountStats, } from "../account-pool.js";
|
|
13
|
+
function isRateLimited(stderr) {
|
|
14
|
+
return /\b429\b|rate.?limit|too many requests/i.test(stderr);
|
|
15
|
+
}
|
|
11
16
|
export async function handleChatCompletions(req, res, ctx, rawBody, method, pathname, remoteAddress) {
|
|
12
17
|
const { config, lastRequestedModelRef } = ctx;
|
|
13
18
|
const body = JSON.parse(rawBody || "{}");
|
|
14
19
|
const requested = normalizeModelId(body.model);
|
|
15
20
|
const model = resolveModel(requested, lastRequestedModelRef, config);
|
|
16
21
|
const cursorModel = resolveToCursorModel(model) ?? model;
|
|
17
|
-
const
|
|
18
|
-
|
|
22
|
+
const cleanMessages = sanitizeMessages(body.messages ?? []);
|
|
23
|
+
// Inject tool/function schemas as a system message so the model is aware of them
|
|
24
|
+
const toolsText = toolsToSystemText(body.tools, body.functions);
|
|
25
|
+
const messagesWithTools = toolsText
|
|
26
|
+
? [{ role: "system", content: toolsText }, ...cleanMessages]
|
|
27
|
+
: cleanMessages;
|
|
28
|
+
const prompt = buildPromptFromMessages(messagesWithTools);
|
|
29
|
+
const trafficMessages = cleanMessages.map((m) => {
|
|
19
30
|
const content = typeof m?.content === "string"
|
|
20
31
|
? m.content
|
|
21
32
|
: Array.isArray(m?.content)
|
|
@@ -34,6 +45,9 @@ export async function handleChatCompletions(req, res, ctx, rawBody, method, path
|
|
|
34
45
|
const created = Math.floor(Date.now() / 1000);
|
|
35
46
|
if (body.stream) {
|
|
36
47
|
writeSseHeaders(res);
|
|
48
|
+
res.on("error", () => {
|
|
49
|
+
/* client disconnected mid-stream */
|
|
50
|
+
});
|
|
37
51
|
let accumulated = "";
|
|
38
52
|
const parseLine = createStreamParser((text) => {
|
|
39
53
|
accumulated += text;
|
|
@@ -57,29 +71,62 @@ export async function handleChatCompletions(req, res, ctx, rawBody, method, path
|
|
|
57
71
|
})}\n\n`);
|
|
58
72
|
res.write("data: [DONE]\n\n");
|
|
59
73
|
});
|
|
60
|
-
|
|
74
|
+
const configDir = getNextAccountConfigDir();
|
|
75
|
+
logAccountAssigned(configDir);
|
|
76
|
+
reportRequestStart(configDir);
|
|
77
|
+
const streamStart = Date.now();
|
|
78
|
+
const abortController = new AbortController();
|
|
79
|
+
req.once("close", () => abortController.abort());
|
|
80
|
+
runAgentStream(config, workspaceDir, cmdArgs, parseLine, tempDir, configDir, abortController.signal)
|
|
61
81
|
.then(({ code, stderr: stderrOut }) => {
|
|
62
|
-
|
|
82
|
+
const latencyMs = Date.now() - streamStart;
|
|
83
|
+
reportRequestEnd(configDir);
|
|
84
|
+
if (stderrOut && isRateLimited(stderrOut)) {
|
|
85
|
+
reportRateLimit(configDir, 60000);
|
|
86
|
+
}
|
|
87
|
+
if (code !== 0 && !abortController.signal.aborted) {
|
|
88
|
+
reportRequestError(configDir, latencyMs);
|
|
63
89
|
logAgentError(config.sessionsLogPath, method, pathname, remoteAddress, code, stderrOut);
|
|
64
90
|
}
|
|
91
|
+
else {
|
|
92
|
+
reportRequestSuccess(configDir, latencyMs);
|
|
93
|
+
}
|
|
94
|
+
logAccountStats(config.verbose, getAccountStats());
|
|
65
95
|
res.end();
|
|
66
96
|
})
|
|
67
97
|
.catch((err) => {
|
|
98
|
+
reportRequestEnd(configDir);
|
|
99
|
+
reportRequestError(configDir, Date.now() - streamStart);
|
|
68
100
|
console.error(`[${new Date().toISOString()}] Agent stream error:`, err);
|
|
69
101
|
res.end();
|
|
70
102
|
});
|
|
71
103
|
return;
|
|
72
104
|
}
|
|
73
|
-
const
|
|
105
|
+
const configDir = getNextAccountConfigDir();
|
|
106
|
+
logAccountAssigned(configDir);
|
|
107
|
+
reportRequestStart(configDir);
|
|
108
|
+
const syncStart = Date.now();
|
|
109
|
+
const abortController = new AbortController();
|
|
110
|
+
req.once("close", () => abortController.abort());
|
|
111
|
+
const out = await runAgentSync(config, workspaceDir, cmdArgs, tempDir, configDir, abortController.signal);
|
|
112
|
+
const syncLatency = Date.now() - syncStart;
|
|
113
|
+
reportRequestEnd(configDir);
|
|
114
|
+
if (out.stderr && isRateLimited(out.stderr)) {
|
|
115
|
+
reportRateLimit(configDir, 60000);
|
|
116
|
+
}
|
|
74
117
|
if (out.code !== 0) {
|
|
118
|
+
reportRequestError(configDir, syncLatency);
|
|
119
|
+
logAccountStats(config.verbose, getAccountStats());
|
|
75
120
|
const errMsg = logAgentError(config.sessionsLogPath, method, pathname, remoteAddress, out.code, out.stderr);
|
|
76
121
|
json(res, 500, {
|
|
77
122
|
error: { message: errMsg, code: "cursor_cli_error" },
|
|
78
123
|
});
|
|
79
124
|
return;
|
|
80
125
|
}
|
|
126
|
+
reportRequestSuccess(configDir, syncLatency);
|
|
81
127
|
const content = out.stdout.trim();
|
|
82
128
|
logTrafficResponse(config.verbose, model ?? cursorModel, content, false);
|
|
129
|
+
logAccountStats(config.verbose, getAccountStats());
|
|
83
130
|
json(res, 200, {
|
|
84
131
|
id,
|
|
85
132
|
object: "chat.completion",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-completions.js","sourceRoot":"","sources":["../../../src/lib/handlers/chat-completions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAIzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EACL,uBAAuB,EACvB,gBAAgB,
|
|
1
|
+
{"version":3,"file":"chat-completions.js","sourceRoot":"","sources":["../../../src/lib/handlers/chat-completions.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,13 +7,23 @@ export async function handleModels(res, opts) {
|
|
|
7
7
|
const now = Date.now();
|
|
8
8
|
if (!modelCacheRef.current ||
|
|
9
9
|
now - modelCacheRef.current.at > MODEL_CACHE_TTL_MS) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
10
|
+
// Deduplicate concurrent fetches — reuse a single in-flight promise
|
|
11
|
+
if (!modelCacheRef.inflight) {
|
|
12
|
+
modelCacheRef.inflight = listCursorCliModels({
|
|
13
|
+
agentBin: config.agentBin,
|
|
14
|
+
timeoutMs: 60_000,
|
|
15
|
+
}).then((models) => {
|
|
16
|
+
modelCacheRef.current = { at: Date.now(), models };
|
|
17
|
+
modelCacheRef.inflight = undefined;
|
|
18
|
+
return models;
|
|
19
|
+
}, (err) => {
|
|
20
|
+
modelCacheRef.inflight = undefined;
|
|
21
|
+
throw err;
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
await modelCacheRef.inflight;
|
|
15
25
|
}
|
|
16
|
-
const models = modelCacheRef.current
|
|
26
|
+
const models = modelCacheRef.current?.models ?? [];
|
|
17
27
|
const cursorModels = models.map((m) => ({
|
|
18
28
|
id: m.id,
|
|
19
29
|
object: "model",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../../src/lib/handlers/models.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAE3D,MAAM,kBAAkB,GAAG,CAAC,GAAG,MAAM,CAAC;AAStC,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,GAAwB,EACxB,IAAsB;IAEtB,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;IACvC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,IACE,CAAC,aAAa,CAAC,OAAO;QACtB,GAAG,GAAG,aAAa,CAAC,OAAO,CAAC,EAAE,GAAG,kBAAkB,EACnD,CAAC;QACD,
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../../src/lib/handlers/models.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAE3D,MAAM,kBAAkB,GAAG,CAAC,GAAG,MAAM,CAAC;AAStC,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,GAAwB,EACxB,IAAsB;IAEtB,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;IACvC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,IACE,CAAC,aAAa,CAAC,OAAO;QACtB,GAAG,GAAG,aAAa,CAAC,OAAO,CAAC,EAAE,GAAG,kBAAkB,EACnD,CAAC;QACD,oEAAoE;QACpE,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;YAC5B,aAAa,CAAC,QAAQ,GAAG,mBAAmB,CAAC;gBAC3C,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,SAAS,EAAE,MAAM;aAClB,CAAC,CAAC,IAAI,CACL,CAAC,MAAM,EAAE,EAAE;gBACT,aAAa,CAAC,OAAO,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC;gBACnD,aAAa,CAAC,QAAQ,GAAG,SAAS,CAAC;gBACnC,OAAO,MAAM,CAAC;YAChB,CAAC,EACD,CAAC,GAAG,EAAE,EAAE;gBACN,aAAa,CAAC,QAAQ,GAAG,SAAS,CAAC;gBACnC,MAAM,GAAG,CAAC;YACZ,CAAC,CACF,CAAC;QACJ,CAAC;QACD,MAAM,aAAa,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAED,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC;IACnD,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtC,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,MAAM,EAAE,OAAgB;QACxB,QAAQ,EAAE,QAAiB;QAC3B,IAAI,EAAE,CAAC,CAAC,IAAI;KACb,CAAC,CAAC,CAAC;IACJ,MAAM,gBAAgB,GAAG,wBAAwB,CAC/C,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CACxB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACZ,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,MAAM,EAAE,OAAgB;QACxB,QAAQ,EAAE,QAAiB;QAC3B,IAAI,EAAE,CAAC,CAAC,IAAI;KACb,CAAC,CAAC,CAAC;IAEJ,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE;QACb,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,CAAC,GAAG,YAAY,EAAE,GAAG,gBAAgB,CAAC;KAC7C,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;
|