cursor-api-proxy 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/README.md +91 -36
  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 +277 -0
  16. package/dist/cli/reset-hwid.js.map +1 -0
  17. package/dist/cli/usage.d.ts +31 -0
  18. package/dist/cli/usage.js +214 -0
  19. package/dist/cli/usage.js.map +1 -0
  20. package/dist/cli.d.ts +1 -4
  21. package/dist/cli.js +40 -35
  22. package/dist/cli.js.map +1 -1
  23. package/dist/lib/account-pool.d.ts +35 -0
  24. package/dist/lib/account-pool.js +143 -0
  25. package/dist/lib/account-pool.js.map +1 -0
  26. package/dist/lib/agent-cmd-args.d.ts +4 -0
  27. package/dist/lib/agent-cmd-args.js +8 -3
  28. package/dist/lib/agent-cmd-args.js.map +1 -1
  29. package/dist/lib/agent-runner.d.ts +2 -2
  30. package/dist/lib/agent-runner.js +18 -6
  31. package/dist/lib/agent-runner.js.map +1 -1
  32. package/dist/lib/anthropic.js +22 -11
  33. package/dist/lib/anthropic.js.map +1 -1
  34. package/dist/lib/config.d.ts +6 -0
  35. package/dist/lib/config.js +3 -0
  36. package/dist/lib/config.js.map +1 -1
  37. package/dist/lib/env.d.ts +9 -0
  38. package/dist/lib/env.js +71 -8
  39. package/dist/lib/env.js.map +1 -1
  40. package/dist/lib/handlers/anthropic-messages.js +83 -15
  41. package/dist/lib/handlers/anthropic-messages.js.map +1 -1
  42. package/dist/lib/handlers/chat-completions.js +77 -11
  43. package/dist/lib/handlers/chat-completions.js.map +1 -1
  44. package/dist/lib/handlers/models.d.ts +1 -0
  45. package/dist/lib/handlers/models.js +16 -6
  46. package/dist/lib/handlers/models.js.map +1 -1
  47. package/dist/lib/http.d.ts +2 -2
  48. package/dist/lib/http.js +7 -3
  49. package/dist/lib/http.js.map +1 -1
  50. package/dist/lib/max-mode-preflight.d.ts +1 -1
  51. package/dist/lib/max-mode-preflight.js +9 -3
  52. package/dist/lib/max-mode-preflight.js.map +1 -1
  53. package/dist/lib/openai.d.ts +10 -0
  54. package/dist/lib/openai.js +53 -1
  55. package/dist/lib/openai.js.map +1 -1
  56. package/dist/lib/process.d.ts +6 -0
  57. package/dist/lib/process.js +71 -9
  58. package/dist/lib/process.js.map +1 -1
  59. package/dist/lib/request-listener.js +28 -4
  60. package/dist/lib/request-listener.js.map +1 -1
  61. package/dist/lib/request-log.d.ts +3 -0
  62. package/dist/lib/request-log.js +37 -0
  63. package/dist/lib/request-log.js.map +1 -1
  64. package/dist/lib/sanitize.d.ts +21 -0
  65. package/dist/lib/sanitize.js +79 -0
  66. package/dist/lib/sanitize.js.map +1 -0
  67. package/dist/lib/server.d.ts +6 -1
  68. package/dist/lib/server.js +76 -0
  69. package/dist/lib/server.js.map +1 -1
  70. package/dist/lib/win-cmdline-limit.d.ts +32 -0
  71. package/dist/lib/win-cmdline-limit.js +92 -0
  72. package/dist/lib/win-cmdline-limit.js.map +1 -0
  73. package/package.json +5 -2
package/dist/cli.js CHANGED
@@ -1,52 +1,57 @@
1
1
  #!/usr/bin/env node
2
2
  import fs from "node:fs";
3
+ import path from "node:path";
3
4
  import { fileURLToPath } from "node:url";
4
- import pkg from "../package.json" with { type: "json" };
5
5
  import { loadBridgeConfig } from "./lib/config.js";
