cursor-composer-in-claude 0.7.3
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 +303 -0
- 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 +286 -0
- package/dist/cli/reset-hwid.js.map +1 -0
- package/dist/cli/usage.d.ts +27 -0
- package/dist/cli/usage.js +177 -0
- package/dist/cli/usage.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +58 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +95 -0
- package/dist/client.js +316 -0
- package/dist/client.js.map +1 -0
- package/dist/lib/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/acp-client.d.ts +53 -0
- package/dist/lib/acp-client.js +517 -0
- package/dist/lib/acp-client.js.map +1 -0
- package/dist/lib/agent-cmd-args.d.ts +9 -0
- package/dist/lib/agent-cmd-args.js +29 -0
- package/dist/lib/agent-cmd-args.js.map +1 -0
- package/dist/lib/agent-runner.d.ts +12 -0
- package/dist/lib/agent-runner.js +144 -0
- package/dist/lib/agent-runner.js.map +1 -0
- package/dist/lib/anthropic.d.ts +26 -0
- package/dist/lib/anthropic.js +70 -0
- package/dist/lib/anthropic.js.map +1 -0
- package/dist/lib/cli-stream-parser.d.ts +8 -0
- package/dist/lib/cli-stream-parser.js +46 -0
- package/dist/lib/cli-stream-parser.js.map +1 -0
- package/dist/lib/config.d.ts +52 -0
- package/dist/lib/config.js +47 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/cursor-cli.d.ts +9 -0
- package/dist/lib/cursor-cli.js +30 -0
- package/dist/lib/cursor-cli.js.map +1 -0
- package/dist/lib/env.d.ts +54 -0
- package/dist/lib/env.js +247 -0
- package/dist/lib/env.js.map +1 -0
- package/dist/lib/handlers/anthropic-messages.d.ts +9 -0
- package/dist/lib/handlers/anthropic-messages.js +281 -0
- package/dist/lib/handlers/anthropic-messages.js.map +1 -0
- package/dist/lib/handlers/chat-completions.d.ts +9 -0
- package/dist/lib/handlers/chat-completions.js +275 -0
- package/dist/lib/handlers/chat-completions.js.map +1 -0
- package/dist/lib/handlers/health.d.ts +7 -0
- package/dist/lib/handlers/health.js +15 -0
- package/dist/lib/handlers/health.js.map +1 -0
- package/dist/lib/handlers/models.d.ts +15 -0
- package/dist/lib/handlers/models.js +44 -0
- package/dist/lib/handlers/models.js.map +1 -0
- package/dist/lib/http.d.ts +5 -0
- package/dist/lib/http.js +36 -0
- package/dist/lib/http.js.map +1 -0
- package/dist/lib/max-mode-preflight.d.ts +5 -0
- package/dist/lib/max-mode-preflight.js +62 -0
- package/dist/lib/max-mode-preflight.js.map +1 -0
- package/dist/lib/model-map.d.ts +17 -0
- package/dist/lib/model-map.js +62 -0
- package/dist/lib/model-map.js.map +1 -0
- package/dist/lib/openai.d.ts +17 -0
- package/dist/lib/openai.js +111 -0
- package/dist/lib/openai.js.map +1 -0
- package/dist/lib/process.d.ts +32 -0
- package/dist/lib/process.js +174 -0
- package/dist/lib/process.js.map +1 -0
- package/dist/lib/request-listener.d.ts +7 -0
- package/dist/lib/request-listener.js +99 -0
- package/dist/lib/request-listener.js.map +1 -0
- package/dist/lib/request-log.d.ts +16 -0
- package/dist/lib/request-log.js +147 -0
- package/dist/lib/request-log.js.map +1 -0
- package/dist/lib/resolve-model.d.ts +8 -0
- package/dist/lib/resolve-model.js +18 -0
- package/dist/lib/resolve-model.js.map +1 -0
- package/dist/lib/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 +13 -0
- package/dist/lib/server.js +118 -0
- package/dist/lib/server.js.map +1 -0
- package/dist/lib/token-cache.d.ts +10 -0
- package/dist/lib/token-cache.js +35 -0
- package/dist/lib/token-cache.js.map +1 -0
- 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/dist/lib/workspace.d.ts +19 -0
- package/dist/lib/workspace.js +77 -0
- package/dist/lib/workspace.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { buildAgentFixedArgs } from "../agent-cmd-args.js";
|
|
3
|
+
import { runAgentStream, runAgentSync } from "../agent-runner.js";
|
|
4
|
+
import { createStreamParser } from "../cli-stream-parser.js";
|
|
5
|
+
import { json, writeSseHeaders } from "../http.js";
|
|
6
|
+
import { resolveToCursorModel } from "../model-map.js";
|
|
7
|
+
import { buildPromptFromMessages, normalizeModelId, toolsToSystemText, } from "../openai.js";
|
|
8
|
+
import { logAgentError, logAccountAssigned, logAccountStats, logTrafficRequest, logTrafficResponse, } from "../request-log.js";
|
|
9
|
+
import { resolveModel } from "../resolve-model.js";
|
|
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
|
+
import { fitPromptToWinCmdline, warnPromptTruncated, } from "../win-cmdline-limit.js";
|
|
14
|
+
function isRateLimited(stderr) {
|
|
15
|
+
return /\b429\b|rate.?limit|too many requests/i.test(stderr);
|
|
16
|
+
}
|
|
17
|
+
export async function handleChatCompletions(req, res, ctx, rawBody, method, pathname, remoteAddress) {
|
|
18
|
+
const { config, lastRequestedModelRef } = ctx;
|
|
19
|
+
const body = JSON.parse(rawBody || "{}");
|
|
20
|
+
const requested = normalizeModelId(body.model);
|
|
21
|
+
const model = resolveModel(requested, lastRequestedModelRef, config);
|
|
22
|
+
const cursorModel = resolveToCursorModel(model) ?? model;
|
|
23
|
+
// When request is "default", use defaultModel for response display (dashboard) if set; else echo "default"
|
|
24
|
+
const displayModel = requested === "default" && config.defaultModel !== "default"
|
|
25
|
+
? config.defaultModel
|
|
26
|
+
: model;
|
|
27
|
+
const cleanMessages = sanitizeMessages(body.messages ?? []);
|
|
28
|
+
const toolsText = toolsToSystemText(body.tools, body.functions);
|
|
29
|
+
const messagesWithTools = toolsText
|
|
30
|
+
? [{ role: "system", content: toolsText }, ...cleanMessages]
|
|
31
|
+
: cleanMessages;
|
|
32
|
+
const prompt = buildPromptFromMessages(messagesWithTools);
|
|
33
|
+
const trafficMessages = cleanMessages.map((m) => {
|
|
34
|
+
const content = typeof m?.content === "string"
|
|
35
|
+
? m.content
|
|
36
|
+
: Array.isArray(m?.content)
|
|
37
|
+
? m.content
|
|
38
|
+
.filter((p) => p.type === "text")
|
|
39
|
+
.map((p) => p.text ?? "")
|
|
40
|
+
.join("")
|
|
41
|
+
: "";
|
|
42
|
+
return { role: String(m?.role ?? "user"), content };
|
|
43
|
+
});
|
|
44
|
+
logTrafficRequest(config.verbose, model ?? cursorModel, trafficMessages, !!body.stream);
|
|
45
|
+
const headerWs = req.headers["x-cursor-workspace"];
|
|
46
|
+
let workspaceDir;
|
|
47
|
+
let tempDir;
|
|
48
|
+
try {
|
|
49
|
+
const ws = resolveWorkspace(config, headerWs);
|
|
50
|
+
workspaceDir = ws.workspaceDir;
|
|
51
|
+
tempDir = ws.tempDir;
|
|
52
|
+
}
|
|
53
|
+
catch (e) {
|
|
54
|
+
const msg = e instanceof Error ? e.message : "Invalid workspace";
|
|
55
|
+
json(res, 400, { error: { message: msg, code: "invalid_workspace" } });
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const fixedArgs = buildAgentFixedArgs(config, workspaceDir, cursorModel, !!body.stream);
|
|
59
|
+
const fit = fitPromptToWinCmdline(config.agentBin, fixedArgs, prompt, {
|
|
60
|
+
maxCmdline: config.winCmdlineMax,
|
|
61
|
+
platform: process.platform,
|
|
62
|
+
cwd: workspaceDir,
|
|
63
|
+
});
|
|
64
|
+
if (!fit.ok) {
|
|
65
|
+
json(res, 500, {
|
|
66
|
+
error: {
|
|
67
|
+
message: fit.error,
|
|
68
|
+
code: "windows_cmdline_limit",
|
|
69
|
+
type: "api_error",
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (fit.truncated) {
|
|
75
|
+
warnPromptTruncated(fit.originalLength, fit.finalPromptLength);
|
|
76
|
+
}
|
|
77
|
+
const cmdArgs = fit.args;
|
|
78
|
+
const id = `chatcmpl_${randomUUID().replace(/-/g, "")}`;
|
|
79
|
+
const created = Math.floor(Date.now() / 1000);
|
|
80
|
+
const promptForAgent = config.promptViaStdin || config.useAcp ? prompt : undefined;
|
|
81
|
+
const truncatedHeaders = fit.truncated
|
|
82
|
+
? { "X-Cursor-Proxy-Prompt-Truncated": "true" }
|
|
83
|
+
: undefined;
|
|
84
|
+
if (body.stream) {
|
|
85
|
+
const configDir = getNextAccountConfigDir();
|
|
86
|
+
logAccountAssigned(configDir);
|
|
87
|
+
reportRequestStart(configDir);
|
|
88
|
+
const streamStart = Date.now();
|
|
89
|
+
const abortController = new AbortController();
|
|
90
|
+
req.once("close", () => abortController.abort());
|
|
91
|
+
writeSseHeaders(res, truncatedHeaders);
|
|
92
|
+
res.on("error", () => {
|
|
93
|
+
/* client disconnected mid-stream */
|
|
94
|
+
});
|
|
95
|
+
if (config.useAcp && typeof promptForAgent === "string") {
|
|
96
|
+
let accumulated = "";
|
|
97
|
+
runAgentStream(config, workspaceDir, cmdArgs, (chunk) => {
|
|
98
|
+
accumulated += chunk;
|
|
99
|
+
res.write(`data: ${JSON.stringify({
|
|
100
|
+
id,
|
|
101
|
+
object: "chat.completion.chunk",
|
|
102
|
+
created,
|
|
103
|
+
model: displayModel,
|
|
104
|
+
choices: [
|
|
105
|
+
{ index: 0, delta: { content: chunk }, finish_reason: null },
|
|
106
|
+
],
|
|
107
|
+
})}\n\n`);
|
|
108
|
+
}, tempDir, promptForAgent, configDir, abortController.signal)
|
|
109
|
+
.then(({ code, stderr: stderrOut }) => {
|
|
110
|
+
const latencyMs = Date.now() - streamStart;
|
|
111
|
+
reportRequestEnd(configDir);
|
|
112
|
+
if (stderrOut && isRateLimited(stderrOut)) {
|
|
113
|
+
reportRateLimit(configDir, 60000);
|
|
114
|
+
}
|
|
115
|
+
if (abortController.signal.aborted) {
|
|
116
|
+
/* client disconnected — do not count as success or failure */
|
|
117
|
+
}
|
|
118
|
+
else if (code !== 0) {
|
|
119
|
+
reportRequestError(configDir, latencyMs);
|
|
120
|
+
const publicMsg = logAgentError(config.sessionsLogPath, method, pathname, remoteAddress, code, stderrOut);
|
|
121
|
+
res.write(`data: ${JSON.stringify({
|
|
122
|
+
error: { message: publicMsg, code: "cursor_cli_error" },
|
|
123
|
+
})}\n\n`);
|
|
124
|
+
res.write("data: [DONE]\n\n");
|
|
125
|
+
logAccountStats(config.verbose, getAccountStats());
|
|
126
|
+
res.end();
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
reportRequestSuccess(configDir, latencyMs);
|
|
131
|
+
}
|
|
132
|
+
logAccountStats(config.verbose, getAccountStats());
|
|
133
|
+
logTrafficResponse(config.verbose, model ?? cursorModel, accumulated, true);
|
|
134
|
+
const promptTokens = Math.max(1, Math.round(prompt.length / 4));
|
|
135
|
+
const completionTokens = Math.max(1, Math.round(accumulated.length / 4));
|
|
136
|
+
res.write(`data: ${JSON.stringify({
|
|
137
|
+
id,
|
|
138
|
+
object: "chat.completion.chunk",
|
|
139
|
+
created,
|
|
140
|
+
model: displayModel,
|
|
141
|
+
choices: [{ index: 0, delta: {}, finish_reason: "stop" }],
|
|
142
|
+
usage: {
|
|
143
|
+
prompt_tokens: promptTokens,
|
|
144
|
+
completion_tokens: completionTokens,
|
|
145
|
+
total_tokens: promptTokens + completionTokens,
|
|
146
|
+
},
|
|
147
|
+
})}\n\n`);
|
|
148
|
+
res.write("data: [DONE]\n\n");
|
|
149
|
+
res.end();
|
|
150
|
+
})
|
|
151
|
+
.catch((err) => {
|
|
152
|
+
reportRequestEnd(configDir);
|
|
153
|
+
if (!abortController.signal.aborted) {
|
|
154
|
+
reportRequestError(configDir, Date.now() - streamStart);
|
|
155
|
+
res.write(`data: ${JSON.stringify({
|
|
156
|
+
error: {
|
|
157
|
+
message: "The Cursor agent stream failed. See server logs for details.",
|
|
158
|
+
code: "cursor_cli_error",
|
|
159
|
+
},
|
|
160
|
+
})}\n\n`);
|
|
161
|
+
res.write("data: [DONE]\n\n");
|
|
162
|
+
}
|
|
163
|
+
console.error(`[${new Date().toISOString()}] Agent stream error:`, err);
|
|
164
|
+
res.end();
|
|
165
|
+
});
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
let accumulated = "";
|
|
169
|
+
const parseLine = createStreamParser((text) => {
|
|
170
|
+
accumulated += text;
|
|
171
|
+
res.write(`data: ${JSON.stringify({
|
|
172
|
+
id,
|
|
173
|
+
object: "chat.completion.chunk",
|
|
174
|
+
created,
|
|
175
|
+
model: displayModel,
|
|
176
|
+
choices: [
|
|
177
|
+
{ index: 0, delta: { content: text }, finish_reason: null },
|
|
178
|
+
],
|
|
179
|
+
})}\n\n`);
|
|
180
|
+
}, () => {
|
|
181
|
+
logTrafficResponse(config.verbose, model ?? cursorModel, accumulated, true);
|
|
182
|
+
const promptTokens = Math.max(1, Math.round(prompt.length / 4));
|
|
183
|
+
const completionTokens = Math.max(1, Math.round(accumulated.length / 4));
|
|
184
|
+
res.write(`data: ${JSON.stringify({
|
|
185
|
+
id,
|
|
186
|
+
object: "chat.completion.chunk",
|
|
187
|
+
created,
|
|
188
|
+
model: displayModel,
|
|
189
|
+
choices: [{ index: 0, delta: {}, finish_reason: "stop" }],
|
|
190
|
+
usage: {
|
|
191
|
+
prompt_tokens: promptTokens,
|
|
192
|
+
completion_tokens: completionTokens,
|
|
193
|
+
total_tokens: promptTokens + completionTokens,
|
|
194
|
+
},
|
|
195
|
+
})}\n\n`);
|
|
196
|
+
res.write("data: [DONE]\n\n");
|
|
197
|
+
});
|
|
198
|
+
runAgentStream(config, workspaceDir, cmdArgs, parseLine, tempDir, promptForAgent, configDir, abortController.signal)
|
|
199
|
+
.then(({ code, stderr: stderrOut }) => {
|
|
200
|
+
const latencyMs = Date.now() - streamStart;
|
|
201
|
+
reportRequestEnd(configDir);
|
|
202
|
+
if (stderrOut && isRateLimited(stderrOut)) {
|
|
203
|
+
reportRateLimit(configDir, 60000);
|
|
204
|
+
}
|
|
205
|
+
if (abortController.signal.aborted) {
|
|
206
|
+
/* client disconnected — do not count as success or failure */
|
|
207
|
+
}
|
|
208
|
+
else if (code !== 0) {
|
|
209
|
+
reportRequestError(configDir, latencyMs);
|
|
210
|
+
logAgentError(config.sessionsLogPath, method, pathname, remoteAddress, code, stderrOut);
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
reportRequestSuccess(configDir, latencyMs);
|
|
214
|
+
}
|
|
215
|
+
logAccountStats(config.verbose, getAccountStats());
|
|
216
|
+
res.end();
|
|
217
|
+
})
|
|
218
|
+
.catch((err) => {
|
|
219
|
+
reportRequestEnd(configDir);
|
|
220
|
+
if (!abortController.signal.aborted) {
|
|
221
|
+
reportRequestError(configDir, Date.now() - streamStart);
|
|
222
|
+
}
|
|
223
|
+
console.error(`[${new Date().toISOString()}] Agent stream error:`, err);
|
|
224
|
+
res.end();
|
|
225
|
+
});
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
const configDir = getNextAccountConfigDir();
|
|
229
|
+
logAccountAssigned(configDir);
|
|
230
|
+
reportRequestStart(configDir);
|
|
231
|
+
const syncStart = Date.now();
|
|
232
|
+
const abortController = new AbortController();
|
|
233
|
+
req.once("close", () => abortController.abort());
|
|
234
|
+
const out = await runAgentSync(config, workspaceDir, cmdArgs, tempDir, promptForAgent, configDir, abortController.signal);
|
|
235
|
+
const syncLatency = Date.now() - syncStart;
|
|
236
|
+
reportRequestEnd(configDir);
|
|
237
|
+
if (out.stderr && isRateLimited(out.stderr)) {
|
|
238
|
+
reportRateLimit(configDir, 60000);
|
|
239
|
+
}
|
|
240
|
+
if (out.code !== 0) {
|
|
241
|
+
reportRequestError(configDir, syncLatency);
|
|
242
|
+
logAccountStats(config.verbose, getAccountStats());
|
|
243
|
+
const errMsg = logAgentError(config.sessionsLogPath, method, pathname, remoteAddress, out.code, out.stderr);
|
|
244
|
+
json(res, 500, {
|
|
245
|
+
error: { message: errMsg, code: "cursor_cli_error" },
|
|
246
|
+
});
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
reportRequestSuccess(configDir, syncLatency);
|
|
250
|
+
const content = out.stdout.trim();
|
|
251
|
+
logTrafficResponse(config.verbose, model ?? cursorModel, content, false);
|
|
252
|
+
const promptTokens = Math.max(1, Math.round(prompt.length / 4));
|
|
253
|
+
const completionTokens = Math.max(1, Math.round(content.length / 4));
|
|
254
|
+
const totalTokens = promptTokens + completionTokens;
|
|
255
|
+
logAccountStats(config.verbose, getAccountStats());
|
|
256
|
+
json(res, 200, {
|
|
257
|
+
id,
|
|
258
|
+
object: "chat.completion",
|
|
259
|
+
created,
|
|
260
|
+
model: displayModel,
|
|
261
|
+
choices: [
|
|
262
|
+
{
|
|
263
|
+
index: 0,
|
|
264
|
+
message: { role: "assistant", content },
|
|
265
|
+
finish_reason: "stop",
|
|
266
|
+
},
|
|
267
|
+
],
|
|
268
|
+
usage: {
|
|
269
|
+
prompt_tokens: promptTokens,
|
|
270
|
+
completion_tokens: completionTokens,
|
|
271
|
+
total_tokens: totalTokens,
|
|
272
|
+
},
|
|
273
|
+
}, truncatedHeaders);
|
|
274
|
+
}
|
|
275
|
+
//# sourceMappingURL=chat-completions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-completions.js","sourceRoot":"","sources":["../../../src/lib/handlers/chat-completions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { json } from "../http.js";
|
|
2
|
+
export function handleHealth(res, opts) {
|
|
3
|
+
const { version, config } = opts;
|
|
4
|
+
json(res, 200, {
|
|
5
|
+
ok: true,
|
|
6
|
+
version,
|
|
7
|
+
workspace: config.workspace,
|
|
8
|
+
mode: config.mode,
|
|
9
|
+
defaultModel: config.defaultModel,
|
|
10
|
+
force: config.force,
|
|
11
|
+
approveMcps: config.approveMcps,
|
|
12
|
+
strictModel: config.strictModel,
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../../src/lib/handlers/health.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAOlC,MAAM,UAAU,YAAY,CAC1B,GAAwB,EACxB,IAAuB;IAEvB,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACjC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE;QACb,EAAE,EAAE,IAAI;QACR,OAAO;QACP,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,WAAW,EAAE,MAAM,CAAC,WAAW;KAChC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as http from "node:http";
|
|
2
|
+
import type { BridgeConfig } from "../config.js";
|
|
3
|
+
import type { CursorCliModel } from "../cursor-cli.js";
|
|
4
|
+
export type ModelCache = {
|
|
5
|
+
at: number;
|
|
6
|
+
models: CursorCliModel[];
|
|
7
|
+
};
|
|
8
|
+
export type HandleModelsOpts = {
|
|
9
|
+
config: BridgeConfig;
|
|
10
|
+
modelCacheRef: {
|
|
11
|
+
current?: ModelCache;
|
|
12
|
+
inflight?: Promise<CursorCliModel[]>;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
export declare function handleModels(res: http.ServerResponse, opts: HandleModelsOpts): Promise<void>;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { listCursorCliModels } from "../cursor-cli.js";
|
|
2
|
+
import { json } from "../http.js";
|
|
3
|
+
import { getAnthropicModelAliases } from "../model-map.js";
|
|
4
|
+
const MODEL_CACHE_TTL_MS = 5 * 60_000;
|
|
5
|
+
export async function handleModels(res, opts) {
|
|
6
|
+
const { config, modelCacheRef } = opts;
|
|
7
|
+
const now = Date.now();
|
|
8
|
+
if (!modelCacheRef.current ||
|
|
9
|
+
now - modelCacheRef.current.at > MODEL_CACHE_TTL_MS) {
|
|
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;
|
|
25
|
+
}
|
|
26
|
+
const models = modelCacheRef.current?.models ?? [];
|
|
27
|
+
const cursorModels = models.map((m) => ({
|
|
28
|
+
id: m.id,
|
|
29
|
+
object: "model",
|
|
30
|
+
owned_by: "cursor",
|
|
31
|
+
name: m.name,
|
|
32
|
+
}));
|
|
33
|
+
const anthropicAliases = getAnthropicModelAliases(models.map((m) => m.id)).map((a) => ({
|
|
34
|
+
id: a.id,
|
|
35
|
+
object: "model",
|
|
36
|
+
owned_by: "cursor",
|
|
37
|
+
name: a.name,
|
|
38
|
+
}));
|
|
39
|
+
json(res, 200, {
|
|
40
|
+
object: "list",
|
|
41
|
+
data: [...cursorModels, ...anthropicAliases],
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=models.js.map
|
|
@@ -0,0 +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,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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import * as http from "node:http";
|
|
2
|
+
export declare function extractBearerToken(req: http.IncomingMessage): string | undefined;
|
|
3
|
+
export declare function json(res: http.ServerResponse, status: number, body: unknown, extraHeaders?: http.OutgoingHttpHeaders): void;
|
|
4
|
+
export declare function writeSseHeaders(res: http.ServerResponse, extraHeaders?: http.OutgoingHttpHeaders): void;
|
|
5
|
+
export declare function readBody(req: http.IncomingMessage): Promise<string>;
|
package/dist/lib/http.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export function extractBearerToken(req) {
|
|
2
|
+
const h = req.headers["authorization"];
|
|
3
|
+
if (!h)
|
|
4
|
+
return undefined;
|
|
5
|
+
const val = Array.isArray(h) ? h[0] : h;
|
|
6
|
+
const match = val.match(/^Bearer\s+(.+)$/i);
|
|
7
|
+
return match ? match[1] : undefined;
|
|
8
|
+
}
|
|
9
|
+
export function json(res, status, body, extraHeaders) {
|
|
10
|
+
res.writeHead(status, {
|
|
11
|
+
...extraHeaders,
|
|
12
|
+
"Content-Type": "application/json",
|
|
13
|
+
});
|
|
14
|
+
res.end(JSON.stringify(body));
|
|
15
|
+
}
|
|
16
|
+
export function writeSseHeaders(res, extraHeaders) {
|
|
17
|
+
res.writeHead(200, {
|
|
18
|
+
...extraHeaders,
|
|
19
|
+
"Content-Type": "text/event-stream",
|
|
20
|
+
"Cache-Control": "no-cache",
|
|
21
|
+
Connection: "keep-alive",
|
|
22
|
+
"X-Accel-Buffering": "no",
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
export async function readBody(req) {
|
|
26
|
+
return new Promise((resolve, reject) => {
|
|
27
|
+
let data = "";
|
|
28
|
+
req.setEncoding("utf8");
|
|
29
|
+
req.on("data", (chunk) => {
|
|
30
|
+
data += chunk;
|
|
31
|
+
});
|
|
32
|
+
req.on("end", () => resolve(data));
|
|
33
|
+
req.on("error", reject);
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +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,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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sets maxMode=true in Cursor CLI's cli-config.json before spawning the agent.
|
|
3
|
+
* Config resolution order (same as Cursor CLI):
|
|
4
|
+
* 1. CURSOR_CONFIG_DIR/cli-config.json
|
|
5
|
+
* 2. <agent-dir>/../data/config/cli-config.json (CursorToolkit layout)
|
|
6
|
+
* 3. Platform default (LOCALAPPDATA / Library / XDG)
|
|
7
|
+
*/
|
|
8
|
+
import * as fs from "node:fs";
|
|
9
|
+
import * as path from "node:path";
|
|
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
|
+
}
|
|
17
|
+
const result = [];
|
|
18
|
+
if (process.env.CURSOR_CONFIG_DIR) {
|
|
19
|
+
result.push(path.join(process.env.CURSOR_CONFIG_DIR, "cli-config.json"));
|
|
20
|
+
}
|
|
21
|
+
if (agentScriptPath) {
|
|
22
|
+
const agentDir = path.dirname(path.resolve(agentScriptPath));
|
|
23
|
+
result.push(path.join(agentDir, "..", "data", "config", "cli-config.json"));
|
|
24
|
+
}
|
|
25
|
+
const home = process.env.HOME ?? process.env.USERPROFILE ?? "";
|
|
26
|
+
if (process.platform === "win32") {
|
|
27
|
+
const local = process.env.LOCALAPPDATA ?? path.join(home, "AppData", "Local");
|
|
28
|
+
result.push(path.join(local, "cursor-agent", "cli-config.json"));
|
|
29
|
+
}
|
|
30
|
+
else if (process.platform === "darwin") {
|
|
31
|
+
result.push(path.join(home, "Library", "Application Support", "cursor-agent", "cli-config.json"));
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
const xdg = process.env.XDG_CONFIG_HOME ?? path.join(home, ".config");
|
|
35
|
+
result.push(path.join(xdg, "cursor-agent", "cli-config.json"));
|
|
36
|
+
}
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Write maxMode: true to the first writable cli-config.json.
|
|
41
|
+
* Best-effort: ignores errors (e.g. missing or read-only config).
|
|
42
|
+
*/
|
|
43
|
+
export function runMaxModePreflight(agentScriptPath, configDirOverride) {
|
|
44
|
+
for (const candidate of getCandidates(agentScriptPath, configDirOverride)) {
|
|
45
|
+
try {
|
|
46
|
+
const rawStr = fs.readFileSync(candidate, "utf-8");
|
|
47
|
+
const raw = JSON.parse(rawStr.replace(/^\uFEFF/, ""));
|
|
48
|
+
if (!raw || typeof raw !== "object" || Object.keys(raw).length <= 1)
|
|
49
|
+
continue;
|
|
50
|
+
raw.maxMode = true;
|
|
51
|
+
if (typeof raw.model === "object" && raw.model && raw.model !== null) {
|
|
52
|
+
raw.model.maxMode = true;
|
|
53
|
+
}
|
|
54
|
+
fs.writeFileSync(candidate, JSON.stringify(raw, null, 2), "utf-8");
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
/* candidate not found or unreadable — try next */
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=max-mode-preflight.js.map
|
|
@@ -0,0 +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,CACpB,eAAwB,EACxB,iBAA0B;IAE1B,4EAA4E;IAC5E,uEAAuE;IACvE,8DAA8D;IAC9D,IAAI,iBAAiB,EAAE,CAAC;QACtB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAC3E,CAAC;IAED,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;IAE/D,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,MAAM,KAAK,GACT,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAClE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,cAAc,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACnE,CAAC;SAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACzC,MAAM,CAAC,IAAI,CACT,IAAI,CAAC,IAAI,CACP,IAAI,EACJ,SAAS,EACT,qBAAqB,EACrB,cAAc,EACd,iBAAiB,CAClB,CACF,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACtE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,eAAwB,EACxB,iBAA0B;IAE1B,KAAK,MAAM,SAAS,IAAI,aAAa,CAAC,eAAe,EAAE,iBAAiB,CAAC,EAAE,CAAC;QAC1E,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACnD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAGnD,CAAC;YACF,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC;gBACjE,SAAS;YAEX,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;YACnB,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;gBACpE,GAAG,CAAC,KAAiC,CAAC,OAAO,GAAG,IAAI,CAAC;YACxD,CAAC;YACD,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YACnE,OAAO;QACT,CAAC;QAAC,MAAM,CAAC;YACP,kDAAkD;QACpD,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Maps Anthropic/Claude Code model names to Cursor CLI model IDs
|
|
3
|
+
* so clients like Claude Code can send "claude-opus-4-6" and the proxy uses "opus-4.6".
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Resolve a requested model (e.g. from the client) to the Cursor CLI model ID.
|
|
7
|
+
* If the request uses an Anthropic-style name, returns the mapped Cursor ID; otherwise returns the value as-is.
|
|
8
|
+
*/
|
|
9
|
+
export declare function resolveToCursorModel(requested: string | undefined): string | undefined;
|
|
10
|
+
/**
|
|
11
|
+
* Return extra model list entries for GET /v1/models so clients like Claude Code
|
|
12
|
+
* see Anthropic-style ids (e.g. claude-opus-4-6) when those Cursor models are available.
|
|
13
|
+
*/
|
|
14
|
+
export declare function getAnthropicModelAliases(availableCursorIds: string[]): Array<{
|
|
15
|
+
id: string;
|
|
16
|
+
name: string;
|
|
17
|
+
}>;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Maps Anthropic/Claude Code model names to Cursor CLI model IDs
|
|
3
|
+
* so clients like Claude Code can send "claude-opus-4-6" and the proxy uses "opus-4.6".
|
|
4
|
+
*/
|
|
5
|
+
/** Anthropic-style model name (any case) -> Cursor CLI model id */
|
|
6
|
+
const ANTHROPIC_TO_CURSOR = {
|
|
7
|
+
// Claude 4.6
|
|
8
|
+
"claude-opus-4-6": "opus-4.6",
|
|
9
|
+
"claude-opus-4.6": "opus-4.6",
|
|
10
|
+
"claude-sonnet-4-6": "sonnet-4.6",
|
|
11
|
+
"claude-sonnet-4.6": "sonnet-4.6",
|
|
12
|
+
// Claude 4.5
|
|
13
|
+
"claude-opus-4-5": "opus-4.5",
|
|
14
|
+
"claude-opus-4.5": "opus-4.5",
|
|
15
|
+
"claude-sonnet-4-5": "sonnet-4.5",
|
|
16
|
+
"claude-sonnet-4.5": "sonnet-4.5",
|
|
17
|
+
// Generic 4.x (prefer 4.6)
|
|
18
|
+
"claude-opus-4": "opus-4.6",
|
|
19
|
+
"claude-sonnet-4": "sonnet-4.6",
|
|
20
|
+
// Haiku (Cursor has no Haiku; map to Sonnet)
|
|
21
|
+
"claude-haiku-4-5-20251001": "sonnet-4.5",
|
|
22
|
+
"claude-haiku-4-5": "sonnet-4.5",
|
|
23
|
+
"claude-haiku-4-6": "sonnet-4.6",
|
|
24
|
+
"claude-haiku-4": "sonnet-4.5",
|
|
25
|
+
// Thinking variants (if client sends them)
|
|
26
|
+
"claude-opus-4-6-thinking": "opus-4.6-thinking",
|
|
27
|
+
"claude-sonnet-4-6-thinking": "sonnet-4.6-thinking",
|
|
28
|
+
"claude-opus-4-5-thinking": "opus-4.5-thinking",
|
|
29
|
+
"claude-sonnet-4-5-thinking": "sonnet-4.5-thinking",
|
|
30
|
+
};
|
|
31
|
+
/** Cursor IDs we want to expose under Anthropic-style names in GET /v1/models */
|
|
32
|
+
const CURSOR_TO_ANTHROPIC_ALIAS = [
|
|
33
|
+
{ cursorId: "opus-4.6", anthropicId: "claude-opus-4-6", name: "Claude 4.6 Opus" },
|
|
34
|
+
{ cursorId: "opus-4.6-thinking", anthropicId: "claude-opus-4-6-thinking", name: "Claude 4.6 Opus (Thinking)" },
|
|
35
|
+
{ cursorId: "sonnet-4.6", anthropicId: "claude-sonnet-4-6", name: "Claude 4.6 Sonnet" },
|
|
36
|
+
{ cursorId: "sonnet-4.6-thinking", anthropicId: "claude-sonnet-4-6-thinking", name: "Claude 4.6 Sonnet (Thinking)" },
|
|
37
|
+
{ cursorId: "opus-4.5", anthropicId: "claude-opus-4-5", name: "Claude 4.5 Opus" },
|
|
38
|
+
{ cursorId: "opus-4.5-thinking", anthropicId: "claude-opus-4-5-thinking", name: "Claude 4.5 Opus (Thinking)" },
|
|
39
|
+
{ cursorId: "sonnet-4.5", anthropicId: "claude-sonnet-4-5", name: "Claude 4.5 Sonnet" },
|
|
40
|
+
{ cursorId: "sonnet-4.5-thinking", anthropicId: "claude-sonnet-4-5-thinking", name: "Claude 4.5 Sonnet (Thinking)" },
|
|
41
|
+
];
|
|
42
|
+
/**
|
|
43
|
+
* Resolve a requested model (e.g. from the client) to the Cursor CLI model ID.
|
|
44
|
+
* If the request uses an Anthropic-style name, returns the mapped Cursor ID; otherwise returns the value as-is.
|
|
45
|
+
*/
|
|
46
|
+
export function resolveToCursorModel(requested) {
|
|
47
|
+
if (!requested || !requested.trim())
|
|
48
|
+
return undefined;
|
|
49
|
+
const key = requested.trim().toLowerCase();
|
|
50
|
+
return ANTHROPIC_TO_CURSOR[key] ?? requested.trim();
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Return extra model list entries for GET /v1/models so clients like Claude Code
|
|
54
|
+
* see Anthropic-style ids (e.g. claude-opus-4-6) when those Cursor models are available.
|
|
55
|
+
*/
|
|
56
|
+
export function getAnthropicModelAliases(availableCursorIds) {
|
|
57
|
+
const set = new Set(availableCursorIds);
|
|
58
|
+
return CURSOR_TO_ANTHROPIC_ALIAS
|
|
59
|
+
.filter((a) => set.has(a.cursorId))
|
|
60
|
+
.map((a) => ({ id: a.anthropicId, name: a.name }));
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=model-map.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-map.js","sourceRoot":"","sources":["../../src/lib/model-map.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,mEAAmE;AACnE,MAAM,mBAAmB,GAA2B;IAClD,aAAa;IACb,iBAAiB,EAAE,UAAU;IAC7B,iBAAiB,EAAE,UAAU;IAC7B,mBAAmB,EAAE,YAAY;IACjC,mBAAmB,EAAE,YAAY;IACjC,aAAa;IACb,iBAAiB,EAAE,UAAU;IAC7B,iBAAiB,EAAE,UAAU;IAC7B,mBAAmB,EAAE,YAAY;IACjC,mBAAmB,EAAE,YAAY;IACjC,2BAA2B;IAC3B,eAAe,EAAE,UAAU;IAC3B,iBAAiB,EAAE,YAAY;IAC/B,6CAA6C;IAC7C,2BAA2B,EAAE,YAAY;IACzC,kBAAkB,EAAE,YAAY;IAChC,kBAAkB,EAAE,YAAY;IAChC,gBAAgB,EAAE,YAAY;IAC9B,2CAA2C;IAC3C,0BAA0B,EAAE,mBAAmB;IAC/C,4BAA4B,EAAE,qBAAqB;IACnD,0BAA0B,EAAE,mBAAmB;IAC/C,4BAA4B,EAAE,qBAAqB;CACpD,CAAC;AAEF,iFAAiF;AACjF,MAAM,yBAAyB,GAAmE;IAChG,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,iBAAiB,EAAE,IAAI,EAAE,iBAAiB,EAAE;IACjF,EAAE,QAAQ,EAAE,mBAAmB,EAAE,WAAW,EAAE,0BAA0B,EAAE,IAAI,EAAE,4BAA4B,EAAE;IAC9G,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,IAAI,EAAE,mBAAmB,EAAE;IACvF,EAAE,QAAQ,EAAE,qBAAqB,EAAE,WAAW,EAAE,4BAA4B,EAAE,IAAI,EAAE,8BAA8B,EAAE;IACpH,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,iBAAiB,EAAE,IAAI,EAAE,iBAAiB,EAAE;IACjF,EAAE,QAAQ,EAAE,mBAAmB,EAAE,WAAW,EAAE,0BAA0B,EAAE,IAAI,EAAE,4BAA4B,EAAE;IAC9G,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,IAAI,EAAE,mBAAmB,EAAE;IACvF,EAAE,QAAQ,EAAE,qBAAqB,EAAE,WAAW,EAAE,4BAA4B,EAAE,IAAI,EAAE,8BAA8B,EAAE;CACrH,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAA6B;IAChE,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;QAAE,OAAO,SAAS,CAAC;IACtD,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,OAAO,mBAAmB,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;AACtD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,kBAA4B;IACnE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,kBAAkB,CAAC,CAAC;IACxC,OAAO,yBAAyB;SAC7B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;SAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type OpenAiChatCompletionRequest = {
|
|
2
|
+
model?: string;
|
|
3
|
+
messages: any[];
|
|
4
|
+
stream?: boolean;
|
|
5
|
+
tools?: any[];
|
|
6
|
+
tool_choice?: any;
|
|
7
|
+
functions?: any[];
|
|
8
|
+
function_call?: any;
|
|
9
|
+
};
|
|
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;
|
|
17
|
+
export declare function buildPromptFromMessages(messages: any[]): string;
|