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,144 @@
1
+ import * as fs from "node:fs";
2
+ import { runAcpStream, runAcpSync } from "./acp-client.js";
3
+ import { run, runStreaming } from "./process.js";
4
+ import { getChatOnlyEnvOverrides } from "./workspace.js";
5
+ import { readKeychainToken, writeCachedToken } from "./token-cache.js";
6
+ function cacheTokenForAccount(configDir) {
7
+ if (!configDir)
8
+ return;
9
+ if (process.env.CURSOR_SKIP_KEYCHAIN === "1")
10
+ return;
11
+ const token = readKeychainToken();
12
+ if (token)
13
+ writeCachedToken(configDir, token);
14
+ }
15
+ function acpArgsWithModel(acpArgs, model) {
16
+ const i = acpArgs.indexOf("acp");
17
+ if (i === -1)
18
+ return acpArgs;
19
+ return [...acpArgs.slice(0, i + 1), "--model", model, ...acpArgs.slice(i + 1)];
20
+ }
21
+ function acpArgsWithWorkspace(acpArgs, workspaceDir) {
22
+ const i = acpArgs.indexOf("acp");
23
+ if (i === -1)
24
+ return acpArgs;
25
+ return [...acpArgs.slice(0, i), "--workspace", workspaceDir, ...acpArgs.slice(i)];
26
+ }
27
+ function extractModelFromCmdArgs(cmdArgs) {
28
+ const i = cmdArgs.indexOf("--model");
29
+ return i >= 0 && i + 1 < cmdArgs.length ? cmdArgs[i + 1] : undefined;
30
+ }
31
+ export function runAgentSync(config, workspaceDir, cmdArgs, tempDir, stdinPrompt, configDir, signal) {
32
+ if (config.useAcp && typeof stdinPrompt === "string") {
33
+ const acpModel = extractModelFromCmdArgs(cmdArgs);
34
+ let args = acpArgsWithWorkspace(config.acpArgs, workspaceDir);
35
+ args = acpModel ? acpArgsWithModel(args, acpModel) : args;
36
+ const acpEnv = { ...config.acpEnv };
37
+ if (config.chatOnlyWorkspace) {
38
+ Object.assign(acpEnv, getChatOnlyEnvOverrides(workspaceDir, configDir));
39
+ }
40
+ return runAcpSync(config.acpCommand, args, stdinPrompt, {
41
+ cwd: workspaceDir,
42
+ timeoutMs: config.timeoutMs,
43
+ env: acpEnv,
44
+ model: acpModel,
45
+ requestTimeoutMs: 60_000,
46
+ spawnOptions: config.acpSpawnOptions,
47
+ skipAuthenticate: config.acpSkipAuthenticate,
48
+ rawDebug: config.acpRawDebug,
49
+ signal,
50
+ }).then((out) => {
51
+ cacheTokenForAccount(configDir);
52
+ if (tempDir) {
53
+ try {
54
+ fs.rmSync(tempDir, { recursive: true, force: true });
55
+ }
56
+ catch {
57
+ /* ignore */
58
+ }
59
+ }
60
+ return out;
61
+ });
62
+ }
63
+ const runEnvOverrides = config.chatOnlyWorkspace
64
+ ? getChatOnlyEnvOverrides(workspaceDir, configDir)
65
+ : undefined;
66
+ return run(config.agentBin, cmdArgs, {
67
+ cwd: workspaceDir,
68
+ timeoutMs: config.timeoutMs,
69
+ maxMode: config.maxMode,
70
+ stdinContent: stdinPrompt,
71
+ envOverrides: runEnvOverrides,
72
+ configDir,
73
+ signal,
74
+ }).then((out) => {
75
+ cacheTokenForAccount(configDir);
76
+ if (tempDir) {
77
+ try {
78
+ fs.rmSync(tempDir, { recursive: true, force: true });
79
+ }
80
+ catch {
81
+ /* ignore */
82
+ }
83
+ }
84
+ return out;
85
+ });
86
+ }
87
+ export function runAgentStream(config, workspaceDir, cmdArgs, onLine, tempDir, stdinPrompt, configDir, signal) {
88
+ if (config.useAcp && typeof stdinPrompt === "string") {
89
+ const acpModel = extractModelFromCmdArgs(cmdArgs);
90
+ let args = acpArgsWithWorkspace(config.acpArgs, workspaceDir);
91
+ args = acpModel ? acpArgsWithModel(args, acpModel) : args;
92
+ const acpEnv = { ...config.acpEnv };
93
+ if (config.chatOnlyWorkspace) {
94
+ Object.assign(acpEnv, getChatOnlyEnvOverrides(workspaceDir, configDir));
95
+ }
96
+ return runAcpStream(config.acpCommand, args, stdinPrompt, {
97
+ cwd: workspaceDir,
98
+ timeoutMs: config.timeoutMs,
99
+ env: acpEnv,
100
+ model: acpModel,
101
+ requestTimeoutMs: 60_000,
102
+ spawnOptions: config.acpSpawnOptions,
103
+ skipAuthenticate: config.acpSkipAuthenticate,
104
+ rawDebug: config.acpRawDebug,
105
+ signal,
106
+ }, onLine).then((result) => {
107
+ cacheTokenForAccount(configDir);
108
+ if (tempDir) {
109
+ try {
110
+ fs.rmSync(tempDir, { recursive: true, force: true });
111
+ }
112
+ catch {
113
+ /* ignore */
114
+ }
115
+ }
116
+ return result;
117
+ });
118
+ }
119
+ const streamEnvOverrides = config.chatOnlyWorkspace
120
+ ? getChatOnlyEnvOverrides(workspaceDir, configDir)
121
+ : undefined;
122
+ return runStreaming(config.agentBin, cmdArgs, {
123
+ cwd: workspaceDir,
124
+ timeoutMs: config.timeoutMs,
125
+ maxMode: config.maxMode,
126
+ onLine,
127
+ stdinContent: stdinPrompt,
128
+ envOverrides: streamEnvOverrides,
129
+ configDir,
130
+ signal,
131
+ }).then((result) => {
132
+ cacheTokenForAccount(configDir);
133
+ if (tempDir) {
134
+ try {
135
+ fs.rmSync(tempDir, { recursive: true, force: true });
136
+ }
137
+ catch {
138
+ /* ignore */
139
+ }
140
+ }
141
+ return result;
142
+ });
143
+ }
144
+ //# sourceMappingURL=agent-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-runner.js","sourceRoot":"","sources":["../../src/lib/agent-runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE3D,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEvE,SAAS,oBAAoB,CAAC,SAAkB;IAC9C,IAAI,CAAC,SAAS;QAAE,OAAO;IACvB,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,GAAG;QAAE,OAAO;IACrD,MAAM,KAAK,GAAG,iBAAiB,EAAE,CAAC;IAClC,IAAI,KAAK;QAAE,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AAChD,CAAC;AAQD,SAAS,gBAAgB,CAAC,OAAiB,EAAE,KAAa;IACxD,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACjC,IAAI,CAAC,KAAK,CAAC,CAAC;QAAE,OAAO,OAAO,CAAC;IAC7B,OAAO,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAiB,EAAE,YAAoB;IACnE,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACjC,IAAI,CAAC,KAAK,CAAC,CAAC;QAAE,OAAO,OAAO,CAAC;IAC7B,OAAO,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACpF,CAAC;AAED,SAAS,uBAAuB,CAAC,OAAiB;IAChD,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,MAAoB,EACpB,YAAoB,EACpB,OAAiB,EACjB,OAAgB,EAChB,WAAoB,EACpB,SAAkB,EAClB,MAAoB;IAEpB,IAAI,MAAM,CAAC,MAAM,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;QACrD,MAAM,QAAQ,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,IAAI,GAAG,oBAAoB,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC9D,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1D,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QACpC,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAC7B,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,UAAU,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE;YACtD,GAAG,EAAE,YAAY;YACjB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,GAAG,EAAE,MAAM;YACX,KAAK,EAAE,QAAQ;YACf,gBAAgB,EAAE,MAAM;YACxB,YAAY,EAAE,MAAM,CAAC,eAAe;YACpC,gBAAgB,EAAE,MAAM,CAAC,mBAAmB;YAC5C,QAAQ,EAAE,MAAM,CAAC,WAAW;YAC5B,MAAM;SACP,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;YACd,oBAAoB,CAAC,SAAS,CAAC,CAAC;YAChC,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,CAAC;oBACH,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBACvD,CAAC;gBAAC,MAAM,CAAC;oBACP,YAAY;gBACd,CAAC;YACH,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC,CAAC,CAAC;IACL,CAAC;IACD,MAAM,eAAe,GAAG,MAAM,CAAC,iBAAiB;QAC9C,CAAC,CAAC,uBAAuB,CAAC,YAAY,EAAE,SAAS,CAAC;QAClD,CAAC,CAAC,SAAS,CAAC;IACd,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,YAAY,EAAE,WAAW;QACzB,YAAY,EAAE,eAAe;QAC7B,SAAS;QACT,MAAM;KACP,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,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;QACD,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC;AAID,MAAM,UAAU,cAAc,CAC5B,MAAoB,EACpB,YAAoB,EACpB,OAAiB,EACjB,MAAyB,EACzB,OAAgB,EAChB,WAAoB,EACpB,SAAkB,EAClB,MAAoB;IAEpB,IAAI,MAAM,CAAC,MAAM,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;QACrD,MAAM,QAAQ,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,IAAI,GAAG,oBAAoB,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC9D,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1D,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QACpC,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAC7B,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,YAAY,CACjB,MAAM,CAAC,UAAU,EACjB,IAAI,EACJ,WAAW,EACX;YACE,GAAG,EAAE,YAAY;YACjB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,GAAG,EAAE,MAAM;YACX,KAAK,EAAE,QAAQ;YACf,gBAAgB,EAAE,MAAM;YACxB,YAAY,EAAE,MAAM,CAAC,eAAe;YACpC,gBAAgB,EAAE,MAAM,CAAC,mBAAmB;YAC5C,QAAQ,EAAE,MAAM,CAAC,WAAW;YAC5B,MAAM;SACP,EACD,MAAM,CACP,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YAChB,oBAAoB,CAAC,SAAS,CAAC,CAAC;YAChC,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,CAAC;oBACH,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBACvD,CAAC;gBAAC,MAAM,CAAC;oBACP,YAAY;gBACd,CAAC;YACH,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC;IACD,MAAM,kBAAkB,GAAG,MAAM,CAAC,iBAAiB;QACjD,CAAC,CAAC,uBAAuB,CAAC,YAAY,EAAE,SAAS,CAAC;QAClD,CAAC,CAAC,SAAS,CAAC;IACd,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,YAAY,EAAE,WAAW;QACzB,YAAY,EAAE,kBAAkB;QAChC,SAAS;QACT,MAAM;KACP,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;QACjB,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;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Anthropic Messages API support.
3
+ * Converts Anthropic request format to the prompt format used by Cursor CLI.
4
+ */
5
+ export type AnthropicMessageParam = {
6
+ role: "user" | "assistant";
7
+ content: string | Array<{
8
+ type?: string;
9
+ text?: string;
10
+ }>;
11
+ };
12
+ export type AnthropicMessagesRequest = {
13
+ model?: string;
14
+ max_tokens: number;
15
+ messages: AnthropicMessageParam[];
16
+ system?: string | Array<{
17
+ type?: string;
18
+ text?: string;
19
+ }>;
20
+ stream?: boolean;
21
+ };
22
+ /**
23
+ * Convert Anthropic messages + optional system prompt to the prompt format
24
+ * expected by buildPromptFromMessages (OpenAI-style messages array).
25
+ */
26
+ export declare function buildPromptFromAnthropicMessages(messages: AnthropicMessageParam[] | undefined, system?: AnthropicMessagesRequest["system"]): string;
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Anthropic Messages API support.
3
+ * Converts Anthropic request format to the prompt format used by Cursor CLI.
4
+ */
5
+ import { buildPromptFromMessages } from "./openai.js";
6
+ function systemToText(system) {
7
+ if (system == null)
8
+ return "";
9
+ if (typeof system === "string")
10
+ return system.trim();
11
+ if (!Array.isArray(system))
12
+ return "";
13
+ return system
14
+ .map((p) => {
15
+ if (!p || typeof p !== "object")
16
+ return "";
17
+ if (p.type === "text" && typeof p.text === "string")
18
+ return p.text;
19
+ return "";
20
+ })
21
+ .join("\n");
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
+ }
44
+ function anthropicContentToText(content) {
45
+ if (typeof content === "string")
46
+ return content;
47
+ if (!Array.isArray(content))
48
+ return "";
49
+ return content.map(anthropicBlockToText).filter(Boolean).join(" ");
50
+ }
51
+ /**
52
+ * Convert Anthropic messages + optional system prompt to the prompt format
53
+ * expected by buildPromptFromMessages (OpenAI-style messages array).
54
+ */
55
+ export function buildPromptFromAnthropicMessages(messages, system) {
56
+ const openaiMessages = [];
57
+ const systemText = systemToText(system);
58
+ if (systemText) {
59
+ openaiMessages.push({ role: "system", content: systemText });
60
+ }
61
+ for (const m of messages || []) {
62
+ const text = anthropicContentToText(m.content);
63
+ if (!text)
64
+ continue;
65
+ const role = m.role === "user" || m.role === "assistant" ? m.role : "user";
66
+ openaiMessages.push({ role, content: text });
67
+ }
68
+ return buildPromptFromMessages(openaiMessages);
69
+ }
70
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/lib/anthropic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Create a stateful stream parser for Cursor CLI stream-json output.
3
+ *
4
+ * The CLI emits individual assistant delta chunks and then a final assistant
5
+ * message containing the full accumulated text. We track what we've already
6
+ * emitted so the final duplicate is skipped.
7
+ */
8
+ export declare function createStreamParser(onText: (text: string) => void, onDone: () => void): (line: string) => void;
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Create a stateful stream parser for Cursor CLI stream-json output.
3
+ *
4
+ * The CLI emits individual assistant delta chunks and then a final assistant
5
+ * message containing the full accumulated text. We track what we've already
6
+ * emitted so the final duplicate is skipped.
7
+ */
8
+ export function createStreamParser(onText, onDone) {
9
+ let accumulated = "";
10
+ let done = false;
11
+ return (line) => {
12
+ if (done)
13
+ return;
14
+ try {
15
+ const obj = JSON.parse(line);
16
+ if (obj.type === "assistant" && obj.message?.content) {
17
+ const text = obj.message.content
18
+ .filter((p) => p.type === "text" && p.text)
19
+ .map((p) => p.text)
20
+ .join("");
21
+ if (!text)
22
+ return;
23
+ if (text === accumulated)
24
+ return;
25
+ if (text.startsWith(accumulated) && accumulated.length > 0) {
26
+ const delta = text.slice(accumulated.length);
27
+ if (delta)
28
+ onText(delta);
29
+ accumulated = text;
30
+ }
31
+ else {
32
+ onText(text);
33
+ accumulated += text;
34
+ }
35
+ }
36
+ if (obj.type === "result" && obj.subtype === "success") {
37
+ done = true;
38
+ onDone();
39
+ }
40
+ }
41
+ catch {
42
+ /* ignore parse errors for non-JSON lines */
43
+ }
44
+ };
45
+ }
46
+ //# sourceMappingURL=cli-stream-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-stream-parser.js","sourceRoot":"","sources":["../../src/lib/cli-stream-parser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAA8B,EAC9B,MAAkB;IAElB,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,IAAI,IAAI,GAAG,KAAK,CAAC;IAEjB,OAAO,CAAC,IAAY,EAAE,EAAE;QACtB,IAAI,IAAI;YAAE,OAAO;QACjB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAI1B,CAAC;YAEF,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,IAAI,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;gBACrD,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO;qBAC7B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC;qBAC1C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAK,CAAC;qBACnB,IAAI,CAAC,EAAE,CAAC,CAAC;gBACZ,IAAI,CAAC,IAAI;oBAAE,OAAO;gBAElB,IAAI,IAAI,KAAK,WAAW;oBAAE,OAAO;gBAEjC,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;oBAC7C,IAAI,KAAK;wBAAE,MAAM,CAAC,KAAK,CAAC,CAAC;oBACzB,WAAW,GAAG,IAAI,CAAC;gBACrB,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,CAAC,CAAC;oBACb,WAAW,IAAI,IAAI,CAAC;gBACtB,CAAC;YACH,CAAC;YAED,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBACvD,IAAI,GAAG,IAAI,CAAC;gBACZ,MAAM,EAAE,CAAC;YACX,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,4CAA4C;QAC9C,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { type EnvOptions } from "./env.js";
2
+ export type CursorExecutionMode = "agent" | "ask" | "plan";
3
+ export type BridgeConfig = {
4
+ agentBin: string;
5
+ /** Resolved command for ACP (node + script on Windows when .cmd); avoids spawn EINVAL and DEP0190. */
6
+ acpCommand: string;
7
+ /** Args for ACP (e.g. [scriptPath, "acp"] or ["acp"]). */
8
+ acpArgs: string[];
9
+ /** Env to use when spawning ACP (e.g. CURSOR_INVOKED_AS). */
10
+ acpEnv: Record<string, string | undefined>;
11
+ host: string;
12
+ port: number;
13
+ requiredKey?: string;
14
+ defaultModel: string;
15
+ mode: CursorExecutionMode;
16
+ force: boolean;
17
+ approveMcps: boolean;
18
+ strictModel: boolean;
19
+ workspace: string;
20
+ timeoutMs: number;
21
+ /** Path to TLS certificate file (e.g. Tailscale cert). When set with tlsKeyPath, server uses HTTPS. */
22
+ tlsCertPath?: string;
23
+ /** Path to TLS private key file. When set with tlsCertPath, server uses HTTPS. */
24
+ tlsKeyPath?: string;
25
+ /** Path to sessions log file; each request is appended as a line. Default: sessions.log in cwd. */
26
+ sessionsLogPath: string;
27
+ /** When true (default), run CLI in an empty temp dir so it cannot read or write the real project. Pure chat only. */
28
+ chatOnlyWorkspace: boolean;
29
+ /** When true, print full request/response content to stdout for each completion. */
30
+ verbose: boolean;
31
+ /** When true, enable Cursor Max Mode (larger context, more tool calls) via cli-config.json preflight. */
32
+ maxMode: boolean;
33
+ /** When true, pass the user prompt via stdin instead of argv (avoids Windows argv issues). */
34
+ promptViaStdin: boolean;
35
+ /** When true, use ACP (Agent Client Protocol) over stdio; fixes prompt delivery on Windows. */
36
+ useAcp: boolean;
37
+ /** Spawn options for ACP (e.g. windowsVerbatimArguments when using cmd.exe fallback). */
38
+ acpSpawnOptions?: {
39
+ windowsVerbatimArguments?: boolean;
40
+ };
41
+ /** When true, skip ACP authenticate step (use when pre-authenticated via --api-key or agent login). */
42
+ acpSkipAuthenticate: boolean;
43
+ /** When true, log every raw JSON-RPC line from ACP stdout (very verbose). Set CURSOR_BRIDGE_ACP_RAW_DEBUG=1 to enable. */
44
+ acpRawDebug: boolean;
45
+ /** Pool of cursor configuration directories for round-robin account rotation. */
46
+ configDirs: string[];
47
+ /** When true, runs each config dir on its own incrementing port starting from `port` */
48
+ multiPort: boolean;
49
+ /** Windows CreateProcess command-line budget for prompt truncation (ignored on non-Windows). */
50
+ winCmdlineMax: number;
51
+ };
52
+ export declare function loadBridgeConfig(opts?: EnvOptions): BridgeConfig;
@@ -0,0 +1,47 @@
1
+ import { loadEnvConfig, resolveAgentCommand } from "./env.js";
2
+ export function loadBridgeConfig(opts = {}) {
3
+ const env = loadEnvConfig(opts);
4
+ const acpResolved = resolveAgentCommand(env.agentBin, ["acp"], opts);
5
+ const envSource = opts.env ?? process.env;
6
+ const apiKey = envSource.CURSOR_API_KEY ?? envSource.CURSOR_AUTH_TOKEN;
7
+ const acpArgs = acpResolved.args;
8
+ const acpEnv = { ...acpResolved.env };
9
+ if (apiKey) {
10
+ acpEnv.CURSOR_API_KEY = apiKey;
11
+ acpEnv.CURSOR_AUTH_TOKEN = apiKey;
12
+ }
13
+ return {
14
+ agentBin: env.agentBin,
15
+ acpCommand: acpResolved.command,
16
+ acpArgs,
17
+ acpEnv,
18
+ host: env.host,
19
+ port: env.port,
20
+ requiredKey: env.requiredKey,
21
+ defaultModel: env.defaultModel,
22
+ mode: "ask", // proxy is chat-only; CURSOR_BRIDGE_MODE is ignored
23
+ force: env.force,
24
+ approveMcps: env.approveMcps,
25
+ strictModel: env.strictModel,
26
+ workspace: env.workspace,
27
+ timeoutMs: env.timeoutMs,
28
+ tlsCertPath: env.tlsCertPath,
29
+ tlsKeyPath: env.tlsKeyPath,
30
+ sessionsLogPath: env.sessionsLogPath,
31
+ chatOnlyWorkspace: env.chatOnlyWorkspace,
32
+ verbose: env.verbose,
33
+ maxMode: env.maxMode,
34
+ promptViaStdin: env.promptViaStdin,
35
+ useAcp: env.useAcp,
36
+ acpSpawnOptions: acpResolved.windowsVerbatimArguments != null
37
+ ? { windowsVerbatimArguments: acpResolved.windowsVerbatimArguments }
38
+ : undefined,
39
+ acpSkipAuthenticate: !!apiKey ||
40
+ /^(1|true|yes|on)$/i.test(String(envSource.CURSOR_BRIDGE_ACP_SKIP_AUTHENTICATE ?? "").trim()),
41
+ acpRawDebug: /^(1|true|yes|on)$/i.test(String(envSource.CURSOR_BRIDGE_ACP_RAW_DEBUG ?? "").trim()),
42
+ configDirs: env.configDirs ?? [],
43
+ multiPort: env.multiPort,
44
+ winCmdlineMax: env.winCmdlineMax,
45
+ };
46
+ }
47
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAmB,MAAM,UAAU,CAAC;AAoD/E,MAAM,UAAU,gBAAgB,CAAC,OAAmB,EAAE;IACpD,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,WAAW,GAAG,mBAAmB,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;IACrE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IAC1C,MAAM,MAAM,GAAG,SAAS,CAAC,cAAc,IAAI,SAAS,CAAC,iBAAiB,CAAC;IACvE,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC;IAEjC,MAAM,MAAM,GAAG,EAAE,GAAG,WAAW,CAAC,GAAG,EAAwC,CAAC;IAC5E,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,cAAc,GAAG,MAAM,CAAC;QAC/B,MAAM,CAAC,iBAAiB,GAAG,MAAM,CAAC;IACpC,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,UAAU,EAAE,WAAW,CAAC,OAAO;QAC/B,OAAO;QACP,MAAM;QACN,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,cAAc,EAAE,GAAG,CAAC,cAAc;QAClC,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,eAAe,EACb,WAAW,CAAC,wBAAwB,IAAI,IAAI;YAC1C,CAAC,CAAC,EAAE,wBAAwB,EAAE,WAAW,CAAC,wBAAwB,EAAE;YACpE,CAAC,CAAC,SAAS;QACf,mBAAmB,EACjB,CAAC,CAAC,MAAM;YACR,oBAAoB,CAAC,IAAI,CACvB,MAAM,CAAC,SAAS,CAAC,mCAAmC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CACnE;QACH,WAAW,EAAE,oBAAoB,CAAC,IAAI,CACpC,MAAM,CAAC,SAAS,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAC3D;QACD,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,EAAE;QAChC,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,aAAa,EAAE,GAAG,CAAC,aAAa;KACjC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ export type CursorCliModel = {
2
+ id: string;
3
+ name: string;
4
+ };
5
+ export declare function parseCursorCliModels(output: string): CursorCliModel[];
6
+ export declare function listCursorCliModels(args: {
7
+ agentBin: string;
8
+ timeoutMs: number;
9
+ }): Promise<CursorCliModel[]>;
@@ -0,0 +1,30 @@
1
+ import { tmpdir } from "node:os";
2
+ import { run } from "./process.js";
3
+ export function parseCursorCliModels(output) {
4
+ const lines = output.split(/\r?\n/g).map((l) => l.trim());
5
+ const models = [];
6
+ for (const line of lines) {
7
+ const match = line.match(/^([A-Za-z0-9][A-Za-z0-9._:/-]*)\s+-\s+(.*)$/);
8
+ if (!match)
9
+ continue;
10
+ const id = match[1];
11
+ const rawName = match[2];
12
+ const name = rawName.replace(/\s*\([^)]*\)\s*$/g, "").trim();
13
+ models.push({ id, name: name || id });
14
+ }
15
+ const byId = new Map();
16
+ for (const m of models)
17
+ byId.set(m.id, m);
18
+ return [...byId.values()];
19
+ }
20
+ export async function listCursorCliModels(args) {
21
+ const list = await run(args.agentBin, ["--list-models"], {
22
+ cwd: tmpdir(),
23
+ timeoutMs: args.timeoutMs,
24
+ });
25
+ if (list.code !== 0) {
26
+ throw new Error(`agent --list-models failed: ${list.stderr.trim()}`);
27
+ }
28
+ return parseCursorCliModels(list.stdout);
29
+ }
30
+ //# sourceMappingURL=cursor-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor-cli.js","sourceRoot":"","sources":["../../src/lib/cursor-cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAInC,MAAM,UAAU,oBAAoB,CAAC,MAAc;IACjD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAqB,EAAE,CAAC;IAEpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACxE,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7D,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC/C,KAAK,MAAM,CAAC,IAAI,MAAM;QAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAGzC;IACC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,eAAe,CAAC,EAAE;QACvD,GAAG,EAAE,MAAM,EAAE;QACb,SAAS,EAAE,IAAI,CAAC,SAAS;KAC1B,CAAC,CAAC;IAEH,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,+BAA+B,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,OAAO,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,54 @@
1
+ export type EnvSource = Record<string, string | undefined>;
2
+ export type EnvOptions = {
3
+ tailscale?: boolean;
4
+ env?: EnvSource;
5
+ cwd?: string;
6
+ platform?: NodeJS.Platform;
7
+ };
8
+ export type LoadedEnv = {
9
+ agentBin: string;
10
+ agentNode?: string;
11
+ agentScript?: string;
12
+ commandShell: string;
13
+ host: string;
14
+ port: number;
15
+ requiredKey?: string;
16
+ defaultModel: string;
17
+ force: boolean;
18
+ approveMcps: boolean;
19
+ strictModel: boolean;
20
+ workspace: string;
21
+ timeoutMs: number;
22
+ tlsCertPath?: string;
23
+ tlsKeyPath?: string;
24
+ sessionsLogPath: string;
25
+ chatOnlyWorkspace: boolean;
26
+ verbose: boolean;
27
+ /** When true, set maxMode in cli-config.json before each run (larger context, more tools). */
28
+ maxMode: boolean;
29
+ /** When true, pass the user prompt via stdin instead of argv (avoids Windows argv truncation). */
30
+ promptViaStdin: boolean;
31
+ /** When true, use ACP (Agent Client Protocol) over stdio instead of CLI argv (fixes prompt delivery on Windows). */
32
+ useAcp: boolean;
33
+ /** Pool of cursor configuration directories for round-robin account rotation. */
34
+ configDirs: string[];
35
+ /** When true, runs each config dir on its own incrementing port starting from `port` */
36
+ multiPort: boolean;
37
+ /**
38
+ * Upper bound (UTF-16 code units, pessimistic) for the Windows CreateProcess command line.
39
+ * On win32 the proxy truncates the prompt tail to stay under this budget.
40
+ */
41
+ winCmdlineMax: number;
42
+ };
43
+ export type AgentCommand = {
44
+ command: string;
45
+ args: string[];
46
+ env: EnvSource;
47
+ windowsVerbatimArguments?: boolean;
48
+ /** Path to agent entry script (e.g. index.js). Set when using node+script so max-mode preflight can find config. */
49
+ agentScriptPath?: string;
50
+ /** Cursor config dir (cli-config.json). Set so CLI reads the same config preflight wrote to. */
51
+ configDir?: string;
52
+ };
53
+ export declare function loadEnvConfig(opts?: EnvOptions): LoadedEnv;
54
+ export declare function resolveAgentCommand(cmd: string, args: string[], opts?: EnvOptions): AgentCommand;