6
- import { startBridgeServer } from "./lib/server.js";
6
+ import { startBridgeServer, setupGracefulShutdown } from "./lib/server.js";
7
+ import { parseArgs, printHelp } from "./cli/args.js";
8
+ import { handleAccountsList, handleLogout } from "./cli/accounts.js";
9
+ import { handleLogin } from "./cli/login.js";
10
+ import { handleResetHwid } from "./cli/reset-hwid.js";
11
+ // Re-export parseArgs so src/cli.test.ts can import it without a separate path
12
+ export { parseArgs } from "./cli/args.js";
13
+ // ---------------------------------------------------------------------------
14
+ // Package metadata
15
+ // ---------------------------------------------------------------------------
7
16
  const __filename = fileURLToPath(import.meta.url);
8
- const realArgv1 = process.argv[1]
9
- ? fs.realpathSync(process.argv[1])
10
- : "";
11
- const isMainModule = realArgv1 === fs.realpathSync(__filename);
12
- export function parseArgs(argv) {
13
- let tailscale = false;
14
- let help = false;
15
- for (const arg of argv) {
16
- if (arg === "--tailscale") {
17
- tailscale = true;
18
- continue;
19
- }
20
- if (arg === "--help" || arg === "-h") {
21
- help = true;
22
- continue;
23
- }
24
- throw new Error(`Unknown argument: ${arg}`);
25
- }
26
- return { tailscale, help };
27
- }
28
- function printHelp() {
29
- console.log("cursor-api-proxy");
30
- console.log("");
31
- console.log("Usage:");
32
- console.log(" cursor-api-proxy [--tailscale]");
33
- console.log("");
34
- console.log("Options:");
35
- console.log(" --tailscale Bind to 0.0.0.0 for tailnet/LAN access");
36
- console.log(" -h, --help Show this help message");
37
- }
17
+ const __dirname = path.dirname(__filename);
18
+ const pkgPath = path.join(__dirname, "..", "package.json");
19
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
20
+ // ---------------------------------------------------------------------------
21
+ // Entry point
22
+ // ---------------------------------------------------------------------------
38
23
  async function main() {
39
24
  const args = parseArgs(process.argv.slice(2));
40
25
  if (args.help) {
41
- printHelp();
26
+ printHelp(pkg.version);
27
+ return;
28
+ }
29
+ if (args.login) {
30
+ await handleLogin(args.accountName, args.proxies);
31
+ return;
32
+ }
33
+ if (args.logout) {
34
+ await handleLogout(args.accountName);
35
+ return;
36
+ }
37
+ if (args.accountsList) {
38
+ await handleAccountsList();
39
+ return;
40
+ }
41
+ if (args.resetHwid) {
42
+ await handleResetHwid({ deepClean: args.deepClean, dryRun: args.dryRun });
42
43
  return;
43
44
  }
44
45
  const config = loadBridgeConfig({ tailscale: args.tailscale });
45
- startBridgeServer({ version: pkg.version, config });
46
+ const servers = startBridgeServer({ version: pkg.version, config });
47
+ setupGracefulShutdown(servers);
46
48
  }
