opencodev2-cursor 0.0.0-stage → 0.1.1

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 (69) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +161 -3
  3. package/dist/backends/agent-argv.mjs +12 -0
  4. package/dist/backends/agent-cli.d.ts +10 -0
  5. package/dist/backends/agent-cli.js +117 -0
  6. package/dist/backends/agent-cli.js.map +1 -0
  7. package/dist/backends/auto-models.d.ts +26 -0
  8. package/dist/backends/auto-models.js +43 -0
  9. package/dist/backends/auto-models.js.map +1 -0
  10. package/dist/backends/checkpoint.d.ts +8 -0
  11. package/dist/backends/checkpoint.js +28 -0
  12. package/dist/backends/checkpoint.js.map +1 -0
  13. package/dist/backends/native/auth.d.ts +20 -0
  14. package/dist/backends/native/auth.js +145 -0
  15. package/dist/backends/native/auth.js.map +1 -0
  16. package/dist/backends/native/backend.d.ts +12 -0
  17. package/dist/backends/native/backend.js +105 -0
  18. package/dist/backends/native/backend.js.map +1 -0
  19. package/dist/backends/native/h2-bridge.mjs +55 -0
  20. package/dist/backends/native/proto.d.ts +31 -0
  21. package/dist/backends/native/proto.js +130 -0
  22. package/dist/backends/native/proto.js.map +1 -0
  23. package/dist/backends/sdk-runner.mjs +317 -0
  24. package/dist/backends/sdk.d.ts +30 -0
  25. package/dist/backends/sdk.js +304 -0
  26. package/dist/backends/sdk.js.map +1 -0
  27. package/dist/backends/select.d.ts +4 -0
  28. package/dist/backends/select.js +15 -0
  29. package/dist/backends/select.js.map +1 -0
  30. package/dist/backends/spawn.d.ts +15 -0
  31. package/dist/backends/spawn.js +64 -0
  32. package/dist/backends/spawn.js.map +1 -0
  33. package/dist/backends/stream-json.d.ts +7 -0
  34. package/dist/backends/stream-json.js +106 -0
  35. package/dist/backends/stream-json.js.map +1 -0
  36. package/dist/backends/types.d.ts +72 -0
  37. package/dist/backends/types.js +15 -0
  38. package/dist/backends/types.js.map +1 -0
  39. package/dist/index.d.ts +4 -0
  40. package/dist/index.js +118 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/plugin/auth.d.ts +9 -0
  43. package/dist/plugin/auth.js +126 -0
  44. package/dist/plugin/auth.js.map +1 -0
  45. package/dist/plugin/catalog.d.ts +41 -0
  46. package/dist/plugin/catalog.js +120 -0
  47. package/dist/plugin/catalog.js.map +1 -0
  48. package/dist/proxy/server.d.ts +17 -0
  49. package/dist/proxy/server.js +265 -0
  50. package/dist/proxy/server.js.map +1 -0
  51. package/dist/proxy/title.d.ts +4 -0
  52. package/dist/proxy/title.js +24 -0
  53. package/dist/proxy/title.js.map +1 -0
  54. package/dist/proxy/tools.d.ts +4 -0
  55. package/dist/proxy/tools.js +26 -0
  56. package/dist/proxy/tools.js.map +1 -0
  57. package/dist/proxy/translate.d.ts +42 -0
  58. package/dist/proxy/translate.js +77 -0
  59. package/dist/proxy/translate.js.map +1 -0
  60. package/dist/util/log.d.ts +1 -0
  61. package/dist/util/log.js +27 -0
  62. package/dist/util/log.js.map +1 -0
  63. package/dist/util/paths.d.ts +6 -0
  64. package/dist/util/paths.js +30 -0
  65. package/dist/util/paths.js.map +1 -0
  66. package/dist/util/windows.d.ts +28 -0
  67. package/dist/util/windows.js +123 -0
  68. package/dist/util/windows.js.map +1 -0
  69. package/package.json +53 -6
