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,247 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ function getEnvSource(env) {
4
+ return env ?? process.env;
5
+ }
6
+ function getCwd(cwd) {
7
+ return cwd ?? process.cwd();
8
+ }
9
+ function firstDefined(env, names) {
10
+ for (const name of names) {
11
+ const value = env[name];
12
+ if (value != null)
13
+ return value;
14
+ }
15
+ return undefined;
16
+ }
17
+ function envString(env, names) {
18
+ const value = firstDefined(env, names);
19
+ if (value == null)
20
+ return undefined;
21
+ const trimmed = value.trim();
22
+ return trimmed ? trimmed : undefined;
23
+ }
24
+ function envBool(env, names, defaultValue) {
25
+ const raw = envString(env, names);
26
+ if (raw == null)
27
+ return defaultValue;
28
+ const value = raw.toLowerCase();
29
+ if (value === "1" || value === "true" || value === "yes" || value === "on")
30
+ return true;
31
+ if (value === "0" || value === "false" || value === "no" || value === "off")
32
+ return false;
33
+ return defaultValue;
34
+ }
35
+ function envNumber(env, names, defaultValue) {
36
+ const raw = envString(env, names);
37
+ if (raw == null)
38
+ return defaultValue;
39
+ const value = Number(raw);
40
+ return Number.isFinite(value) ? value : defaultValue;
41
+ }
42
+ function normalizeModelId(raw) {
43
+ if (!raw)
44
+ return "default";
45
+ const parts = raw.split("/");
46
+ return parts[parts.length - 1] || "default";
47
+ }
48
+ function resolveAbsolutePath(raw, cwd) {
49
+ if (!raw)
50
+ return undefined;
51
+ return path.resolve(cwd, raw);
52
+ }
53
+ /** Version dir name format: YYYY.MM.DD-commit (matches cursor-agent.ps1). */
54
+ const VERSION_DIR_REGEX = /^(\d{4})\.(\d{1,2})\.(\d{1,2})-[a-f0-9]+$/;
55
+ function parseVersionToInt(name) {
56
+ const m = name.match(VERSION_DIR_REGEX);
57
+ if (!m)
58
+ return 0;
59
+ const [, year, month, day] = m;
60
+ const y = year.padStart(4, "0");
61
+ const mo = month.padStart(2, "0");
62
+ const d = day.padStart(2, "0");
63
+ return parseInt(y + mo + d, 10);
64
+ }
65
+ /**
66
+ * Find the latest version directory under dir/versions/ (e.g. cursor-agent/versions/2026.03.11-6dfa30c).
67
+ * Returns the full path to the version dir, or undefined if none found.
68
+ */
69
+ function findLatestVersionDir(dir) {
70
+ const versionsDir = path.join(dir, "versions");
71
+ if (!fs.existsSync(versionsDir) || !fs.statSync(versionsDir).isDirectory()) {
72
+ return undefined;
73
+ }
74
+ const entries = fs.readdirSync(versionsDir, { withFileTypes: true });
75
+ const versionDirs = entries
76
+ .filter((e) => e.isDirectory() && VERSION_DIR_REGEX.test(e.name))
77
+ .sort((a, b) => parseVersionToInt(b.name) - parseVersionToInt(a.name));
78
+ if (versionDirs.length === 0)
79
+ return undefined;
80
+ return path.join(versionsDir, versionDirs[0].name);
81
+ }
82
+ /**
83
+ * Auto-discovers configuration directories located inside ~/.cursor-api-proxy/accounts/
84
+ */
85
+ function isAuthenticatedAccountDir(dir) {
86
+ const configFile = path.join(dir, "cli-config.json");
87
+ if (!fs.existsSync(configFile))
88
+ return false;
89
+ try {
90
+ const config = JSON.parse(fs.readFileSync(configFile, "utf-8"));
91
+ return Boolean(config?.authInfo?.email);
92
+ }
93
+ catch {
94
+ return false;
95
+ }
96
+ }
97
+ function discoverAccountDirs(homeDir) {
98
+ if (!homeDir)
99
+ return [];
100
+ const accountsDir = path.join(homeDir, ".cursor-api-proxy", "accounts");
101
+ if (!fs.existsSync(accountsDir))
102
+ return [];
103
+ try {
104
+ const entries = fs.readdirSync(accountsDir, { withFileTypes: true });
105
+ return entries
106
+ .filter((e) => e.isDirectory())
107
+ .map((e) => path.join(accountsDir, e.name))
108
+ .filter(isAuthenticatedAccountDir);
109
+ }
110
+ catch {
111
+ return [];
112
+ }
113
+ }
114
+ export function loadEnvConfig(opts = {}) {
115
+ const env = getEnvSource(opts.env);
116
+ const cwd = getCwd(opts.cwd);
117
+ const host = envString(env, ["CURSOR_BRIDGE_HOST"]) ??
118
+ (opts.tailscale ? "0.0.0.0" : "127.0.0.1");
119
+ const portValue = envNumber(env, ["CURSOR_BRIDGE_PORT"], 8765);
120
+ const port = Number.isFinite(portValue) && portValue > 0 ? portValue : 8765;
121
+ const home = envString(env, ["HOME", "USERPROFILE"]);
122
+ const sessionsLogPath = (() => {
123
+ const explicit = resolveAbsolutePath(envString(env, ["CURSOR_BRIDGE_SESSIONS_LOG"]), cwd);
124
+ if (explicit)
125
+ return explicit;
126
+ if (home)
127
+ return path.join(home, ".cursor-api-proxy", "sessions.log");
128
+ return path.join(cwd, "sessions.log");
129
+ })();
130
+ const force = envBool(env, ["CURSOR_BRIDGE_FORCE"], false);
131
+ const rawConfigDirs = envString(env, [
132
+ "CURSOR_CONFIG_DIRS",
133
+ "CURSOR_ACCOUNT_DIRS",
134
+ ]);
135
+ let configDirs = rawConfigDirs
136
+ ? rawConfigDirs
137
+ .split(",")
138
+ .map((d) => resolveAbsolutePath(d.trim(), cwd))
139
+ .filter((d) => d !== undefined)
140
+ : [];
141
+ if (configDirs.length === 0) {
142
+ configDirs = discoverAccountDirs(home);
143
+ }
144
+ const winCmdlineRaw = envNumber(env, ["CURSOR_BRIDGE_WIN_CMDLINE_MAX"], 30_000);
145
+ const winCmdlineMax = Math.min(32_700, Math.max(4096, Number.isFinite(winCmdlineRaw) ? winCmdlineRaw : 30_000));
146
+ return {
147
+ agentBin: envString(env, [
148
+ "CURSOR_AGENT_BIN",
149
+ "CURSOR_CLI_BIN",
150
+ "CURSOR_CLI_PATH",
151
+ ]) ?? "agent",
152
+ agentNode: envString(env, ["CURSOR_AGENT_NODE"]),
153
+ agentScript: envString(env, ["CURSOR_AGENT_SCRIPT"]),
154
+ commandShell: envString(env, ["COMSPEC"]) ?? "cmd.exe",
155
+ host,
156
+ port,
157
+ requiredKey: envString(env, ["CURSOR_BRIDGE_API_KEY"]),
158
+ defaultModel: normalizeModelId(envString(env, ["CURSOR_BRIDGE_DEFAULT_MODEL"])),
159
+ force,
160
+ approveMcps: envBool(env, ["CURSOR_BRIDGE_APPROVE_MCPS"], false),
161
+ strictModel: envBool(env, ["CURSOR_BRIDGE_STRICT_MODEL"], true),
162
+ workspace: resolveAbsolutePath(envString(env, ["CURSOR_BRIDGE_WORKSPACE"]), cwd) ??
163
+ cwd,
164
+ timeoutMs: envNumber(env, ["CURSOR_BRIDGE_TIMEOUT_MS"], 300_000),
165
+ tlsCertPath: resolveAbsolutePath(envString(env, ["CURSOR_BRIDGE_TLS_CERT"]), cwd),
166
+ tlsKeyPath: resolveAbsolutePath(envString(env, ["CURSOR_BRIDGE_TLS_KEY"]), cwd),
167
+ sessionsLogPath,
168
+ chatOnlyWorkspace: envBool(env, ["CURSOR_BRIDGE_CHAT_ONLY_WORKSPACE"], true),
169
+ verbose: envBool(env, ["CURSOR_BRIDGE_VERBOSE"], false),
170
+ maxMode: envBool(env, ["CURSOR_BRIDGE_MAX_MODE"], false),
171
+ promptViaStdin: envBool(env, ["CURSOR_BRIDGE_PROMPT_VIA_STDIN"], false),
172
+ useAcp: envBool(env, ["CURSOR_BRIDGE_USE_ACP"], false),
173
+ configDirs,
174
+ multiPort: envBool(env, ["CURSOR_BRIDGE_MULTI_PORT"], false),
175
+ winCmdlineMax,
176
+ };
177
+ }
178
+ export function resolveAgentCommand(cmd, args, opts = {}) {
179
+ const env = getEnvSource(opts.env);
180
+ const loaded = loadEnvConfig(opts);
181
+ const platform = opts.platform ?? process.platform;
182
+ const cwd = getCwd(opts.cwd);
183
+ // Windows: CURSOR_AGENT_NODE+SCRIPT bypasses cmd.exe's ~8191 char limit.
184
+ // Unix: same vars let the host override the agent's bundled node (avoids
185
+ // segfaults with --list-models on some macOS installs).
186
+ if (loaded.agentNode && loaded.agentScript) {
187
+ const agentScriptPath = path.isAbsolute(loaded.agentScript)
188
+ ? loaded.agentScript
189
+ : path.resolve(cwd, loaded.agentScript);
190
+ const invoker = platform === "win32" ? "agent.cmd" : "agent";
191
+ return {
192
+ command: loaded.agentNode,
193
+ args: [loaded.agentScript, ...args],
194
+ env: { ...env, CURSOR_INVOKED_AS: invoker },
195
+ agentScriptPath,
196
+ };
197
+ }
198
+ if (platform === "win32") {
199
+ if (/\.cmd$/i.test(cmd)) {
200
+ const cmdResolved = path.resolve(cwd, cmd);
201
+ const dir = path.dirname(cmdResolved);
202
+ const nodeBin = path.join(dir, "node.exe");
203
+ const script = path.join(dir, "index.js");
204
+ if (fs.existsSync(nodeBin) && fs.existsSync(script)) {
205
+ const configDir = path.join(dir, "..", "data", "config");
206
+ return {
207
+ command: nodeBin,
208
+ args: [script, ...args],
209
+ env: { ...env, CURSOR_INVOKED_AS: "agent.cmd" },
210
+ agentScriptPath: script,
211
+ configDir: fs.existsSync(path.join(configDir, "cli-config.json"))
212
+ ? configDir
213
+ : undefined,
214
+ };
215
+ }
216
+ const versionDir = findLatestVersionDir(dir);
217
+ if (versionDir) {
218
+ const versionNode = path.join(versionDir, "node.exe");
219
+ const versionScript = path.join(versionDir, "index.js");
220
+ if (fs.existsSync(versionNode) && fs.existsSync(versionScript)) {
221
+ const configDir = path.join(dir, "..", "data", "config");
222
+ return {
223
+ command: versionNode,
224
+ args: [versionScript, ...args],
225
+ env: { ...env, CURSOR_INVOKED_AS: "agent.cmd" },
226
+ agentScriptPath: versionScript,
227
+ configDir: fs.existsSync(path.join(configDir, "cli-config.json"))
228
+ ? configDir
229
+ : undefined,
230
+ };
231
+ }
232
+ }
233
+ const quotedArgs = args
234
+ .map((arg) => (arg.includes(" ") ? `"${arg}"` : arg))
235
+ .join(" ");
236
+ const cmdLine = `""${cmd}" ${quotedArgs}"`;
237
+ return {
238
+ command: loaded.commandShell,
239
+ args: ["/d", "/s", "/c", cmdLine],
240
+ env,
241
+ windowsVerbatimArguments: true,
242
+ };
243
+ }
244
+ }
245
+ return { command: cmd, args, env };
246
+ }
247
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/lib/env.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import * as http from "node:http";
2
+ import type { BridgeConfig } from "../config.js";
3
+ export type AnthropicMessagesCtx = {
4
+ config: BridgeConfig;
5
+ lastRequestedModelRef: {
6
+ current?: string;
7
+ };
8
+ };
9
+ export declare function handleAnthropicMessages(req: http.IncomingMessage, res: http.ServerResponse, ctx: AnthropicMessagesCtx, rawBody: string, method: string, pathname: string, remoteAddress: string): Promise<void>;
@@ -0,0 +1,281 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { buildPromptFromAnthropicMessages } from "../anthropic.js";
3
+ import { buildAgentFixedArgs } from "../agent-cmd-args.js";
4
+ import { runAgentStream, runAgentSync } from "../agent-runner.js";
5
+ import { createStreamParser } from "../cli-stream-parser.js";
6
+ import { json, writeSseHeaders } from "../http.js";
7
+ import { resolveToCursorModel } from "../model-map.js";
8
+ import { normalizeModelId, toolsToSystemText } from "../openai.js";
9
+ import { logAgentError, logAccountAssigned, logAccountStats, logTrafficRequest, logTrafficResponse, } from "../request-log.js";
10
+ import { resolveModel } from "../resolve-model.js";
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
+ import { fitPromptToWinCmdline, warnPromptTruncated, } from "../win-cmdline-limit.js";
15
+ function isRateLimited(stderr) {
16
+ return /\b429\b|rate.?limit|too many requests/i.test(stderr);
17
+ }
18
+ export async function handleAnthropicMessages(req, res, ctx, rawBody, method, pathname, remoteAddress) {
19
+ const { config, lastRequestedModelRef } = ctx;
20
+ const body = JSON.parse(rawBody || "{}");
21
+ const requested = normalizeModelId(body.model);
22
+ const model = resolveModel(requested, lastRequestedModelRef, config);
23
+ const displayModel = requested === "default" && config.defaultModel !== "default"
24
+ ? config.defaultModel
25
+ : model;
26
+ const cleanSystem = sanitizeSystem(body.system);
27
+ const cleanMessages = sanitizeMessages(body.messages ?? []);
28
+ const toolsText = toolsToSystemText(body.tools);
29
+ const systemWithTools = toolsText
30
+ ? [cleanSystem, toolsText].filter(Boolean).join("\n\n")
31
+ : cleanSystem;
32
+ const prompt = buildPromptFromAnthropicMessages(cleanMessages, systemWithTools);
33
+ if (body.max_tokens == null || typeof body.max_tokens !== "number") {
34
+ json(res, 400, {
35
+ error: {
36
+ type: "invalid_request_error",
37
+ message: "max_tokens is required",
38
+ },
39
+ });
40
+ return;
41
+ }
42
+ const cursorModel = resolveToCursorModel(model) ?? model;
43
+ const trafficMessages = [];
44
+ if (cleanSystem) {
45
+ const sys = typeof cleanSystem === "string"
46
+ ? cleanSystem
47
+ : cleanSystem
48
+ .filter((p) => p.type === "text")
49
+ .map((p) => p.text ?? "")
50
+ .join("\n");
51
+ if (sys.trim())
52
+ trafficMessages.push({ role: "system", content: sys.trim() });
53
+ }
54
+ for (const m of cleanMessages) {
55
+ const text = typeof m.content === "string"
56
+ ? m.content
57
+ : m.content
58
+ .filter((p) => p.type === "text")
59
+ .map((p) => p.text ?? "")
60
+ .join("");
61
+ if (text)
62
+ trafficMessages.push({ role: m.role, content: text });
63
+ }
64
+ logTrafficRequest(config.verbose, model ?? cursorModel, trafficMessages, !!body.stream);
65
+ const headerWs = req.headers["x-cursor-workspace"];
66
+ let workspaceDir;
67
+ let tempDir;
68
+ try {
69
+ const ws = resolveWorkspace(config, headerWs);
70
+ workspaceDir = ws.workspaceDir;
71
+ tempDir = ws.tempDir;
72
+ }
73
+ catch (e) {
74
+ const msg = e instanceof Error ? e.message : "Invalid workspace";
75
+ json(res, 400, {
76
+ error: { type: "invalid_request_error", message: msg },
77
+ });
78
+ return;
79
+ }
80
+ const fixedArgs = buildAgentFixedArgs(config, workspaceDir, cursorModel, !!body.stream);
81
+ const fit = fitPromptToWinCmdline(config.agentBin, fixedArgs, prompt, {
82
+ maxCmdline: config.winCmdlineMax,
83
+ platform: process.platform,
84
+ cwd: workspaceDir,
85
+ });
86
+ if (!fit.ok) {
87
+ json(res, 500, {
88
+ error: {
89
+ type: "api_error",
90
+ message: fit.error,
91
+ code: "windows_cmdline_limit",
92
+ },
93
+ });
94
+ return;
95
+ }
96
+ if (fit.truncated) {
97
+ warnPromptTruncated(fit.originalLength, fit.finalPromptLength);
98
+ }
99
+ const cmdArgs = fit.args;
100
+ const msgId = `msg_${randomUUID().replace(/-/g, "")}`;
101
+ const truncatedHeaders = fit.truncated
102
+ ? { "X-Cursor-Proxy-Prompt-Truncated": "true" }
103
+ : undefined;
104
+ const promptForAgent = config.promptViaStdin || config.useAcp ? prompt : undefined;
105
+ if (body.stream) {
106
+ writeSseHeaders(res, truncatedHeaders);
107
+ res.on("error", () => {
108
+ /* client disconnected mid-stream */
109
+ });
110
+ const writeEvent = (evt) => {
111
+ res.write(`data: ${JSON.stringify(evt)}\n\n`);
112
+ };
113
+ writeEvent({
114
+ type: "message_start",
115
+ message: {
116
+ id: msgId,
117
+ type: "message",
118
+ role: "assistant",
119
+ model: displayModel ?? cursorModel,
120
+ content: [],
121
+ },
122
+ });
123
+ writeEvent({
124
+ type: "content_block_start",
125
+ index: 0,
126
+ content_block: { type: "text", text: "" },
127
+ });
128
+ const configDir = getNextAccountConfigDir();
129
+ logAccountAssigned(configDir);
130
+ reportRequestStart(configDir);
131
+ const streamStart = Date.now();
132
+ const abortController = new AbortController();
133
+ req.once("close", () => abortController.abort());
134
+ if (config.useAcp && typeof promptForAgent === "string") {
135
+ let accumulated = "";
136
+ runAgentStream(config, workspaceDir, cmdArgs, (chunk) => {
137
+ accumulated += chunk;
138
+ writeEvent({
139
+ type: "content_block_delta",
140
+ index: 0,
141
+ delta: { type: "text_delta", text: chunk },
142
+ });
143
+ }, tempDir, promptForAgent, configDir, abortController.signal)
144
+ .then(({ code, stderr: stderrOut }) => {
145
+ const latencyMs = Date.now() - streamStart;
146
+ reportRequestEnd(configDir);
147
+ if (stderrOut && isRateLimited(stderrOut)) {
148
+ reportRateLimit(configDir, 60000);
149
+ }
150
+ if (!abortController.signal.aborted) {
151
+ if (code !== 0) {
152
+ reportRequestError(configDir, latencyMs);
153
+ const publicMsg = logAgentError(config.sessionsLogPath, method, pathname, remoteAddress, code, stderrOut);
154
+ writeEvent({
155
+ type: "error",
156
+ error: { type: "api_error", message: publicMsg },
157
+ });
158
+ }
159
+ else {
160
+ reportRequestSuccess(configDir, latencyMs);
161
+ logTrafficResponse(config.verbose, model ?? cursorModel, accumulated, true);
162
+ writeEvent({ type: "content_block_stop", index: 0 });
163
+ writeEvent({
164
+ type: "message_delta",
165
+ delta: { stop_reason: "end_turn", stop_sequence: null },
166
+ usage: { output_tokens: 0 },
167
+ });
168
+ writeEvent({ type: "message_stop" });
169
+ }
170
+ }
171
+ logAccountStats(config.verbose, getAccountStats());
172
+ res.end();
173
+ })
174
+ .catch((err) => {
175
+ reportRequestEnd(configDir);
176
+ if (!abortController.signal.aborted) {
177
+ reportRequestError(configDir, Date.now() - streamStart);
178
+ }
179
+ console.error(`[${new Date().toISOString()}] Agent stream error:`, err);
180
+ if (!abortController.signal.aborted) {
181
+ writeEvent({
182
+ type: "error",
183
+ error: {
184
+ type: "api_error",
185
+ message: "The Cursor agent stream failed. See server logs for details.",
186
+ },
187
+ });
188
+ }
189
+ res.end();
190
+ });
191
+ return;
192
+ }
193
+ let accumulated = "";
194
+ const parseLine = createStreamParser((text) => {
195
+ accumulated += text;
196
+ writeEvent({
197
+ type: "content_block_delta",
198
+ index: 0,
199
+ delta: { type: "text_delta", text },
200
+ });
201
+ }, () => {
202
+ logTrafficResponse(config.verbose, model ?? cursorModel, accumulated, true);
203
+ writeEvent({ type: "content_block_stop", index: 0 });
204
+ writeEvent({
205
+ type: "message_delta",
206
+ delta: { stop_reason: "end_turn", stop_sequence: null },
207
+ usage: { output_tokens: 0 },
208
+ });
209
+ writeEvent({ type: "message_stop" });
210
+ });
211
+ runAgentStream(config, workspaceDir, cmdArgs, parseLine, tempDir, promptForAgent, configDir, abortController.signal)
212
+ .then(({ code, stderr: stderrOut }) => {
213
+ const latencyMs = Date.now() - streamStart;
214
+ reportRequestEnd(configDir);
215
+ if (stderrOut && isRateLimited(stderrOut)) {
216
+ reportRateLimit(configDir, 60000);
217
+ }
218
+ if (abortController.signal.aborted) {
219
+ /* client disconnected — do not count as success or failure */
220
+ }
221
+ else if (code !== 0) {
222
+ reportRequestError(configDir, latencyMs);
223
+ logAgentError(config.sessionsLogPath, method, pathname, remoteAddress, code, stderrOut);
224
+ }
225
+ else {
226
+ reportRequestSuccess(configDir, latencyMs);
227
+ }
228
+ logAccountStats(config.verbose, getAccountStats());
229
+ res.end();
230
+ })
231
+ .catch((err) => {
232
+ reportRequestEnd(configDir);
233
+ if (!abortController.signal.aborted) {
234
+ reportRequestError(configDir, Date.now() - streamStart);
235
+ }
236
+ console.error(`[${new Date().toISOString()}] Agent stream error:`, err);
237
+ res.end();
238
+ });
239
+ return;
240
+ }
241
+ const configDir = getNextAccountConfigDir();
242
+ logAccountAssigned(configDir);
243
+ reportRequestStart(configDir);
244
+ const syncStart = Date.now();
245
+ const abortController = new AbortController();
246
+ req.once("close", () => abortController.abort());
247
+ const out = await runAgentSync(config, workspaceDir, cmdArgs, tempDir, promptForAgent, configDir, abortController.signal);
248
+ const syncLatency = Date.now() - syncStart;
249
+ reportRequestEnd(configDir);
250
+ if (out.stderr && isRateLimited(out.stderr)) {
251
+ reportRateLimit(configDir, 60000);
252
+ }
253
+ if (out.code !== 0) {
254
+ reportRequestError(configDir, syncLatency);
255
+ logAccountStats(config.verbose, getAccountStats());
256
+ const errMsg = logAgentError(config.sessionsLogPath, method, pathname, remoteAddress, out.code, out.stderr);
257
+ json(res, 500, {
258
+ error: { type: "api_error", message: errMsg, code: "cursor_cli_error" },
259
+ });
260
+ return;
261
+ }
262
+ reportRequestSuccess(configDir, syncLatency);
263
+ const content = out.stdout.trim();
264
+ logTrafficResponse(config.verbose, model ?? cursorModel, content, false);
265
+ logAccountStats(config.verbose, getAccountStats());
266
+ const inTok = Math.max(1, Math.round(prompt.length / 4));
267
+ const outTok = Math.max(1, Math.round(content.length / 4));
268
+ json(res, 200, {
269
+ id: msgId,
270
+ type: "message",
271
+ role: "assistant",
272
+ content: [{ type: "text", text: content }],
273
+ model: displayModel ?? cursorModel,
274
+ stop_reason: "end_turn",
275
+ usage: {
276
+ input_tokens: inTok,
277
+ output_tokens: outTok,
278
+ },
279
+ }, truncatedHeaders);
280
+ }
281
+ //# sourceMappingURL=anthropic-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-messages.js","sourceRoot":"","sources":["../../../src/lib/handlers/anthropic-messages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import * as http from "node:http";
2
+ import type { BridgeConfig } from "../config.js";
3
+ export type ChatCompletionsCtx = {
4
+ config: BridgeConfig;
5
+ lastRequestedModelRef: {
6
+ current?: string;
7
+ };
8
+ };
9
+ export declare function handleChatCompletions(req: http.IncomingMessage, res: http.ServerResponse, ctx: ChatCompletionsCtx, rawBody: string, method: string, pathname: string, remoteAddress: string): Promise<void>;