49
+ const realArgv1 = process.argv[1] ? fs.realpathSync(process.argv[1]) : "";
50
+ const isMainModule = realArgv1 === fs.realpathSync(__filename);
47
51
  if (isMainModule) {
48
52
  main().catch((err) => {
49
- console.error(err);
53
+ const msg = err instanceof Error ? err.message : String(err);
54
+ console.error(`Error: ${msg}`);
50
55
  process.exit(1);
51
56
  });
52
57
  }
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,GAAG,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/B,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC,EAAE,CAAC;AACP,MAAM,YAAY,GAAG,SAAS,KAAK,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;AAE/D,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,IAAI,GAAG,KAAK,CAAC;IAEjB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,KAAK,aAAa,EAAE,CAAC;YAC1B,SAAS,GAAG,IAAI,CAAC;YACjB,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACrC,IAAI,GAAG,IAAI,CAAC;YACZ,SAAS;QACX,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC7B,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtB,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxB,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;AACvD,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAE9C,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,SAAS,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IAC/D,iBAAiB,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,IAAI,YAAY,EAAE,CAAC;IACjB,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACnB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ export type AccountStat = {
2
+ configDir: string;
3
+ activeRequests: number;
4
+ totalRequests: number;
5
+ totalSuccess: number;
6
+ totalErrors: number;
7
+ totalRateLimits: number;
8
+ totalLatencyMs: number;
9
+ isRateLimited: boolean;
10
+ rateLimitUntil: number;
11
+ };
12
+ export declare class AccountPool {
13
+ private accounts;
14
+ constructor(configDirs: string[]);
15
+ /**
16
+ * Get the least busy account using a combination of active requests and round-robin.
17
+ * Ignores accounts that are currently rate limited.
18
+ */
19
+ getNextConfigDir(): string | undefined;
20
+ reportRequestStart(configDir?: string): void;
21
+ reportRequestSuccess(configDir?: string, latencyMs?: number): void;
22
+ reportRequestError(configDir?: string, latencyMs?: number): void;
23
+ reportRequestEnd(configDir?: string): void;
24
+ reportRateLimit(configDir?: string, penaltyMs?: number): void;
25
+ getStats(): AccountStat[];
26
+ getConfigDirsCount(): number;
27
+ }
28
+ export declare function initAccountPool(configDirs: string[]): void;
29
+ export declare function getNextAccountConfigDir(): string | undefined;
30
+ export declare function reportRequestStart(configDir?: string): void;
31
+ export declare function reportRequestEnd(configDir?: string): void;
32
+ export declare function reportRateLimit(configDir?: string, penaltyMs?: number): void;
33
+ export declare function reportRequestSuccess(configDir?: string, latencyMs?: number): void;
34
+ export declare function reportRequestError(configDir?: string, latencyMs?: number): void;
35
+ export declare function getAccountStats(): AccountStat[];
@@ -0,0 +1,143 @@
1
+ export class AccountPool {
2
+ accounts;
3
+ constructor(configDirs) {
4
+ this.accounts = configDirs.map((dir) => ({
5
+ configDir: dir,
6
+ activeRequests: 0,
7
+ lastUsed: 0,
8
+ rateLimitUntil: 0,
9
+ totalRequests: 0,
10
+ totalSuccess: 0,
11
+ totalErrors: 0,
12
+ totalRateLimits: 0,
13
+ totalLatencyMs: 0,
14
+ }));
15
+ }
16
+ /**
17
+ * Get the least busy account using a combination of active requests and round-robin.
18
+ * Ignores accounts that are currently rate limited.
19
+ */
20
+ getNextConfigDir() {
21
+ if (this.accounts.length === 0) {
22
+ return undefined;
23
+ }
24
+ const now = Date.now();
25
+ // Filter out rate-limited accounts (unless they are all rate-limited, then just use the one that recovers soonest)
26
+ const availableAccounts = this.accounts.filter((a) => a.rateLimitUntil < now);
27
+ let targetAccounts = availableAccounts;
28
+ if (availableAccounts.length === 0) {
29
+ // If all are rate limited, sort by who recovers first
30
+ targetAccounts = [...this.accounts].sort((a, b) => a.rateLimitUntil - b.rateLimitUntil);
31
+ }
32
+ // Sort by active requests (ascending), then by last used (ascending for round-robin effect)
33
+ const sorted = [...targetAccounts].sort((a, b) => {
34
+ if (a.activeRequests !== b.activeRequests) {
35
+ return a.activeRequests - b.activeRequests;
36
+ }
37
+ return a.lastUsed - b.lastUsed;
38
+ });
39
+ const selected = sorted[0];
40
+ selected.lastUsed = now;
41
+ return selected.configDir;
42
+ }
43
+ reportRequestStart(configDir) {
44
+ if (!configDir)
45
+ return;
46
+ const account = this.accounts.find((a) => a.configDir === configDir);
47
+ if (account) {
48
+ account.activeRequests++;
49
+ account.totalRequests++;
50
+ }
51
+ }
52
+ reportRequestSuccess(configDir, latencyMs = 0) {
53
+ if (!configDir)
54
+ return;
55
+ const account = this.accounts.find((a) => a.configDir === configDir);
56
+ if (account) {
57
+ account.totalSuccess++;
58
+ account.totalLatencyMs += latencyMs;
59
+ }
60
+ }
61
+ reportRequestError(configDir, latencyMs = 0) {
62
+ if (!configDir)
63
+ return;
64
+ const account = this.accounts.find((a) => a.configDir === configDir);
65
+ if (account) {
66
+ account.totalErrors++;
67
+ account.totalLatencyMs += latencyMs;
68
+ }
69
+ }
70
+ reportRequestEnd(configDir) {
71
+ if (!configDir)
72
+ return;
73
+ const account = this.accounts.find((a) => a.configDir === configDir);
74
+ if (account && account.activeRequests > 0) {
75
+ account.activeRequests--;
76
+ }
77
+ }
78
+ reportRateLimit(configDir, penaltyMs = 60000) {
79
+ if (!configDir)
80
+ return;
81
+ const account = this.accounts.find((a) => a.configDir === configDir);
82
+ if (account) {
83
+ account.rateLimitUntil = Date.now() + penaltyMs;
84
+ account.totalRateLimits++;
85
+ }
86
+ }
87
+ getStats() {
88
+ const now = Date.now();
89
+ return this.accounts.map((a) => ({
90
+ configDir: a.configDir,
91
+ activeRequests: a.activeRequests,
92
+ totalRequests: a.totalRequests,
93
+ totalSuccess: a.totalSuccess,
94
+ totalErrors: a.totalErrors,
95
+ totalRateLimits: a.totalRateLimits,
96
+ totalLatencyMs: a.totalLatencyMs,
97
+ isRateLimited: a.rateLimitUntil > now,
98
+ rateLimitUntil: a.rateLimitUntil,
99
+ }));
100
+ }
101
+ getConfigDirsCount() {
102
+ return this.accounts.length;
103
+ }
104
+ }
105
+ // Global instance to be initialized at server start
106
+ let globalPool = null;
107
+ export function initAccountPool(configDirs) {
108
+ globalPool = new AccountPool(configDirs);
109
+ }
110
+ export function getNextAccountConfigDir() {
111
+ if (!globalPool)
112
+ return undefined;
113
+ return globalPool.getNextConfigDir();
114
+ }
115
+ export function reportRequestStart(configDir) {
116
+ if (globalPool) {
117
+ globalPool.reportRequestStart(configDir);
118
+ }
119
+ }
120
+ export function reportRequestEnd(configDir) {
121
+ if (globalPool) {
122
+ globalPool.reportRequestEnd(configDir);
123
+ }
124
+ }
125
+ export function reportRateLimit(configDir, penaltyMs) {
126
+ if (globalPool) {
127
+ globalPool.reportRateLimit(configDir, penaltyMs);
128
+ }
129
+ }
130
+ export function reportRequestSuccess(configDir, latencyMs) {
131
+ if (globalPool) {
132
+ globalPool.reportRequestSuccess(configDir, latencyMs);
133
+ }
134
+ }
135
+ export function reportRequestError(configDir, latencyMs) {
136
+ if (globalPool) {
137
+ globalPool.reportRequestError(configDir, latencyMs);
138
+ }
139
+ }
140
+ export function getAccountStats() {
141
+ return globalPool?.getStats() ?? [];
142
+ }
143
+ //# sourceMappingURL=account-pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-pool.js","sourceRoot":"","sources":["../../src/lib/account-pool.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,8 @@
1
1
  import type { BridgeConfig } from "./config.js";