@@ -0,0 +1,30 @@
1
+ import type { BackendEvent, BackendRunRequest, CursorBackend, CursorModel } from "./types.js";
2
+ export interface RememberedAgent {
3
+ agentId: string;
4
+ modelKey: string;
5
+ }
6
+ /** Resume only when the stored agent was created for this model and its params. */
7
+ export declare function resumeAgentId(model: string, modelParams: Array<{
8
+ id: string;
9
+ value: string;
10
+ }> | undefined, live: RememberedAgent | undefined, saved: {
11
+ agentId: string;
12
+ model: string;
13
+ } | undefined): string | undefined;
14
+ /** One long-lived Node worker. Chat sessions reuse it by resuming different agent IDs inside the same process. */
15
+ export declare class SdkBackend implements CursorBackend {
16
+ private readonly apiKey;
17
+ readonly id: "sdk";
18
+ private warm;
19
+ private sessionAgents;
20
+ private lock;
21
+ constructor(apiKey: () => Promise<string>);
22
+ private ensureWarm;
23
+ private withLock;
24
+ warmUp(cwd: string): Promise<CursorModel[]>;
25
+ listModels(): Promise<CursorModel[]>;
26
+ run(request: BackendRunRequest): AsyncIterable<BackendEvent>;
27
+ private runLocked;
28
+ private logTiming;
29
+ dispose(): Promise<void>;
30
+ }
@@ -0,0 +1,304 @@
1
+ import { spawn } from "node:child_process";
2
+ import { createInterface } from "node:readline";
3
+ import { fileURLToPath } from "node:url";
4
+ import { FALLBACK_MODELS } from "./types.js";
5
+ import { assertNodeForSdk, nodeBinary } from "./spawn.js";
6
+ import { modelSelectionKey } from "./auto-models.js";
7
+ import { compileCacheDir, sdkStateDir } from "../util/paths.js";
8
+ import { readCheckpoint, writeCheckpoint } from "./checkpoint.js";
9
+ import { log } from "../util/log.js";
10
+ import { mapCursorTool } from "../proxy/tools.js";
11
+ class SdkRunner {
12
+ events = [];
13
+ waiters = [];
14
+ child;
15
+ agentId;
16
+ alive = true;
17
+ constructor(child) {
18
+ this.child = child;
19
+ const lines = createInterface({ input: child.stdout });
20
+ lines.on("line", (line) => {
21
+ let event;
22
+ try {
23
+ event = JSON.parse(line);
24
+ }
25
+ catch {
26
+ return;
27
+ }
28
+ if (event.type === "session" && event.agentId)
29
+ this.agentId = event.agentId;
30
+ if (event.type === "warn" && event.message)
31
+ log("warn", "sdk runner", event.message);
32
+ if (event.type === "idle" || event.type === "pong" || event.type === "warn")
33
+ return;
34
+ this.push(event);
35
+ });
36
+ child.on("exit", (code) => {
37
+ this.alive = false;
38
+ this.push({ type: "error", message: `Cursor SDK runner exited (${code ?? "signal"})` });
39
+ });
40
+ }
41
+ push(event) {
42
+ const waiter = this.waiters.shift();
43
+ if (waiter)
44
+ waiter(event);
45
+ else
46
+ this.events.push(event);
47
+ }
48
+ send(message) {
49
+ this.child.stdin.write(JSON.stringify(message) + "\n");
50
+ }
51
+ next() {
52
+ const queued = this.events.shift();
53
+ if (queued)
54
+ return Promise.resolve(queued);
55
+ return new Promise((resolve) => this.waiters.push(resolve));
56
+ }
57
+ cancel() {
58
+ try {
59
+ this.send({ type: "cancel" });
60
+ }
61
+ catch {
62
+ // Process may already be gone.
63
+ }
64
+ this.child.kill();
65
+ this.alive = false;
66
+ }
67
+ }
68
+ function runnerScript() {
69
+ return fileURLToPath(new URL("./sdk-runner.mjs", import.meta.url));
70
+ }
71
+ function startRunner() {
72
+ if (!process.env.CURSOR_ACP_NODE_BIN)
73
+ assertNodeForSdk();
74
+ const child = spawn(nodeBinary(), [runnerScript()], {
75
+ stdio: ["pipe", "pipe", "pipe"],
76
+ windowsHide: true,
77
+ env: {
78
+ ...process.env,
79
+ NODE_COMPILE_CACHE: compileCacheDir(),
80
+ },
81
+ });
82
+ child.stderr.on("data", (chunk) => log("warn", "sdk runner", chunk.toString().trim()));
83
+ return new SdkRunner(child);
84
+ }
85
+ /** Resume only when the stored agent was created for this model and its params. */
86
+ export function resumeAgentId(model, modelParams, live, saved) {
87
+ const modelKey = modelSelectionKey(model, modelParams);
88
+ if (live?.modelKey === modelKey)
89
+ return live.agentId;
90
+ if (!saved)
91
+ return undefined;
92
+ if (saved.model === modelKey)
93
+ return saved.agentId;
94
+ // Checkpoints written before selection keys stored the plain Cursor id.
95
+ // Auto Router always has params, so an old "auto-smart" id is not enough to resume a Cost or Intelligence turn.
96
+ if (saved.model === model && !(modelParams?.length))
97
+ return saved.agentId;
98
+ return undefined;
99
+ }
100
+ /** One long-lived Node worker. Chat sessions reuse it by resuming different agent IDs inside the same process. */
101
+ export class SdkBackend {
102
+ apiKey;
103
+ id = "sdk";
104
+ warm;
105
+ sessionAgents = new Map();
106
+ lock = Promise.resolve();
107
+ constructor(apiKey) {
108
+ this.apiKey = apiKey;
109
+ }
110
+ ensureWarm() {
111
+ if (this.warm?.alive)
112
+ return this.warm;
113
+ this.warm = startRunner();
114
+ log("info", "sdk worker started");
115
+ return this.warm;
116
+ }
117
+ async withLock(fn) {
118
+ let release;
119
+ const previous = this.lock;
120
+ this.lock = new Promise((resolve) => {
121
+ release = resolve;
122
+ });
123
+ await previous;
124
+ try {
125
+ return await fn();
126
+ }
127
+ finally {
128
+ release();
129
+ }
130
+ }
131
+ async warmUp(cwd) {
132
+ return this.withLock(async () => {
133
+ const started = Date.now();
134
+ const apiKey = await this.apiKey();
135
+ const runner = this.ensureWarm();
136
+ runner.send({
137
+ type: "warm",
138
+ id: "warm",
139
+ apiKey,
140
+ cwd,
141
+ stateRoot: sdkStateDir(cwd),
142
+ });
143
+ const event = await runner.next();
144
+ if (event.type === "error")
145
+ throw new Error(event.message || "SDK warm-up failed");
146
+ const models = (event.models ?? []).map((model) => ({
147
+ id: model.id,
148
+ name: model.name,
149
+ contextWindow: 200000,
150
+ maxTokens: 32000,
151
+ }));
152
+ log("info", "sdk worker warmed", {
153
+ ms: event.ms ?? Date.now() - started,
154
+ models: models.length,
155
+ prewarmed: event.prewarmed === true,
156
+ cwd: event.cwd || cwd,
157
+ });
158
+ return models.length > 0 ? models : FALLBACK_MODELS;
159
+ });
160
+ }
161
+ async listModels() {
162
+ return this.withLock(async () => {
163
+ const apiKey = await this.apiKey();
164
+ const runner = this.ensureWarm();
165
+ runner.send({ type: "models", id: "models", apiKey });
166
+ const event = await runner.next();
167
+ if (event.type === "error") {
168
+ log("warn", "sdk model list failed", event.message);
169
+ return FALLBACK_MODELS;
170
+ }
171
+ const models = event.models ?? [];
172
+ if (models.length === 0)
173
+ return FALLBACK_MODELS;
174
+ return models.map((model) => ({
175
+ id: model.id,
176
+ name: model.name,
177
+ contextWindow: 200000,
178
+ maxTokens: 32000,
179
+ }));
180
+ });
181
+ }
182
+ async *run(request) {
183
+ let release;
184
+ const previous = this.lock;
185
+ this.lock = new Promise((resolve) => {
186
+ release = resolve;
187
+ });
188
+ await previous;
189
+ const turnStarted = Date.now();
190
+ try {
191
+ yield* this.runLocked(request, turnStarted);
192
+ }
193
+ finally {
194
+ release();
195
+ }
196
+ }
197
+ async *runLocked(request, turnStarted) {
198
+ const apiKey = await this.apiKey();
199
+ const advertised = new Set(request.tools.map((tool) => tool.name));
200
+ const hostTools = request.tools.filter((tool) => mapCursorTool(tool.name, advertised));
201
+ const runner = this.ensureWarm();
202
+ const saved = readCheckpoint(request.sessionKey);
203
+ const resumeId = resumeAgentId(request.model, request.modelParams, this.sessionAgents.get(request.sessionKey), saved);
204
+ const promptToSend = resumeId && request.lastUserPrompt ? request.lastUserPrompt : request.prompt;
205
+ const dispatchAt = Date.now();
206
+ if (request.continuation && resumeId && request.toolResults?.length) {
207
+ for (const result of request.toolResults) {
208
+ runner.send({ type: "tool_result", id: result.id, content: result.content });
209
+ }
210
+ }
211
+ else {
212
+ runner.send({
213
+ type: "turn",
214
+ apiKey,
215
+ model: request.model,
216
+ modelParams: request.modelParams,
217
+ cwd: request.cwd,
218
+ stateRoot: sdkStateDir(request.cwd),
219
+ prompt: promptToSend,
220
+ tools: hostTools,
221
+ agentId: resumeId,
222
+ sessionKey: request.sessionKey,
223
+ });
224
+ }
225
+ const onAbort = () => {
226
+ try {
227
+ runner.send({ type: "cancel" });
228
+ }
229
+ catch {
230
+ // Ignore.
231
+ }
232
+ };
233
+ request.signal.addEventListener("abort", onAbort, { once: true });
234
+ let firstTokenAt;
235
+ try {
236
+ while (!request.signal.aborted) {
237
+ const event = await runner.next();
238
+ if (event.type === "text" && event.text) {
239
+ firstTokenAt ??= Date.now();
240
+ yield { type: "text", text: event.text };
241
+ }
242
+ else if (event.type === "reasoning" && event.text) {
243
+ firstTokenAt ??= Date.now();
244
+ yield { type: "reasoning", text: event.text };
245
+ }
246
+ else if (event.type === "tool") {
247
+ firstTokenAt ??= Date.now();
248
+ const name = mapCursorTool(event.name || "", advertised) || event.name || "tool";
249
+ yield {
250
+ type: "tool_call",
251
+ id: event.id || "tool",
252
+ name,
253
+ arguments: event.arguments || "{}",
254
+ };
255
+ this.logTiming(request, turnStarted, dispatchAt, firstTokenAt, "tool");
256
+ return;
257
+ }
258
+ else if (event.type === "error") {
259
+ this.logTiming(request, turnStarted, dispatchAt, firstTokenAt, "error");
260
+ yield { type: "error", message: event.message || "Cursor SDK failed" };
261
+ return;
262
+ }
263
+ else if (event.type === "done") {
264
+ if (runner.agentId) {
265
+ const modelKey = modelSelectionKey(request.model, request.modelParams);
266
+ this.sessionAgents.set(request.sessionKey, { agentId: runner.agentId, modelKey });
267
+ writeCheckpoint(request.sessionKey, { agentId: runner.agentId, model: modelKey });
268
+ }
269
+ this.logTiming(request, turnStarted, dispatchAt, firstTokenAt, "done");
270
+ yield { type: "done", text: event.text };
271
+ return;
272
+ }
273
+ else if (event.type === "session" && event.agentId) {
274
+ this.sessionAgents.set(request.sessionKey, {
275
+ agentId: event.agentId,
276
+ modelKey: modelSelectionKey(request.model, request.modelParams),
277
+ });
278
+ }
279
+ }
280
+ }
281
+ finally {
282
+ request.signal.removeEventListener("abort", onAbort);
283
+ }
284
+ }
285
+ logTiming(request, turnStarted, dispatchAt, firstTokenAt, outcome) {
286
+ const now = Date.now();
287
+ log("info", "turn timing", {
288
+ backend: "sdk",
289
+ model: request.model,
290
+ sessionKey: request.sessionKey,
291
+ outcome,
292
+ startupMs: dispatchAt - turnStarted,
293
+ ttftMs: firstTokenAt ? firstTokenAt - turnStarted : undefined,
294
+ totalMs: now - turnStarted,
295
+ promptChars: request.prompt.length,
296
+ });
297
+ }
298
+ async dispose() {
299
+ this.warm?.cancel();
300
+ this.warm = undefined;
301
+ this.sessionAgents.clear();
302
+ }
303
+ }
304
+ //# sourceMappingURL=sdk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../src/backends/sdk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { AuthMaterial } from "./types.js";
2
+ export type BackendChoice = "auto" | "cli" | "sdk" | "native";
3
+ export declare function parseBackendChoice(value: string | undefined): BackendChoice;
4
+ export declare function chooseBackend(choice: BackendChoice, auth: AuthMaterial | undefined): "cli" | "sdk" | "native";
@@ -0,0 +1,15 @@
1
+ export function parseBackendChoice(value) {
2
+ if (value === "cli" || value === "sdk" || value === "native" || value === "auto")
3
+ return value;
4
+ return "auto";
5
+ }
6
+ export function chooseBackend(choice, auth) {
7
+ if (choice === "cli" || choice === "sdk" || choice === "native")
8
+ return choice;
9
+ if (auth?.kind === "native")
10
+ return "native";
11
+ if (auth?.kind === "api-key")
12
+ return "sdk";
13
+ return "cli";
14
+ }
15
+ //# sourceMappingURL=select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.js","sourceRoot":"","sources":["../../src/backends/select.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,kBAAkB,CAAC,KAAyB;IAC1D,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,KAAK,CAAA;IAC9F,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAqB,EAAE,IAA8B;IACjF,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAA;IAC9E,IAAI,IAAI,EAAE,IAAI,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAA;IAC5C,IAAI,IAAI,EAAE,IAAI,KAAK,SAAS;QAAE,OAAO,KAAK,CAAA;IAC1C,OAAO,KAAK,CAAA;AACd,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { type ChildProcess } from "node:child_process";
2
+ import type { Launch } from "../util/windows.js";
3
+ export interface Spawned {
4
+ child: ChildProcess;
5
+ lines: AsyncGenerator<string>;
6
+ stderr: () => string;
7
+ }
8
+ export declare function spawnCommand(command: string, args: string[], cwd: string, signal: AbortSignal, env?: NodeJS.ProcessEnv): Spawned;
9
+ export declare function spawnLaunch(launch: Launch, args: string[], cwd: string, signal: AbortSignal): Spawned;
10
+ export declare function collectLaunch(launch: Launch, args: string[], cwd: string): Promise<{
11
+ code: number | null;
12
+ output: string;
13
+ }>;
14
+ export declare function nodeBinary(): string;
15
+ export declare function assertNodeForSdk(version?: string): void;
@@ -0,0 +1,64 @@
1
+ import { spawn } from "node:child_process";
2
+ export function spawnCommand(command, args, cwd, signal, env = process.env) {
3
+ const child = spawn(command, args, {
4
+ cwd,
5
+ windowsHide: true,
6
+ stdio: ["ignore", "pipe", "pipe"],
7
+ env,
8
+ });
9
+ let err = "";
10
+ child.stderr?.on("data", (chunk) => {
11
+ err = (err + chunk.toString()).slice(-4000);
12
+ });
13
+ const onAbort = () => {
14
+ child.kill();
15
+ };
16
+ if (signal.aborted)
17
+ onAbort();
18
+ else
19
+ signal.addEventListener("abort", onAbort, { once: true });
20
+ child.on("close", () => signal.removeEventListener("abort", onAbort));
21
+ async function* lines() {
22
+ let buffer = "";
23
+ const stdout = child.stdout;
24
+ if (!stdout)
25
+ return;
26
+ for await (const chunk of stdout) {
27
+ buffer += chunk.toString();
28
+ const parts = buffer.split(/\r?\n/);
29
+ buffer = parts.pop() ?? "";
30
+ for (const part of parts)
31
+ yield part;
32
+ }
33
+ if (buffer.trim())
34
+ yield buffer;
35
+ }
36
+ return { child, lines: lines(), stderr: () => err };
37
+ }
38
+ export function spawnLaunch(launch, args, cwd, signal) {
39
+ return spawnCommand(launch.command, [...launch.args, ...args], cwd, signal);
40
+ }
41
+ export async function collectLaunch(launch, args, cwd) {
42
+ const { child, lines } = spawnLaunch(launch, args, cwd, new AbortController().signal);
43
+ let output = "";
44
+ for await (const line of lines)
45
+ output += `${line}\n`;
46
+ if (child.stderr) {
47
+ for await (const chunk of child.stderr)
48
+ output += chunk.toString();
49
+ }
50
+ const code = await new Promise((resolve) => child.once("close", resolve));
51
+ return { code, output };
52
+ }
53
+ export function nodeBinary() {
54
+ return process.env.CURSOR_ACP_NODE_BIN || "node";
55
+ }
56
+ export function assertNodeForSdk(version = process.version) {
57
+ const match = /^v(\d+)\.(\d+)/.exec(version);
58
+ const major = Number(match?.[1] ?? 0);
59
+ const minor = Number(match?.[2] ?? 0);
60
+ if (major < 22 || (major === 22 && minor < 13)) {
61
+ throw new Error(`The Cursor SDK backend needs Node.js 22.13 or newer (found ${version}). Set CURSOR_ACP_NODE_BIN to a newer node.`);
62
+ }
63
+ }
64
+ //# sourceMappingURL=spawn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../src/backends/spawn.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { BackendEvent } from "./types.js";
2
+ /** Turns one cursor-agent stream-json line into backend events. Malformed lines are ignored. */
3
+ export declare function parseStreamJsonLine(line: string): BackendEvent[];
4
+ export declare function parseModelList(output: string): Array<{
5
+ id: string;
6
+ name: string;
7
+ }>;
@@ -0,0 +1,106 @@
1
+ function textFromContent(content) {
2
+ if (typeof content === "string")
3
+ return content;
4
+ if (!Array.isArray(content))
5
+ return "";
6
+ return content
7
+ .map((part) => {
8
+ if (!part || typeof part !== "object")
9
+ return "";
10
+ const record = part;
11
+ if (record.type === "text" && typeof record.text === "string")
12
+ return record.text;
13
+ return "";
14
+ })
15
+ .join("");
16
+ }
17
+ function toolName(value) {
18
+ if (!value || typeof value !== "object")
19
+ return undefined;
20
+ const record = value;
21
+ if (typeof record.name === "string")
22
+ return { name: record.name, args: record.arguments ?? record.args ?? record.input };
23
+ for (const [key, entry] of Object.entries(record)) {
24
+ if (!key.endsWith("ToolCall") || !entry || typeof entry !== "object")
25
+ continue;
26
+ const call = entry;
27
+ const name = typeof call.name === "string" ? call.name : key.replace(/ToolCall$/, "");
28
+ return { name, args: call.args ?? {} };
29
+ }
30
+ return undefined;
31
+ }
32
+ /** Turns one cursor-agent stream-json line into backend events. Malformed lines are ignored. */
33
+ export function parseStreamJsonLine(line) {
34
+ const trimmed = line.trim();
35
+ if (!trimmed || trimmed.startsWith("data:"))
36
+ return [];
37
+ let parsed;
38
+ try {
39
+ parsed = JSON.parse(trimmed.startsWith("data:") ? trimmed.slice(5) : trimmed);
40
+ }
41
+ catch {
42
+ return [];
43
+ }
44
+ if (!parsed || typeof parsed !== "object")
45
+ return [];
46
+ const event = parsed;
47
+ const type = typeof event.type === "string" ? event.type : "";
48
+ if (type === "thinking" && typeof event.text === "string")
49
+ return [{ type: "reasoning", text: event.text }];
50
+ if (type === "reasoning" && typeof event.text === "string")
51
+ return [{ type: "reasoning", text: event.text }];
52
+ if (type === "assistant" || type === "text") {
53
+ const message = event.message;
54
+ const text = textFromContent(message?.content ?? event.content ?? event.text);
55
+ return text ? [{ type: "text", text }] : [];
56
+ }
57
+ if (type === "tool_call" || type === "tool_use") {
58
+ const call = toolName(event.tool_call ?? event);
59
+ if (!call)
60
+ return [];
61
+ const status = typeof event.subtype === "string" ? event.subtype : typeof event.status === "string" ? event.status : "";
62
+ if (status && !/start|running|call/i.test(status) && status !== "")
63
+ return [];
64
+ return [{
65
+ type: "tool_call",
66
+ id: typeof event.call_id === "string" ? event.call_id : typeof event.id === "string" ? event.id : `call_${call.name}`,
67
+ name: call.name,
68
+ arguments: typeof call.args === "string" ? call.args : JSON.stringify(call.args ?? {}),
69
+ }];
70
+ }
71
+ if (type === "result") {
72
+ const text = typeof event.result === "string" ? event.result : typeof event.text === "string" ? event.text : undefined;
73
+ if (event.is_error === true || event.subtype === "error") {
74
+ return [{ type: "error", message: text || "cursor-agent failed" }];
75
+ }
76
+ return [{ type: "done", text }];
77
+ }
78
+ if (type === "error") {
79
+ return [{ type: "error", message: typeof event.message === "string" ? event.message : "cursor-agent failed" }];
80
+ }
81
+ return [];
82
+ }
83
+ export function parseModelList(output) {
84
+ const models = [];
85
+ for (const line of output.split(/\r?\n/)) {
86
+ const trimmed = line.trim();
87
+ if (!trimmed || trimmed.startsWith("#") || /available models/i.test(trimmed))
88
+ continue;
89
+ try {
90
+ const parsed = JSON.parse(trimmed);
91
+ const id = parsed.id || parsed.model;
92
+ if (id) {
93
+ models.push({ id, name: parsed.name || id });
94
+ continue;
95
+ }
96
+ }
97
+ catch {
98
+ // Plain text listing.
99
+ }
100
+ const id = trimmed.split(/\s+/)[0]?.replace(/^-/, "");
101
+ if (id && /^[a-z0-9][a-z0-9._-]*$/i.test(id))
102
+ models.push({ id, name: trimmed });
103
+ }
104
+ return models;
105
+ }
106
+ //# sourceMappingURL=stream-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-json.js","sourceRoot":"","sources":["../../src/backends/stream-json.ts"],"names":[],"mappings":"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"}