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,18 @@
1
+ /**
2
+ * Resolve the requested model (already normalized) to the final model string,
3
+ * applying strictModel and lastRequestedModelRef semantics.
4
+ */
5
+ export function resolveModel(requested, lastRequestedModelRef, config) {
6
+ const isDefault = requested === "default";
7
+ const explicitModel = requested && !isDefault ? requested : undefined;
8
+ if (explicitModel)
9
+ lastRequestedModelRef.current = explicitModel;
10
+ // "default" matches ACP catalog name for session default model — pass through directly
11
+ if (isDefault)
12
+ return "default";
13
+ return (explicitModel ??
14
+ (config.strictModel ? lastRequestedModelRef.current : undefined) ??
15
+ lastRequestedModelRef.current ??
16
+ config.defaultModel);
17
+ }
18
+ //# sourceMappingURL=resolve-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-model.js","sourceRoot":"","sources":["../../src/lib/resolve-model.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,SAA6B,EAC7B,qBAA2C,EAC3C,MAAoB;IAEpB,MAAM,SAAS,GAAG,SAAS,KAAK,SAAS,CAAC;IAC1C,MAAM,aAAa,GAAG,SAAS,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IACtE,IAAI,aAAa;QAAE,qBAAqB,CAAC,OAAO,GAAG,aAAa,CAAC;IAEjE,uFAAuF;IACvF,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC;IAEhC,OAAO,CACL,aAAa;QACb,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QAChE,qBAAqB,CAAC,OAAO;QAC7B,MAAM,CAAC,YAAY,CACpB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Sanitizes prompts passed to the Cursor CLI agent by stripping/replacing
3
+ * third-party AI branding, telemetry headers, and identifying metadata that
4
+ * could indicate the request originated outside of Cursor.
5
+ */
6
+ /**
7
+ * Apply all sanitization rules to a string.
8
+ * Safe to call with any string; returns the original value if nothing matched.
9
+ */
10
+ export declare function sanitizeText(text: string): string;
11
+ /** Alias kept for backwards compat. */
12
+ export declare const sanitizePrompt: typeof sanitizeText;
13
+ /**
14
+ * Sanitize an OpenAI-style messages array in place (returns a new array).
15
+ * Handles both string and array content parts.
16
+ */
17
+ export declare function sanitizeMessages(messages: any[]): any[];
18
+ /**
19
+ * Sanitize an Anthropic-style system field (string or content-block array).
20
+ */
21
+ export declare function sanitizeSystem(system: any): any;
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Sanitizes prompts passed to the Cursor CLI agent by stripping/replacing
3
+ * third-party AI branding, telemetry headers, and identifying metadata that
4
+ * could indicate the request originated outside of Cursor.
5
+ */
6
+ const RULES = [
7
+ // Strip x-anthropic-billing-header prefix (injected by Claude Code CLI)
8
+ [/x-anthropic-billing-header:[^\n]*\n?/gi, ""],
9
+ // Strip individual telemetry tokens that may appear in headers or text
10
+ [/\bcc_version=[^\s;,\n]+[;,]?\s*/gi, ""],
11
+ [/\bcc_entrypoint=[^\s;,\n]+[;,]?\s*/gi, ""],
12
+ [/\bcch=[a-f0-9]+[;,]?\s*/gi, ""],
13
+ // Replace "Claude Code" product name with "Cursor"
14
+ [/\bClaude Code\b/g, "Cursor"],
15
+ // Replace full Anthropic CLI description
16
+ [/Anthropic['']s official CLI for Claude/gi, "Cursor AI assistant"],
17
+ // Replace remaining Anthropic company brand references
18
+ [/\bAnthropic\b/g, "Cursor"],
19
+ // Replace known Anthropic domains
20
+ [/anthropic\.com/gi, "cursor.com"],
21
+ [/claude\.ai/gi, "cursor.sh"],
22
+ // Normalise leftover leading semicolons/whitespace at start of content
23
+ [/^[;,\s]+/, ""],
24
+ ];
25
+ /**
26
+ * Apply all sanitization rules to a string.
27
+ * Safe to call with any string; returns the original value if nothing matched.
28
+ */
29
+ export function sanitizeText(text) {
30
+ let s = text;
31
+ for (const [pattern, replacement] of RULES) {
32
+ s = s.replace(pattern, replacement);
33
+ }
34
+ return s;
35
+ }
36
+ /** Alias kept for backwards compat. */
37
+ export const sanitizePrompt = sanitizeText;
38
+ /**
39
+ * Sanitize an OpenAI-style messages array in place (returns a new array).
40
+ * Handles both string and array content parts.
41
+ */
42
+ export function sanitizeMessages(messages) {
43
+ return (messages ?? []).map((m) => {
44
+ if (!m)
45
+ return m;
46
+ if (typeof m.content === "string") {
47
+ return { ...m, content: sanitizeText(m.content) };
48
+ }
49
+ if (Array.isArray(m.content)) {
50
+ return {
51
+ ...m,
52
+ content: m.content.map((p) => {
53
+ if (p?.type === "text" && typeof p.text === "string") {
54
+ return { ...p, text: sanitizeText(p.text) };
55
+ }
56
+ return p;
57
+ }),
58
+ };
59
+ }
60
+ return m;
61
+ });
62
+ }
63
+ /**
64
+ * Sanitize an Anthropic-style system field (string or content-block array).
65
+ */
66
+ export function sanitizeSystem(system) {
67
+ if (typeof system === "string")
68
+ return sanitizeText(system);
69
+ if (Array.isArray(system)) {
70
+ return system.map((p) => {
71
+ if (p?.type === "text" && typeof p.text === "string") {
72
+ return { ...p, text: sanitizeText(p.text) };
73
+ }
74
+ return p;
75
+ });
76
+ }
77
+ return system;
78
+ }
79
+ //# sourceMappingURL=sanitize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../../src/lib/sanitize.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,KAAK,GAA4B;IACrC,wEAAwE;IACxE,CAAC,wCAAwC,EAAE,EAAE,CAAC;IAC9C,uEAAuE;IACvE,CAAC,mCAAmC,EAAE,EAAE,CAAC;IACzC,CAAC,sCAAsC,EAAE,EAAE,CAAC;IAC5C,CAAC,2BAA2B,EAAE,EAAE,CAAC;IACjC,mDAAmD;IACnD,CAAC,kBAAkB,EAAE,QAAQ,CAAC;IAC9B,yCAAyC;IACzC,CAAC,0CAA0C,EAAE,qBAAqB,CAAC;IACnE,uDAAuD;IACvD,CAAC,gBAAgB,EAAE,QAAQ,CAAC;IAC5B,kCAAkC;IAClC,CAAC,kBAAkB,EAAE,YAAY,CAAC;IAClC,CAAC,cAAc,EAAE,WAAW,CAAC;IAC7B,uEAAuE;IACvE,CAAC,UAAU,EAAE,EAAE,CAAC;CACjB,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,IAAI,CAAC,GAAG,IAAI,CAAC;IACb,KAAK,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,KAAK,EAAE,CAAC;QAC3C,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,uCAAuC;AACvC,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAC;AAE3C;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAe;IAC9C,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE;QACrC,IAAI,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;QACjB,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YAClC,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;QACpD,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,OAAO;gBACL,GAAG,CAAC;gBACJ,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE;oBAChC,IAAI,CAAC,EAAE,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;wBACrD,OAAO,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC9C,CAAC;oBACD,OAAO,CAAC,CAAC;gBACX,CAAC,CAAC;aACH,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAW;IACxC,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;IAC5D,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE;YAC3B,IAAI,CAAC,EAAE,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrD,OAAO,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9C,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import * as http from "node:http";
2
+ import * as https from "node:https";
3
+ import type { BridgeConfig } from "./config.js";
4
+ export type BridgeServerOptions = {
5
+ version: string;
6
+ config: BridgeConfig;
7
+ };
8
+ export declare function startBridgeServer(opts: BridgeServerOptions): (http.Server | https.Server)[];
9
+ /**
10
+ * Register SIGTERM / SIGINT handlers for graceful shutdown.
11
+ * Closes all HTTP(S) servers, kills in-flight agent processes, then exits.
12
+ */
13
+ export declare function setupGracefulShutdown(servers: (http.Server | https.Server)[], timeoutMs?: number): void;
@@ -0,0 +1,118 @@
1
+ import * as fs from "node:fs";
2
+ import * as http from "node:http";
3
+ import * as https from "node:https";
4
+ import { createRequestListener } from "./request-listener.js";
5
+ import { initAccountPool } from "./account-pool.js";
6
+ import { killAllChildProcesses } from "./process.js";
7
+ function acpLauncherLabel(acpArgs) {
8
+ const first = acpArgs[0];
9
+ if (first && /\.[cm]?js$/i.test(first))
10
+ return "node + script";
11
+ return "cmd";
12
+ }
13
+ export function startBridgeServer(opts) {
14
+ const { config } = opts;
15
+ const servers = [];
16
+ if (config.configDirs && config.configDirs.length > 0) {
17
+ if (config.multiPort) {
18
+ // In multi-port mode, we don't need a central pool. We spawn a server for each configDir
19
+ config.configDirs.forEach((dir, index) => {
20
+ const port = config.port + index;
21
+ const serverOpts = {
22
+ ...opts,
23
+ config: {
24
+ ...config,
25
+ port,
26
+ configDirs: [dir], // each server gets only one configDir
27
+ multiPort: false, // Disable multi-port for child servers to prevent recursion
28
+ },
29
+ };
30
+ const server = startSingleServer(serverOpts);
31
+ servers.push(server);
32
+ });
33
+ return servers;
34
+ }
35
+ else {
36
+ initAccountPool(config.configDirs);
37
+ }
38
+ }
39
+ servers.push(startSingleServer(opts));
40
+ return servers;
41
+ }
42
+ /**
43
+ * Register SIGTERM / SIGINT handlers for graceful shutdown.
44
+ * Closes all HTTP(S) servers, kills in-flight agent processes, then exits.
45
+ */
46
+ export function setupGracefulShutdown(servers, timeoutMs = 10_000) {
47
+ let shuttingDown = false;
48
+ const shutdown = (signal) => {
49
+ if (shuttingDown)
50
+ return;
51
+ shuttingDown = true;
52
+ console.log(`\n[${new Date().toISOString()}] ${signal} received — shutting down gracefully…`);
53
+ // Stop accepting new connections and kill all in-flight agent processes
54
+ killAllChildProcesses();
55
+ const closePromises = servers.map((s) => new Promise((resolve) => {
56
+ // closeAllConnections available since Node 18.2
57
+ if (typeof s.closeAllConnections === "function") {
58
+ s.closeAllConnections();
59
+ }
60
+ s.close(() => resolve());
61
+ }));
62
+ const forceExit = setTimeout(() => {
63
+ console.error("[shutdown] Timed out waiting for connections to drain — forcing exit.");
64
+ process.exit(1);
65
+ }, timeoutMs).unref();
66
+ Promise.all(closePromises).then(() => {
67
+ clearTimeout(forceExit);
68
+ process.exit(0);
69
+ });
70
+ };
71
+ process.once("SIGTERM", () => shutdown("SIGTERM"));
72
+ process.once("SIGINT", () => shutdown("SIGINT"));
73
+ }
74
+ function startSingleServer(opts) {
75
+ const { config } = opts;
76
+ const requestListener = createRequestListener(opts);
77
+ const useTls = Boolean(config.tlsCertPath && config.tlsKeyPath);
78
+ let server;
79
+ if (useTls) {
80
+ const cert = fs.readFileSync(config.tlsCertPath, "utf8");
81
+ const key = fs.readFileSync(config.tlsKeyPath, "utf8");
82
+ server = https.createServer({ cert, key }, requestListener);
83
+ }
84
+ else {
85
+ server = http.createServer(requestListener);
86
+ }
87
+ server.on("error", (err) => {
88
+ if (err.code === "EADDRINUSE") {
89
+ console.error(`\u274c Port ${config.port} is already in use. Set CURSOR_BRIDGE_PORT to use a different port.`);
90
+ }
91
+ else {
92
+ console.error(`\u274c Server error:`, err.message);
93
+ }
94
+ process.exit(1);
95
+ });
96
+ server.listen(config.port, config.host, () => {
97
+ const scheme = useTls ? "https" : "http";
98
+ console.log(`cursor-api-proxy listening on ${scheme}://${config.host}:${config.port}`);
99
+ console.log(`- agent bin: ${config.agentBin}`);
100
+ console.log(`- ACP: ${config.useAcp ? "yes" : "no"}${config.useAcp ? ` (launcher: ${acpLauncherLabel(config.acpArgs)})` : ""}`);
101
+ console.log(`- workspace: ${config.workspace}`);
102
+ console.log(`- mode: ${config.mode}`);
103
+ console.log(`- default model: ${config.defaultModel}`);
104
+ console.log(`- force: ${config.force}`);
105
+ console.log(`- approve mcps: ${config.approveMcps}`);
106
+ console.log(`- required api key: ${config.requiredKey ? "yes" : "no"}`);
107
+ console.log(`- sessions log: ${config.sessionsLogPath}`);
108
+ console.log(`- chat-only workspace: ${config.chatOnlyWorkspace ? "yes (isolated temp dir)" : "no"}`);
109
+ console.log(`- verbose traffic: ${config.verbose ? "yes (CURSOR_BRIDGE_VERBOSE=true)" : "no"}`);
110
+ console.log(`- max mode: ${config.maxMode ? "yes (CURSOR_BRIDGE_MAX_MODE=true)" : "no"}`);
111
+ console.log(`- Windows cmdline budget: ${config.winCmdlineMax} (prompt tail truncation when over limit; Windows only)`);
112
+ if (config.configDirs && config.configDirs.length > 0) {
113
+ console.log(`- account pool: enabled with ${config.configDirs.length} configuration directories`);
114
+ }
115
+ });
116
+ return server;
117
+ }
118
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/lib/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /** Token file written per-account after each agent run */
2
+ export declare const TOKEN_FILE = ".cursor-token";
3
+ export declare function readCachedToken(configDir: string): string | undefined;
4
+ export declare function writeCachedToken(configDir: string, token: string): void;
5
+ /**
6
+ * Read the shared macOS Keychain slot used by the Cursor CLI.
7
+ * Skipped — keychain reads trigger unwanted popups and are not needed
8
+ * for auth (the cursor-agent subprocess handles its own authentication).
9
+ */
10
+ export declare function readKeychainToken(): string | undefined;
@@ -0,0 +1,35 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ /** Token file written per-account after each agent run */
4
+ export const TOKEN_FILE = ".cursor-token";
5
+ export function readCachedToken(configDir) {
6
+ try {
7
+ const p = path.join(configDir, TOKEN_FILE);
8
+ if (fs.existsSync(p))
9
+ return fs.readFileSync(p, "utf-8").trim() || undefined;
10
+ }
11
+ catch {
12
+ /* ignore */
13
+ }
14
+ return undefined;
15
+ }
16
+ export function writeCachedToken(configDir, token) {
17
+ try {
18
+ fs.writeFileSync(path.join(configDir, TOKEN_FILE), token, {
19
+ encoding: "utf-8",
20
+ mode: 0o600,
21
+ });
22
+ }
23
+ catch {
24
+ /* ignore */
25
+ }
26
+ }
27
+ /**
28
+ * Read the shared macOS Keychain slot used by the Cursor CLI.
29
+ * Skipped — keychain reads trigger unwanted popups and are not needed
30
+ * for auth (the cursor-agent subprocess handles its own authentication).
31
+ */
32
+ export function readKeychainToken() {
33
+ return undefined;
34
+ }
35
+ //# sourceMappingURL=token-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-cache.js","sourceRoot":"","sources":["../../src/lib/token-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,0DAA0D;AAC1D,MAAM,CAAC,MAAM,UAAU,GAAG,eAAe,CAAC;AAE1C,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAC3C,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;YAClB,OAAO,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,SAAiB,EAAE,KAAa;IAC/D,IAAI,CAAC;QACH,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,KAAK,EAAE;YACxD,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { AgentCommand } from "./env.js";
2
+ import { type EnvOptions } from "./env.js";
3
+ /** Shown at the start of the prompt when earlier text was dropped on Windows. */
4
+ export declare const WIN_PROMPT_OMISSION_PREFIX = "[Earlier messages omitted: Windows command-line length limit.]\n\n";
5
+ export type FitPromptOk = {
6
+ ok: true;
7
+ args: string[];
8
+ truncated: boolean;
9
+ originalLength: number;
10
+ finalPromptLength: number;
11
+ };
12
+ export type FitPromptErr = {
13
+ ok: false;
14
+ error: string;
15
+ };
16
+ export type FitPromptResult = FitPromptOk | FitPromptErr;
17
+ /**
18
+ * Pessimistic upper bound on UTF-16 code units in the Windows command line
19
+ * Node/libuv passes to CreateProcess (see libuv `make_program_args` sizing).
20
+ */
21
+ export declare function estimateCmdlineLength(resolved: AgentCommand): number;
22
+ /**
23
+ * On Windows, shrinks the prompt (keeping the tail) so spawn argv stays under
24
+ * `maxCmdline`. Other platforms return the full prompt unchanged.
25
+ */
26
+ export declare function fitPromptToWinCmdline(agentBin: string, fixedArgs: string[], prompt: string, opts: {
27
+ maxCmdline: number;
28
+ platform: NodeJS.Platform;
29
+ cwd?: string;
30
+ env?: EnvOptions["env"];
31
+ }): FitPromptResult;
32
+ export declare function warnPromptTruncated(originalLength: number, finalLength: number): void;
@@ -0,0 +1,92 @@
1
+ import { resolveAgentCommand } from "./env.js";
2
+ /** Shown at the start of the prompt when earlier text was dropped on Windows. */
3
+ export const WIN_PROMPT_OMISSION_PREFIX = "[Earlier messages omitted: Windows command-line length limit.]\n\n";
4
+ /**
5
+ * Pessimistic upper bound on UTF-16 code units in the Windows command line
6
+ * Node/libuv passes to CreateProcess (see libuv `make_program_args` sizing).
7
+ */
8
+ export function estimateCmdlineLength(resolved) {
9
+ const argv = [resolved.command, ...resolved.args];
10
+ if (resolved.windowsVerbatimArguments) {
11
+ let n = 0;
12
+ for (const a of argv) {
13
+ n += a.length;
14
+ }
15
+ n += Math.max(0, argv.length - 1);
16
+ return n + 512;
17
+ }
18
+ let dstLen = 0;
19
+ for (const a of argv) {
20
+ dstLen += a.length;
21
+ }
22
+ dstLen = dstLen * 2 + argv.length * 2 + Math.max(0, argv.length - 1);
23
+ return dstLen + 512;
24
+ }
25
+ /**
26
+ * On Windows, shrinks the prompt (keeping the tail) so spawn argv stays under
27
+ * `maxCmdline`. Other platforms return the full prompt unchanged.
28
+ */
29
+ export function fitPromptToWinCmdline(agentBin, fixedArgs, prompt, opts) {
30
+ const { maxCmdline, platform, cwd, env } = opts;
31
+ const resolveOpts = { cwd, env, platform };
32
+ if (platform !== "win32") {
33
+ return {
34
+ ok: true,
35
+ args: [...fixedArgs, prompt],
36
+ truncated: false,
37
+ originalLength: prompt.length,
38
+ finalPromptLength: prompt.length,
39
+ };
40
+ }
41
+ const measured = (p) => estimateCmdlineLength(resolveAgentCommand(agentBin, [...fixedArgs, p], resolveOpts));
42
+ const emptyTail = measured("");
43
+ if (emptyTail > maxCmdline) {
44
+ return {
45
+ ok: false,
46
+ error: "Windows command line exceeds the configured limit even without a prompt; shorten workspace path, model id, or CURSOR_BRIDGE_WIN_CMDLINE_MAX.",
47
+ };
48
+ }
49
+ if (measured(prompt) <= maxCmdline) {
50
+ return {
51
+ ok: true,
52
+ args: [...fixedArgs, prompt],
53
+ truncated: false,
54
+ originalLength: prompt.length,
55
+ finalPromptLength: prompt.length,
56
+ };
57
+ }
58
+ const prefix = WIN_PROMPT_OMISSION_PREFIX;
59
+ if (measured(prefix) > maxCmdline) {
60
+ return {
61
+ ok: false,
62
+ error: "Windows command line too long to fit even the truncation notice; shorten workspace path or flags.",
63
+ };
64
+ }
65
+ let lo = 0;
66
+ let hi = prompt.length;
67
+ let best = 0;
68
+ while (lo <= hi) {
69
+ const mid = (lo + hi) >> 1;
70
+ const tail = mid === 0 ? "" : prompt.slice(-mid);
71
+ const candidate = prefix + tail;
72
+ if (measured(candidate) <= maxCmdline) {
73
+ best = mid;
74
+ lo = mid + 1;
75
+ }
76
+ else {
77
+ hi = mid - 1;
78
+ }
79
+ }
80
+ const finalPrompt = best === 0 ? prefix : prefix + prompt.slice(-best);
81
+ return {
82
+ ok: true,
83
+ args: [...fixedArgs, finalPrompt],
84
+ truncated: true,
85
+ originalLength: prompt.length,
86
+ finalPromptLength: finalPrompt.length,
87
+ };
88
+ }
89
+ export function warnPromptTruncated(originalLength, finalLength) {
90
+ console.warn(`[${new Date().toISOString()}] Windows: prompt truncated for CreateProcess limit (${originalLength} -> ${finalLength} chars, tail preserved).`);
91
+ }
92
+ //# sourceMappingURL=win-cmdline-limit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"win-cmdline-limit.js","sourceRoot":"","sources":["../../src/lib/win-cmdline-limit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { BridgeConfig } from "./config.js";
2
+ export type WorkspaceResult = {
3
+ workspaceDir: string;
4
+ tempDir?: string;
5
+ };
6
+ /**
7
+ * Env overrides for chat-only (isolated) workspace so the agent cannot load
8
+ * rules from ~/.cursor or other user config paths.
9
+ *
10
+ * When `authConfigDir` is set (account pool), use it for `CURSOR_CONFIG_DIR` so the
11
+ * CLI loads credentials from that profile.
12
+ *
13
+ * We do **not** override `HOME` / `USERPROFILE` / `XDG_*` in that case: the Cursor CLI
14
+ * still resolves auth relative to the real user profile for `agent --print` / ask, and
15
+ * a fake `HOME` makes login fail even when `CURSOR_CONFIG_DIR` points at the pool.
16
+ * Without a pool, the temp `HOME` keeps rules from the real `~/.cursor` from loading.
17
+ */
18
+ export declare function getChatOnlyEnvOverrides(workspaceDir: string, authConfigDir?: string): Record<string, string>;
19
+ export declare function resolveWorkspace(config: BridgeConfig, workspaceHeader?: string | string[] | null): WorkspaceResult;
@@ -0,0 +1,77 @@
1
+ import * as fs from "node:fs";
2
+ import * as os from "node:os";
3
+ import * as path from "node:path";
4
+ /**
5
+ * Env overrides for chat-only (isolated) workspace so the agent cannot load
6
+ * rules from ~/.cursor or other user config paths.
7
+ *
8
+ * When `authConfigDir` is set (account pool), use it for `CURSOR_CONFIG_DIR` so the
9
+ * CLI loads credentials from that profile.
10
+ *
11
+ * We do **not** override `HOME` / `USERPROFILE` / `XDG_*` in that case: the Cursor CLI
12
+ * still resolves auth relative to the real user profile for `agent --print` / ask, and
13
+ * a fake `HOME` makes login fail even when `CURSOR_CONFIG_DIR` points at the pool.
14
+ * Without a pool, the temp `HOME` keeps rules from the real `~/.cursor` from loading.
15
+ */
16
+ export function getChatOnlyEnvOverrides(workspaceDir, authConfigDir) {
17
+ const cursorDir = authConfigDir ?? path.join(workspaceDir, ".cursor");
18
+ const overrides = {
19
+ CURSOR_CONFIG_DIR: cursorDir,
20
+ };
21
+ if (authConfigDir) {
22
+ return overrides;
23
+ }
24
+ overrides.HOME = workspaceDir;
25
+ overrides.USERPROFILE = workspaceDir;
26
+ if (process.platform === "win32") {
27
+ const appDataRoaming = path.join(workspaceDir, "AppData", "Roaming");
28
+ const appDataLocal = path.join(workspaceDir, "AppData", "Local");
29
+ overrides.APPDATA = appDataRoaming;
30
+ overrides.LOCALAPPDATA = appDataLocal;
31
+ }
32
+ else {
33
+ overrides.XDG_CONFIG_HOME = path.join(workspaceDir, ".config");
34
+ }
35
+ return overrides;
36
+ }
37
+ export function resolveWorkspace(config, workspaceHeader) {
38
+ if (config.chatOnlyWorkspace) {
39
+ const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "cursor-proxy-"));
40
+ const cursorDir = path.join(tempDir, ".cursor");
41
+ fs.mkdirSync(cursorDir, { recursive: true });
42
+ fs.mkdirSync(path.join(cursorDir, "rules"), { recursive: true });
43
+ const minimalConfig = {
44
+ version: 1,
45
+ editor: { vimMode: false },
46
+ permissions: { allow: [], deny: [] },
47
+ };
48
+ fs.writeFileSync(path.join(cursorDir, "cli-config.json"), JSON.stringify(minimalConfig, null, 0), "utf8");
49
+ if (process.platform === "win32") {
50
+ fs.mkdirSync(path.join(tempDir, "AppData", "Roaming"), { recursive: true });
51
+ fs.mkdirSync(path.join(tempDir, "AppData", "Local"), { recursive: true });
52
+ }
53
+ else {
54
+ fs.mkdirSync(path.join(tempDir, ".config"), { recursive: true });
55
+ }
56
+ return { workspaceDir: tempDir, tempDir };
57
+ }
58
+ const headerWs = typeof workspaceHeader === "string" && workspaceHeader.trim()
59
+ ? workspaceHeader.trim()
60
+ : null;
61
+ const base = path.resolve(config.workspace);
62
+ if (!headerWs) {
63
+ return { workspaceDir: base };
64
+ }
65
+ const candidate = path.resolve(headerWs);
66
+ if (!fs.existsSync(candidate) || !fs.statSync(candidate).isDirectory()) {
67
+ throw new Error("X-Cursor-Workspace must be an existing directory on the proxy host");
68
+ }
69
+ const realBase = fs.existsSync(base) ? fs.realpathSync(base) : base;
70
+ const realRequested = fs.realpathSync(candidate);
71
+ const rel = path.relative(realBase, realRequested);
72
+ if (rel.startsWith("..") || path.isAbsolute(rel)) {
73
+ throw new Error("X-Cursor-Workspace must resolve to a directory under the configured workspace base");
74
+ }
75
+ return { workspaceDir: realRequested };
76
+ }
77
+ //# sourceMappingURL=workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/lib/workspace.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "cursor-composer-in-claude",
3
+ "version": "0.7.3",
4
+ "description": "OpenAI-compatible proxy for Cursor CLI — forked with macOS keychain skip and system Node.js support",
5
+ "type": "module",
6
+ "files": [
7
+ "dist",
8
+ "!dist/**/*.test.*",
9
+ "package.json"
10
+ ],
11
+ "main": "./dist/client.js",
12
+ "types": "./dist/client.d.ts",
13
+ "exports": {
14
+ ".": {
15
+ "types": "./dist/client.d.ts",
16
+ "import": "./dist/client.js",
17
+ "default": "./dist/client.js"
18
+ },
19
+ "./package.json": "./package.json"
20
+ },
21
+ "bin": {
22
+ "cursor-api-proxy": "dist/cli.js"
23
+ },
24
+ "scripts": {
25
+ "build": "tsc -p tsconfig.json",
26
+ "start": "node ./dist/cli.js",
27
+ "typecheck": "tsc -p tsconfig.json --noEmit",
28
+ "test": "vitest run",
29
+ "test:watch": "vitest"
30
+ },
31
+ "engines": {
32
+ "node": ">=18"
33
+ },
34
+ "keywords": [
35
+ "cursor",
36
+ "openai",
37
+ "proxy",
38
+ "llm",
39
+ "api",
40
+ "claude-overnight"
41
+ ],
42
+ "license": "MIT",
43
+ "devDependencies": {
44
+ "@types/node": "^25.6.0",
45
+ "typescript": "^6.0.2",
46
+ "vitest": "^4.1.4"
47
+ },
48
+ "dependencies": {
49
+ "chrome-launcher": "^1.2.1"
50
+ }
51
+ }