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.
Files changed (104) hide show
  1. package/README.md +303 -0
  2. package/dist/cli/accounts.d.ts +18 -0
  3. package/dist/cli/accounts.js +149 -0
  4. package/dist/cli/accounts.js.map +1 -0
  5. package/dist/cli/args.d.ts +14 -0
  6. package/dist/cli/args.js +93 -0
  7. package/dist/cli/args.js.map +1 -0
  8. package/dist/cli/constants.d.ts +1 -0
  9. package/dist/cli/constants.js +4 -0
  10. package/dist/cli/constants.js.map +1 -0
  11. package/dist/cli/login.d.ts +1 -0
  12. package/dist/cli/login.js +143 -0
  13. package/dist/cli/login.js.map +1 -0
  14. package/dist/cli/reset-hwid.d.ts +24 -0
  15. package/dist/cli/reset-hwid.js +286 -0
  16. package/dist/cli/reset-hwid.js.map +1 -0
  17. package/dist/cli/usage.d.ts +27 -0
  18. package/dist/cli/usage.js +177 -0
  19. package/dist/cli/usage.js.map +1 -0
  20. package/dist/cli.d.ts +2 -0
  21. package/dist/cli.js +58 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/client.d.ts +95 -0
  24. package/dist/client.js +316 -0
  25. package/dist/client.js.map +1 -0
  26. package/dist/lib/account-pool.d.ts +35 -0
  27. package/dist/lib/account-pool.js +143 -0
  28. package/dist/lib/account-pool.js.map +1 -0
  29. package/dist/lib/acp-client.d.ts +53 -0
  30. package/dist/lib/acp-client.js +517 -0
  31. package/dist/lib/acp-client.js.map +1 -0
  32. package/dist/lib/agent-cmd-args.d.ts +9 -0
  33. package/dist/lib/agent-cmd-args.js +29 -0
  34. package/dist/lib/agent-cmd-args.js.map +1 -0
  35. package/dist/lib/agent-runner.d.ts +12 -0
  36. package/dist/lib/agent-runner.js +144 -0
  37. package/dist/lib/agent-runner.js.map +1 -0
  38. package/dist/lib/anthropic.d.ts +26 -0
  39. package/dist/lib/anthropic.js +70 -0
  40. package/dist/lib/anthropic.js.map +1 -0
  41. package/dist/lib/cli-stream-parser.d.ts +8 -0
  42. package/dist/lib/cli-stream-parser.js +46 -0
  43. package/dist/lib/cli-stream-parser.js.map +1 -0
  44. package/dist/lib/config.d.ts +52 -0
  45. package/dist/lib/config.js +47 -0
  46. package/dist/lib/config.js.map +1 -0
  47. package/dist/lib/cursor-cli.d.ts +9 -0
  48. package/dist/lib/cursor-cli.js +30 -0
  49. package/dist/lib/cursor-cli.js.map +1 -0
  50. package/dist/lib/env.d.ts +54 -0
  51. package/dist/lib/env.js +247 -0
  52. package/dist/lib/env.js.map +1 -0
  53. package/dist/lib/handlers/anthropic-messages.d.ts +9 -0
  54. package/dist/lib/handlers/anthropic-messages.js +281 -0
  55. package/dist/lib/handlers/anthropic-messages.js.map +1 -0
  56. package/dist/lib/handlers/chat-completions.d.ts +9 -0
  57. package/dist/lib/handlers/chat-completions.js +275 -0
  58. package/dist/lib/handlers/chat-completions.js.map +1 -0
  59. package/dist/lib/handlers/health.d.ts +7 -0
  60. package/dist/lib/handlers/health.js +15 -0
  61. package/dist/lib/handlers/health.js.map +1 -0
  62. package/dist/lib/handlers/models.d.ts +15 -0
  63. package/dist/lib/handlers/models.js +44 -0
  64. package/dist/lib/handlers/models.js.map +1 -0
  65. package/dist/lib/http.d.ts +5 -0
  66. package/dist/lib/http.js +36 -0
  67. package/dist/lib/http.js.map +1 -0
  68. package/dist/lib/max-mode-preflight.d.ts +5 -0
  69. package/dist/lib/max-mode-preflight.js +62 -0
  70. package/dist/lib/max-mode-preflight.js.map +1 -0
  71. package/dist/lib/model-map.d.ts +17 -0
  72. package/dist/lib/model-map.js +62 -0
  73. package/dist/lib/model-map.js.map +1 -0
  74. package/dist/lib/openai.d.ts +17 -0
  75. package/dist/lib/openai.js +111 -0
  76. package/dist/lib/openai.js.map +1 -0
  77. package/dist/lib/process.d.ts +32 -0
  78. package/dist/lib/process.js +174 -0
  79. package/dist/lib/process.js.map +1 -0
  80. package/dist/lib/request-listener.d.ts +7 -0
  81. package/dist/lib/request-listener.js +99 -0
  82. package/dist/lib/request-listener.js.map +1 -0
  83. package/dist/lib/request-log.d.ts +16 -0
  84. package/dist/lib/request-log.js +147 -0
  85. package/dist/lib/request-log.js.map +1 -0
  86. package/dist/lib/resolve-model.d.ts +8 -0
  87. package/dist/lib/resolve-model.js +18 -0
  88. package/dist/lib/resolve-model.js.map +1 -0
  89. package/dist/lib/sanitize.d.ts +21 -0
  90. package/dist/lib/sanitize.js +79 -0
  91. package/dist/lib/sanitize.js.map +1 -0
  92. package/dist/lib/server.d.ts +13 -0
  93. package/dist/lib/server.js +118 -0
  94. package/dist/lib/server.js.map +1 -0
  95. package/dist/lib/token-cache.d.ts +10 -0
  96. package/dist/lib/token-cache.js +35 -0
  97. package/dist/lib/token-cache.js.map +1 -0
  98. package/dist/lib/win-cmdline-limit.d.ts +32 -0
  99. package/dist/lib/win-cmdline-limit.js +92 -0
  100. package/dist/lib/win-cmdline-limit.js.map +1 -0
  101. package/dist/lib/workspace.d.ts +19 -0
  102. package/dist/lib/workspace.js +77 -0
  103. package/dist/lib/workspace.js.map +1 -0
  104. 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,7 @@
1
+ import * as http from "node:http";
2
+ import type { BridgeConfig } from "../config.js";
3
+ export type HealthHandlerOpts = {
4
+ version: string;
5
+ config: BridgeConfig;
6
+ };
7
+ export declare function handleHealth(res: http.ServerResponse, opts: HealthHandlerOpts): void;
@@ -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>;
@@ -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,5 @@
1
+ /**
2
+ * Write maxMode: true to the first writable cli-config.json.
3
+ * Best-effort: ignores errors (e.g. missing or read-only config).
4
+ */
5
+ export declare function runMaxModePreflight(agentScriptPath?: string, configDirOverride?: string): void;
@@ -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":"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"}
@@ -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;