2
+ /**
3
+ * CLI flags and options for the Cursor agent, excluding the final prompt argument.
4
+ */
5
+ export declare function buildAgentFixedArgs(config: BridgeConfig, workspaceDir: string, model: string, stream: boolean): string[];
2
6
  /**
3
7
  * Build CLI arguments for running the Cursor agent.
4
8
  */
@@ -1,7 +1,7 @@
1
1
  /**
2
- * Build CLI arguments for running the Cursor agent.
2
+ * CLI flags and options for the Cursor agent, excluding the final prompt argument.
3
3
  */
4
- export function buildAgentCmdArgs(config, workspaceDir, model, prompt, stream) {
4
+ export function buildAgentFixedArgs(config, workspaceDir, model, stream) {
5
5
  const args = ["--print"];
6
6
  if (config.approveMcps)
7
7
  args.push("--approve-mcps");
@@ -18,7 +18,12 @@ export function buildAgentCmdArgs(config, workspaceDir, model, prompt, stream) {
18
18
  else {
19
19
  args.push("--output-format", "text");
20
20
  }
21
- args.push(prompt);
22
21
  return args;
23
22
  }
23
+ /**
24
+ * Build CLI arguments for running the Cursor agent.
25
+ */
26
+ export function buildAgentCmdArgs(config, workspaceDir, model, prompt, stream) {
27
+ return [...buildAgentFixedArgs(config, workspaceDir, model, stream), prompt];
28
+ }
24
29
  //# sourceMappingURL=agent-cmd-args.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-cmd-args.js","sourceRoot":"","sources":["../../src/lib/agent-cmd-args.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAoB,EACpB,YAAoB,EACpB,KAAa,EACb,MAAc,EACd,MAAe;IAEf,MAAM,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IACzB,IAAI,MAAM,CAAC,WAAW;QAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACpD,IAAI,MAAM,CAAC,KAAK;QAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvC,IAAI,MAAM,CAAC,iBAAiB;QAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACnD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC3B,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IACvC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC5B,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE,iBAAiB,EAAE,aAAa,CAAC,CAAC;IACzE,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClB,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"agent-cmd-args.js","sourceRoot":"","sources":["../../src/lib/agent-cmd-args.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAoB,EACpB,YAAoB,EACpB,KAAa,EACb,MAAe;IAEf,MAAM,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IACzB,IAAI,MAAM,CAAC,WAAW;QAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACpD,IAAI,MAAM,CAAC,KAAK;QAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvC,IAAI,MAAM,CAAC,iBAAiB;QAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACnD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC3B,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IACvC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC5B,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE,iBAAiB,EAAE,aAAa,CAAC,CAAC;IACzE,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAoB,EACpB,YAAoB,EACpB,KAAa,EACb,MAAc,EACd,MAAe;IAEf,OAAO,CAAC,GAAG,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;AAC/E,CAAC"}
@@ -4,9 +4,9 @@ export type AgentRunResult = {
4
4
  stdout: string;
5
5
  stderr: string;
6
6
  };
7
- export declare function runAgentSync(config: BridgeConfig, workspaceDir: string, cmdArgs: string[], tempDir?: string): Promise<AgentRunResult>;
7
+ export declare function runAgentSync(config: BridgeConfig, workspaceDir: string, cmdArgs: string[], tempDir?: string, configDir?: string, signal?: AbortSignal): Promise<AgentRunResult>;
8
8
  export type StreamLineHandler = (line: string) => void;
9
- export declare function runAgentStream(config: BridgeConfig, workspaceDir: string, cmdArgs: string[], onLine: StreamLineHandler, tempDir?: string): Promise<{
9
+ export declare function runAgentStream(config: BridgeConfig, workspaceDir: string, cmdArgs: string[], onLine: StreamLineHandler, tempDir?: string, configDir?: string, signal?: AbortSignal): Promise<{
10
10
  code: number;
11
11
  stderr: string;
12
12
  }>;
@@ -1,11 +1,22 @@
1
1
  import * as fs from "node:fs";
2
2
  import { run, runStreaming } from "./process.js";
3
- export function runAgentSync(config, workspaceDir, cmdArgs, tempDir) {
3
+ import { readKeychainToken, writeCachedToken } from "../cli/usage.js";
4
+ function cacheTokenForAccount(configDir) {
5
+ if (!configDir)
6
+ return;
7
+ const token = readKeychainToken();
8
+ if (token)
9
+ writeCachedToken(configDir, token);
10
+ }
11
+ export function runAgentSync(config, workspaceDir, cmdArgs, tempDir, configDir, signal) {
4
12
  return run(config.agentBin, cmdArgs, {
5
13
  cwd: workspaceDir,
6
14
  timeoutMs: config.timeoutMs,
7
15
  maxMode: config.maxMode,
8
- }).then((out) => {
16
+ configDir,
17
+ signal,
18
+ }).finally(() => {
19
+ cacheTokenForAccount(configDir);
9
20
  if (tempDir) {
10
21
  try {
11
22
  fs.rmSync(tempDir, { recursive: true, force: true });
@@ -14,16 +25,18 @@ export function runAgentSync(config, workspaceDir, cmdArgs, tempDir) {
14
25
  /* ignore */
15
26
  }
16
27
  }
17
- return out;
18
28
  });
19
29
  }
20
- export function runAgentStream(config, workspaceDir, cmdArgs, onLine, tempDir) {
30
+ export function runAgentStream(config, workspaceDir, cmdArgs, onLine, tempDir, configDir, signal) {
21
31
  return runStreaming(config.agentBin, cmdArgs, {
22
32
  cwd: workspaceDir,
23
33
  timeoutMs: config.timeoutMs,
24
34
  maxMode: config.maxMode,
25
35
  onLine,
26
- }).then((result) => {
36
+ configDir,
37
+ signal,
38
+ }).finally(() => {
39
+ cacheTokenForAccount(configDir);
27
40
  if (tempDir) {
28
41
  try {
29
42
  fs.rmSync(tempDir, { recursive: true, force: true });
@@ -32,7 +45,6 @@ export function runAgentStream(config, workspaceDir, cmdArgs, onLine, tempDir) {
32
45
  /* ignore */
33
46
  }
34
47
  }
35
- return result;
36
48
  });
37
49
  }
38
50
  //# sourceMappingURL=agent-runner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-runner.js","sourceRoot":"","sources":["../../src/lib/agent-runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAG9B,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAQjD,MAAM,UAAU,YAAY,CAC1B,MAAoB,EACpB,YAAoB,EACpB,OAAiB,EACjB,OAAgB;IAEhB,OAAO,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE;QACnC,GAAG,EAAE,YAAY;QACjB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;QACd,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACvD,CAAC;YAAC,MAAM,CAAC;gBACP,YAAY;YACd,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC;AAID,MAAM,UAAU,cAAc,CAC5B,MAAoB,EACpB,YAAoB,EACpB,OAAiB,EACjB,MAAyB,EACzB,OAAgB;IAEhB,OAAO,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE;QAC5C,GAAG,EAAE,YAAY;QACjB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM;KACP,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;QACjB,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACvD,CAAC;YAAC,MAAM,CAAC;gBACP,YAAY;YACd,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"agent-runner.js","sourceRoot":"","sources":["../../src/lib/agent-runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAG9B,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEtE,SAAS,oBAAoB,CAAC,SAAkB;IAC9C,IAAI,CAAC,SAAS;QAAE,OAAO;IACvB,MAAM,KAAK,GAAG,iBAAiB,EAAE,CAAC;IAClC,IAAI,KAAK;QAAE,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AAChD,CAAC;AAQD,MAAM,UAAU,YAAY,CAC1B,MAAoB,EACpB,YAAoB,EACpB,OAAiB,EACjB,OAAgB,EAChB,SAAkB,EAClB,MAAoB;IAEpB,OAAO,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE;QACnC,GAAG,EAAE,YAAY;QACjB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,SAAS;QACT,MAAM;KACP,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;QACd,oBAAoB,CAAC,SAAS,CAAC,CAAC;QAChC,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACvD,CAAC;YAAC,MAAM,CAAC;gBACP,YAAY;YACd,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAID,MAAM,UAAU,cAAc,CAC5B,MAAoB,EACpB,YAAoB,EACpB,OAAiB,EACjB,MAAyB,EACzB,OAAgB,EAChB,SAAkB,EAClB,MAAoB;IAEpB,OAAO,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE;QAC5C,GAAG,EAAE,YAAY;QACjB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM;QACN,SAAS;QACT,MAAM;KACP,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;QACd,oBAAoB,CAAC,SAAS,CAAC,CAAC;QAChC,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACvD,CAAC;YAAC,MAAM,CAAC;gBACP,YAAY;YACd,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -20,22 +20,33 @@ function systemToText(system) {
20
20
  })
21
21
  .join("\n");
22
22
  }
23
+ function anthropicBlockToText(p) {
24
+ if (!p)
25
+ return "";
26
+ if (typeof p === "string")
27
+ return p;
28
+ if (p.type === "text" && typeof p.text === "string")
29
+ return p.text;
30
+ if (p.type === "image") {
31
+ const src = p.source;
32
+ if (src?.type === "base64")
33
+ return `[Image: base64 ${src.media_type ?? "image"}]`;
34
+ if (src?.type === "url")
35
+ return `[Image: ${src.url}]`;
36
+ return "[Image]";
37
+ }
38
+ if (p.type === "document") {
39
+ const title = p.title ?? p.source?.url ?? "";
40
+ return title ? `[Document: ${title}]` : "[Document]";
41
+ }
42
+ return "";
43
+ }
23
44
  function anthropicContentToText(content) {
24
45
  if (typeof content === "string")
25
46
  return content;
26
47
  if (!Array.isArray(content))
27
48
  return "";
28
- return content
29
- .map((p) => {
30
- if (!p)
31
- return "";
32
- if (typeof p === "string")
33
- return p;
34
- if (p.type === "text" && typeof p.text === "string")
35
- return p.text;
36
- return "";
37
- })
38
- .join("");
49
+ return content.map(anthropicBlockToText).filter(Boolean).join(" ");
39
50
  }
40
51
  /**
41
52
  * Convert Anthropic messages + optional system prompt to the prompt format
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/lib/anthropic.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAetD,SAAS,YAAY,CAAC,MAA0C;IAC9D,IAAI,MAAM,IAAI,IAAI;QAAE,OAAO,EAAE,CAAC;IAC9B,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACrD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IACtC,OAAO,MAAM;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC;QAC3C,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC;QACnE,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,sBAAsB,CAAC,OAAyC;IACvE,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAChD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IACvC,OAAO,OAAO;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,IAAI,CAAC,CAAC;YAAE,OAAO,EAAE,CAAC;QAClB,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,OAAO,CAAC,CAAC;QACpC,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC;QACnE,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gCAAgC,CAC9C,QAA6C,EAC7C,MAA2C;IAE3C,MAAM,cAAc,GAA6C,EAAE,CAAC;IAEpE,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,UAAU,EAAE,CAAC;QACf,cAAc,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,QAAQ,IAAI,EAAE,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,sBAAsB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;QAC3E,cAAc,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,uBAAuB,CAAC,cAAc,CAAC,CAAC;AACjD,CAAC"}
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/lib/anthropic.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAetD,SAAS,YAAY,CAAC,MAA0C;IAC9D,IAAI,MAAM,IAAI,IAAI;QAAE,OAAO,EAAE,CAAC;IAC9B,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACrD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IACtC,OAAO,MAAM;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC;QAC3C,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC;QACnE,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,oBAAoB,CAAC,CAAM;IAClC,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAClB,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC;IACpC,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC,IAAI,CAAC;IACnE,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC;QACrB,IAAI,GAAG,EAAE,IAAI,KAAK,QAAQ;YACxB,OAAO,kBAAkB,GAAG,CAAC,UAAU,IAAI,OAAO,GAAG,CAAC;QACxD,IAAI,GAAG,EAAE,IAAI,KAAK,KAAK;YAAE,OAAO,WAAW,GAAG,CAAC,GAAG,GAAG,CAAC;QACtD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC;QAC7C,OAAO,KAAK,CAAC,CAAC,CAAC,cAAc,KAAK,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC;IACvD,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,sBAAsB,CAC7B,OAAyC;IAEzC,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAChD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IACvC,OAAQ,OAAiB,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gCAAgC,CAC9C,QAA6C,EAC7C,MAA2C;IAE3C,MAAM,cAAc,GAA6C,EAAE,CAAC;IAEpE,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,UAAU,EAAE,CAAC;QACf,cAAc,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,QAAQ,IAAI,EAAE,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,sBAAsB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;QAC3E,cAAc,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,uBAAuB,CAAC,cAAc,CAAC,CAAC;AACjD,CAAC"}
@@ -24,5 +24,11 @@ export type BridgeConfig = {
24
24
  verbose: boolean;
25
25
  /** When true, enable Cursor Max Mode (larger context, more tool calls) via cli-config.json preflight. */
26
26
  maxMode: boolean;
27
+ /** Pool of cursor configuration directories for round-robin account rotation. */
28
+ configDirs: string[];
29
+ /** When true, runs each config dir on its own incrementing port starting from `port` */
30
+ multiPort: boolean;
31
+ /** Windows CreateProcess command-line budget for prompt truncation (ignored on non-Windows). */
32
+ winCmdlineMax: number;
27
33
  };
28
34
  export declare function loadBridgeConfig(opts?: EnvOptions): BridgeConfig;
@@ -19,6 +19,9 @@ export function loadBridgeConfig(opts = {}) {
19
19
  chatOnlyWorkspace: env.chatOnlyWorkspace,
20
20
  verbose: env.verbose,
21
21
  maxMode: env.maxMode,
22
+ configDirs: env.configDirs ?? [],
23
+ multiPort: env.multiPort,
24
+ winCmdlineMax: env.winCmdlineMax,
22
25
  };
23
26
  }
24
27
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAmB,MAAM,UAAU,CAAC;AA8B1D,MAAM,UAAU,gBAAgB,CAAC,OAAmB,EAAE;IACpD,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAEhC,OAAO;QACL,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,YAAY,EAAE,GAAG,CAAC,YAAY;QAC9B,IAAI,EAAE,KAAK,EAAE,oDAAoD;QACjE,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,eAAe,EAAE,GAAG,CAAC,eAAe;QACpC,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;QACxC,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,OAAO,EAAE,GAAG,CAAC,OAAO;KACrB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAmB,MAAM,UAAU,CAAC;AAoC1D,MAAM,UAAU,gBAAgB,CAAC,OAAmB,EAAE;IACpD,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAEhC,OAAO;QACL,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,YAAY,EAAE,GAAG,CAAC,YAAY;QAC9B,IAAI,EAAE,KAAK,EAAE,oDAAoD;QACjE,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,eAAe,EAAE,GAAG,CAAC,eAAe;QACpC,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;QACxC,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,EAAE;QAChC,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,aAAa,EAAE,GAAG,CAAC,aAAa;KACjC,CAAC;AACJ,CAAC"}
package/dist/lib/env.d.ts CHANGED
@@ -26,6 +26,15 @@ export type LoadedEnv = {
26
26
  verbose: boolean;
27
27
  /** When true, set maxMode in cli-config.json before each run (larger context, more tools). */
28
28
  maxMode: boolean;
29
+ /** Pool of cursor configuration directories for round-robin account rotation. */
30
+ configDirs: string[];
31
+ /** When true, runs each config dir on its own incrementing port starting from `port` */
32
+ multiPort: boolean;
33
+ /**
34
+ * Upper bound (UTF-16 code units, pessimistic) for the Windows CreateProcess command line.
35
+ * On win32 the proxy truncates the prompt tail to stay under this budget.
36
+ */
37
+ winCmdlineMax: number;
29
38
  };
30
39
  export type AgentCommand = {
31
40
  command: string;