@tickernelz/paperclip-pro-adapter-cursor-cloud 2026.925.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 (58) hide show
  1. package/LICENSE +22 -0
  2. package/dist/cli/format-event.d.ts +2 -0
  3. package/dist/cli/format-event.d.ts.map +1 -0
  4. package/dist/cli/format-event.js +42 -0
  5. package/dist/cli/format-event.js.map +1 -0
  6. package/dist/cli/index.d.ts +2 -0
  7. package/dist/cli/index.d.ts.map +1 -0
  8. package/dist/cli/index.js +2 -0
  9. package/dist/cli/index.js.map +1 -0
  10. package/dist/index.d.ts +4 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +34 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/server/execute.d.ts +3 -0
  15. package/dist/server/execute.d.ts.map +1 -0
  16. package/dist/server/execute.js +564 -0
  17. package/dist/server/execute.js.map +1 -0
  18. package/dist/server/execute.test.d.ts +2 -0
  19. package/dist/server/execute.test.d.ts.map +1 -0
  20. package/dist/server/execute.test.js +426 -0
  21. package/dist/server/execute.test.js.map +1 -0
  22. package/dist/server/index.d.ts +6 -0
  23. package/dist/server/index.d.ts.map +1 -0
  24. package/dist/server/index.js +68 -0
  25. package/dist/server/index.js.map +1 -0
  26. package/dist/server/session.d.ts +3 -0
  27. package/dist/server/session.d.ts.map +1 -0
  28. package/dist/server/session.js +61 -0
  29. package/dist/server/session.js.map +1 -0
  30. package/dist/server/session.test.d.ts +2 -0
  31. package/dist/server/session.test.d.ts.map +1 -0
  32. package/dist/server/session.test.js +28 -0
  33. package/dist/server/session.test.js.map +1 -0
  34. package/dist/server/test.d.ts +3 -0
  35. package/dist/server/test.d.ts.map +1 -0
  36. package/dist/server/test.js +111 -0
  37. package/dist/server/test.js.map +1 -0
  38. package/dist/ui/build-config.d.ts +3 -0
  39. package/dist/ui/build-config.d.ts.map +1 -0
  40. package/dist/ui/build-config.js +20 -0
  41. package/dist/ui/build-config.js.map +1 -0
  42. package/dist/ui/build-config.test.d.ts +2 -0
  43. package/dist/ui/build-config.test.d.ts.map +1 -0
  44. package/dist/ui/build-config.test.js +76 -0
  45. package/dist/ui/build-config.test.js.map +1 -0
  46. package/dist/ui/index.d.ts +3 -0
  47. package/dist/ui/index.d.ts.map +1 -0
  48. package/dist/ui/index.js +3 -0
  49. package/dist/ui/index.js.map +1 -0
  50. package/dist/ui/parse-stdout.d.ts +3 -0
  51. package/dist/ui/parse-stdout.d.ts.map +1 -0
  52. package/dist/ui/parse-stdout.js +173 -0
  53. package/dist/ui/parse-stdout.js.map +1 -0
  54. package/dist/ui/parse-stdout.test.d.ts +2 -0
  55. package/dist/ui/parse-stdout.test.d.ts.map +1 -0
  56. package/dist/ui/parse-stdout.test.js +119 -0
  57. package/dist/ui/parse-stdout.test.js.map +1 -0
  58. package/package.json +58 -0
@@ -0,0 +1,426 @@
1
+ import { beforeEach, describe, expect, it, vi } from "vitest";
2
+ import { execute } from "./execute.js";
3
+ const { createMock, resumeMock, getRunMock } = vi.hoisted(() => ({
4
+ createMock: vi.fn(),
5
+ resumeMock: vi.fn(),
6
+ getRunMock: vi.fn(),
7
+ }));
8
+ vi.mock("@cursor/sdk", () => ({
9
+ Agent: {
10
+ create: createMock,
11
+ resume: resumeMock,
12
+ getRun: getRunMock,
13
+ },
14
+ }));
15
+ function createMockRun(options = {}) {
16
+ const runId = options.id ?? "run-123";
17
+ const agentId = options.agentId ?? "agent-123";
18
+ const status = options.status ?? "finished";
19
+ const waitResult = options.waitResult ?? {
20
+ id: runId,
21
+ status,
22
+ result: "Done\nWith detail",
23
+ model: { id: "gpt-5.4" },
24
+ durationMs: 1234,
25
+ };
26
+ const streamMessages = options.streamMessages ?? [];
27
+ const streamError = options.streamError ?? null;
28
+ return {
29
+ id: runId,
30
+ agentId,
31
+ status,
32
+ result: typeof waitResult.result === "string" ? waitResult.result : null,
33
+ model: waitResult.model ?? null,
34
+ durationMs: waitResult.durationMs ?? null,
35
+ git: waitResult.git ?? null,
36
+ supports(capability) {
37
+ return capability === "stream" || capability === "wait";
38
+ },
39
+ async *stream() {
40
+ for (const message of streamMessages)
41
+ yield message;
42
+ if (streamError)
43
+ throw streamError;
44
+ },
45
+ async wait() {
46
+ return waitResult;
47
+ },
48
+ };
49
+ }
50
+ function createMockSdkAgent(options = {}) {
51
+ const sendRun = options.sendRun ?? createMockRun();
52
+ return {
53
+ agentId: options.agentId ?? sendRun.agentId,
54
+ send: vi.fn(async (_prompt, _options) => sendRun),
55
+ [Symbol.asyncDispose]: vi.fn(async () => { }),
56
+ };
57
+ }
58
+ function createContext(overrides = {}) {
59
+ const logs = [];
60
+ const meta = [];
61
+ const agent = overrides.agent ?? {
62
+ id: "agent-1",
63
+ companyId: "company-1",
64
+ name: "Cursor Cloud Agent",
65
+ adapterType: "cursor_cloud",
66
+ adapterConfig: {},
67
+ };
68
+ const runtime = overrides.runtime ?? {
69
+ sessionId: null,
70
+ sessionParams: null,
71
+ sessionDisplayId: null,
72
+ taskKey: null,
73
+ };
74
+ const config = overrides.config ?? {
75
+ env: {
76
+ CURSOR_API_KEY: "cursor-secret",
77
+ EXTRA_FLAG: "1",
78
+ },
79
+ repoUrl: "https://github.com/paperclipai/paperclip.git",
80
+ repoStartingRef: "main",
81
+ runtimeEnvType: "cloud",
82
+ promptTemplate: "Do the work for {{agent.name}}",
83
+ model: "gpt-5.4",
84
+ };
85
+ const context = overrides.context ?? {
86
+ taskId: "issue-1",
87
+ issueId: "issue-1",
88
+ wakeReason: "issue_commented",
89
+ };
90
+ const base = {
91
+ runId: "run-heartbeat-1",
92
+ agent,
93
+ runtime,
94
+ config,
95
+ context,
96
+ authToken: "paperclip-run-jwt",
97
+ onLog: async (stream, chunk) => {
98
+ logs.push({ stream, chunk });
99
+ },
100
+ onMeta: async (entry) => {
101
+ meta.push(entry);
102
+ },
103
+ };
104
+ return {
105
+ ...base,
106
+ ...overrides,
107
+ logs,
108
+ meta,
109
+ };
110
+ }
111
+ describe("cursor_cloud execute", () => {
112
+ beforeEach(() => {
113
+ createMock.mockReset();
114
+ resumeMock.mockReset();
115
+ getRunMock.mockReset();
116
+ });
117
+ it.each([false, true])("sends the central chat directive to Cursor Cloud (custom=%s)", async (custom) => {
118
+ const sdkAgent = createMockSdkAgent();
119
+ createMock.mockResolvedValue(sdkAgent);
120
+ const ctx = createContext();
121
+ if (!custom)
122
+ delete ctx.config.promptTemplate;
123
+ const directive = "Chat directive: clarify goals and hand plans off to project tasks.";
124
+ ctx.context = {
125
+ ...ctx.context,
126
+ conversationMode: true,
127
+ paperclipTaskMarkdown: directive,
128
+ paperclipWake: {
129
+ reason: "issue_commented",
130
+ issue: { id: "issue-1", workMode: "planning", status: "in_progress" },
131
+ interactionKind: "request_confirmation",
132
+ interactionStatus: "accepted",
133
+ },
134
+ };
135
+ const result = await execute(ctx);
136
+ expect(result.exitCode).toBe(0);
137
+ const prompt = String(sdkAgent.send.mock.calls[0]?.[0]);
138
+ expect(prompt).toContain(directive);
139
+ expect(prompt).toContain(custom ? "Do the work for" : "Continue your Paperclip conversation");
140
+ expect(prompt).not.toContain("Execution contract:");
141
+ expect(prompt).not.toContain("Create child issues");
142
+ });
143
+ it("delivers a large wake through the SDK prompt without a configured JSON env copy", async () => {
144
+ const sdkAgent = createMockSdkAgent();
145
+ createMock.mockResolvedValue(sdkAgent);
146
+ const ctx = createContext();
147
+ const description = "start " + "context ".repeat(25_000) + " end";
148
+ ctx.config.env = { CURSOR_API_KEY: "cursor-secret", PAPERCLIP_WAKE_PAYLOAD_JSON: description };
149
+ ctx.context.paperclipWake = {
150
+ reason: "issue_assigned",
151
+ issue: { id: "issue-1", description },
152
+ };
153
+ const result = await execute(ctx);
154
+ expect(result.exitCode).toBe(0);
155
+ expect(createMock.mock.calls[0]?.[0]?.cloud?.envVars).not.toHaveProperty("PAPERCLIP_WAKE_PAYLOAD_JSON");
156
+ expect(sdkAgent.send.mock.calls[0]?.[0]).toContain(description);
157
+ });
158
+ it("creates a fresh Cursor agent and injects Paperclip env without CURSOR_API_KEY", async () => {
159
+ const run = createMockRun({
160
+ agentId: "agent-fresh",
161
+ streamMessages: [
162
+ {
163
+ type: "assistant",
164
+ message: {
165
+ content: [{ type: "text", text: "Working" }],
166
+ },
167
+ },
168
+ ],
169
+ });
170
+ const sdkAgent = createMockSdkAgent({ agentId: "agent-fresh", sendRun: run });
171
+ createMock.mockResolvedValue(sdkAgent);
172
+ const ctx = createContext();
173
+ const result = await execute(ctx);
174
+ expect(createMock).toHaveBeenCalledTimes(1);
175
+ expect(resumeMock).not.toHaveBeenCalled();
176
+ expect(getRunMock).not.toHaveBeenCalled();
177
+ expect(createMock.mock.calls[0]?.[0]).toMatchObject({
178
+ apiKey: "cursor-secret",
179
+ name: "Paperclip Cursor Cloud Agent",
180
+ model: { id: "gpt-5.4" },
181
+ cloud: {
182
+ env: { type: "cloud" },
183
+ repos: [{ url: "https://github.com/paperclipai/paperclip.git", startingRef: "main" }],
184
+ },
185
+ });
186
+ expect(createMock.mock.calls[0]?.[0]?.cloud?.envVars).toMatchObject({
187
+ EXTRA_FLAG: "1",
188
+ PAPERCLIP_RUN_ID: "run-heartbeat-1",
189
+ PAPERCLIP_TASK_ID: "issue-1",
190
+ PAPERCLIP_WAKE_REASON: "issue_commented",
191
+ PAPERCLIP_API_KEY: "paperclip-run-jwt",
192
+ });
193
+ // When a run JWT is present the callback URL is retained so the worker can
194
+ // authenticate its Paperclip API calls.
195
+ expect(createMock.mock.calls[0]?.[0]?.cloud?.envVars).toHaveProperty("PAPERCLIP_API_URL");
196
+ expect(createMock.mock.calls[0]?.[0]?.cloud?.envVars).not.toHaveProperty("CURSOR_API_KEY");
197
+ expect(result).toMatchObject({
198
+ exitCode: 0,
199
+ errorMessage: null,
200
+ sessionId: "agent-fresh",
201
+ model: "gpt-5.4",
202
+ summary: "Done",
203
+ sessionParams: {
204
+ cursorAgentId: "agent-fresh",
205
+ latestRunId: "run-123",
206
+ runtime: "cloud",
207
+ envType: "cloud",
208
+ repos: [{ url: "https://github.com/paperclipai/paperclip.git", startingRef: "main" }],
209
+ },
210
+ });
211
+ expect(ctx.logs.map((entry) => entry.chunk)).toEqual(expect.arrayContaining([
212
+ expect.stringContaining('"type":"cursor_cloud.init"'),
213
+ expect.stringContaining('"type":"cursor_cloud.message"'),
214
+ expect.stringContaining('"type":"cursor_cloud.result"'),
215
+ ]));
216
+ });
217
+ it("omits empty environment values while preserving nonempty values exactly", async () => {
218
+ createMock.mockResolvedValue(createMockSdkAgent());
219
+ const ctx = createContext();
220
+ ctx.config.env = {
221
+ CURSOR_API_KEY: "cursor-secret",
222
+ GH_TOKEN: "",
223
+ GITHUB_TOKEN: "",
224
+ GIT_AUTHOR_NAME: "",
225
+ SSH_AUTH_SOCK: "",
226
+ EMPTY_PLAIN: { type: "plain", value: "" },
227
+ EXTRA_FLAG: "0",
228
+ PADDED_VALUE: " retain whitespace ",
229
+ };
230
+ await execute(ctx);
231
+ const env = createMock.mock.calls[0]?.[0]?.cloud?.envVars;
232
+ expect(env).not.toHaveProperty("GH_TOKEN");
233
+ expect(env).not.toHaveProperty("GITHUB_TOKEN");
234
+ expect(env).not.toHaveProperty("GIT_AUTHOR_NAME");
235
+ expect(env).not.toHaveProperty("SSH_AUTH_SOCK");
236
+ expect(env).not.toHaveProperty("EMPTY_PLAIN");
237
+ expect(env).not.toHaveProperty("CURSOR_API_KEY");
238
+ expect(env).toMatchObject({ EXTRA_FLAG: "0", PADDED_VALUE: " retain whitespace " });
239
+ expect(Object.values(env).every((value) => value !== "")).toBe(true);
240
+ });
241
+ it("reports dispatch before starting the first remote SDK operation", async () => {
242
+ const run = createMockRun({ agentId: "agent-dispatch" });
243
+ const sdkAgent = createMockSdkAgent({ agentId: "agent-dispatch", sendRun: run });
244
+ createMock.mockResolvedValue(sdkAgent);
245
+ const onDispatch = vi.fn();
246
+ await execute(createContext({ onDispatch }));
247
+ expect(onDispatch).toHaveBeenCalledTimes(1);
248
+ expect(onDispatch.mock.invocationCallOrder[0]).toBeLessThan(createMock.mock.invocationCallOrder[0]);
249
+ });
250
+ it("omits the Paperclip API callback when no run JWT is issued (remote worker cannot call home)", async () => {
251
+ const run = createMockRun({ agentId: "agent-no-jwt" });
252
+ const sdkAgent = createMockSdkAgent({ agentId: "agent-no-jwt", sendRun: run });
253
+ createMock.mockResolvedValue(sdkAgent);
254
+ // cursor_cloud is registered with supportsLocalAgentJwt=false, so heartbeat
255
+ // passes no authToken. A remote cloud worker must not receive a callback URL
256
+ // it can neither reach nor authenticate against (the source of 401 noise).
257
+ const ctx = createContext({ authToken: undefined });
258
+ await execute(ctx);
259
+ const envVars = (createMock.mock.calls[0]?.[0]?.cloud?.envVars ?? {});
260
+ expect(envVars).not.toHaveProperty("PAPERCLIP_API_KEY");
261
+ expect(envVars).not.toHaveProperty("PAPERCLIP_API_URL");
262
+ expect(envVars).not.toHaveProperty("PAPERCLIP_API_BRIDGE_MODE");
263
+ // Informational Paperclip env (non-credential) still flows through.
264
+ expect(envVars).toMatchObject({
265
+ PAPERCLIP_RUN_ID: "run-heartbeat-1",
266
+ PAPERCLIP_AGENT_ID: "agent-1",
267
+ PAPERCLIP_COMPANY_ID: "company-1",
268
+ });
269
+ });
270
+ it("resumes a matching saved session when no active run can be reattached", async () => {
271
+ getRunMock.mockResolvedValue(createMockRun({ status: "finished" }));
272
+ const resumedRun = createMockRun({ id: "run-resumed", agentId: "agent-resumed" });
273
+ const sdkAgent = createMockSdkAgent({ agentId: "agent-resumed", sendRun: resumedRun });
274
+ resumeMock.mockResolvedValue(sdkAgent);
275
+ const ctx = createContext({
276
+ runtime: {
277
+ sessionId: null,
278
+ sessionDisplayId: "agent-previous",
279
+ taskKey: null,
280
+ sessionParams: {
281
+ cursorAgentId: "agent-previous",
282
+ latestRunId: "run-previous",
283
+ runtime: "cloud",
284
+ envType: "cloud",
285
+ repos: [{ url: "https://github.com/paperclipai/paperclip.git", startingRef: "main" }],
286
+ },
287
+ },
288
+ });
289
+ const result = await execute(ctx);
290
+ expect(getRunMock).toHaveBeenCalledWith("run-previous", {
291
+ runtime: "cloud",
292
+ agentId: "agent-previous",
293
+ apiKey: "cursor-secret",
294
+ });
295
+ expect(resumeMock).toHaveBeenCalledTimes(1);
296
+ expect(createMock).not.toHaveBeenCalled();
297
+ expect(sdkAgent.send).toHaveBeenCalledTimes(1);
298
+ expect(result.sessionId).toBe("agent-resumed");
299
+ });
300
+ it("reattaches to an active run, drains it, then sends the heartbeat as a follow-up", async () => {
301
+ const attachedRun = createMockRun({
302
+ id: "run-attached",
303
+ agentId: "agent-attached",
304
+ status: "running",
305
+ waitResult: {
306
+ id: "run-attached",
307
+ status: "finished",
308
+ result: "Prior result",
309
+ model: { id: "gpt-5.4" },
310
+ },
311
+ streamMessages: [
312
+ {
313
+ type: "status",
314
+ status: "running",
315
+ message: "Still working",
316
+ },
317
+ ],
318
+ });
319
+ getRunMock.mockResolvedValue(attachedRun);
320
+ const followUpRun = createMockRun({
321
+ id: "run-followup",
322
+ agentId: "agent-attached",
323
+ waitResult: {
324
+ id: "run-followup",
325
+ status: "finished",
326
+ result: "Follow-up result",
327
+ model: { id: "gpt-5.4" },
328
+ },
329
+ });
330
+ const sdkAgent = createMockSdkAgent({ agentId: "agent-attached", sendRun: followUpRun });
331
+ resumeMock.mockResolvedValue(sdkAgent);
332
+ const ctx = createContext({
333
+ runtime: {
334
+ sessionId: null,
335
+ sessionDisplayId: "agent-attached",
336
+ taskKey: null,
337
+ sessionParams: {
338
+ cursorAgentId: "agent-attached",
339
+ latestRunId: "run-attached",
340
+ runtime: "cloud",
341
+ envType: "cloud",
342
+ repos: [{ url: "https://github.com/paperclipai/paperclip.git", startingRef: "main" }],
343
+ },
344
+ },
345
+ });
346
+ const result = await execute(ctx);
347
+ expect(getRunMock).toHaveBeenCalledTimes(1);
348
+ expect(createMock).not.toHaveBeenCalled();
349
+ expect(resumeMock).toHaveBeenCalledTimes(1);
350
+ expect(sdkAgent.send).toHaveBeenCalledTimes(1);
351
+ expect(result).toMatchObject({
352
+ exitCode: 0,
353
+ sessionId: "agent-attached",
354
+ summary: "Follow-up result",
355
+ resultJson: {
356
+ cursorRunId: "run-followup",
357
+ },
358
+ });
359
+ const logChunks = ctx.logs.map((entry) => entry.chunk);
360
+ expect(logChunks).toEqual(expect.arrayContaining([
361
+ expect.stringContaining("Reattached to existing Cursor run run-attached."),
362
+ expect.stringContaining("Prior Cursor run run-attached finished"),
363
+ expect.stringContaining("Started Cursor run run-followup."),
364
+ expect.stringContaining('"runId":"run-attached"'),
365
+ expect.stringContaining('"runId":"run-followup"'),
366
+ ]));
367
+ expect(ctx.meta[0]?.context).toMatchObject({
368
+ cursorCloud: {
369
+ canReuseSession: true,
370
+ repoUrl: "https://github.com/paperclipai/paperclip.git",
371
+ },
372
+ });
373
+ });
374
+ it("explains a rejected Cursor default without silently choosing another model", async () => {
375
+ const sdkAgent = createMockSdkAgent();
376
+ sdkAgent.send.mockRejectedValue(new Error("[invalid_model] Model 'gpt-5' is not available or invalid."));
377
+ createMock.mockResolvedValue(sdkAgent);
378
+ const ctx = createContext();
379
+ delete ctx.config.model;
380
+ const result = await execute(ctx);
381
+ expect(createMock.mock.calls[0]?.[0]).not.toHaveProperty("model");
382
+ expect(sdkAgent.send).toHaveBeenCalledWith(expect.any(String), {});
383
+ expect(result.exitCode).toBe(1);
384
+ expect(result.errorMessage).toContain("Cursor rejected its configured default model");
385
+ expect(result.errorMessage).toContain("https://cursor.com/dashboard/cloud-agents");
386
+ expect(sdkAgent.send).toHaveBeenCalledTimes(1);
387
+ });
388
+ it("makes Cursor repository setup failures actionable without launching another run", async () => {
389
+ const sdkAgent = createMockSdkAgent();
390
+ sdkAgent.send.mockRejectedValue(new Error("[validation_error] Failed to determine repository default branch"));
391
+ createMock.mockResolvedValue(sdkAgent);
392
+ const result = await execute(createContext());
393
+ expect(result.exitCode).toBe(1);
394
+ expect(result.errorMessage).toContain("Cursor's GitHub integration can access https://github.com/paperclipai/paperclip.git");
395
+ expect(result.errorMessage).toContain("https://cursor.com/dashboard/cloud-agents");
396
+ expect(sdkAgent.send).toHaveBeenCalledTimes(1);
397
+ });
398
+ it("maps non-finished Cursor results to failing Paperclip runs", async () => {
399
+ const cancelledRun = createMockRun({
400
+ id: "run-cancelled",
401
+ agentId: "agent-cancelled",
402
+ status: "cancelled",
403
+ waitResult: {
404
+ id: "run-cancelled",
405
+ status: "cancelled",
406
+ result: "",
407
+ model: { id: "gpt-5.4" },
408
+ },
409
+ });
410
+ const sdkAgent = createMockSdkAgent({ agentId: "agent-cancelled", sendRun: cancelledRun });
411
+ createMock.mockResolvedValue(sdkAgent);
412
+ const ctx = createContext();
413
+ const result = await execute(ctx);
414
+ expect(result).toMatchObject({
415
+ exitCode: 1,
416
+ errorMessage: "Cursor run cancelled",
417
+ sessionId: "agent-cancelled",
418
+ resultJson: {
419
+ status: "cancelled",
420
+ cursorAgentId: "agent-cancelled",
421
+ cursorRunId: "run-cancelled",
422
+ },
423
+ });
424
+ });
425
+ });
426
+ //# sourceMappingURL=execute.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute.test.js","sourceRoot":"","sources":["../../src/server/execute.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { execute } from "./execute.js";
2
+ export { testEnvironment } from "./test.js";
3
+ export { sessionCodec } from "./session.js";
4
+ import type { AdapterConfigSchema } from "@tickernelz/paperclip-pro-adapter-utils";
5
+ export declare function getConfigSchema(): AdapterConfigSchema;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AAEnF,wBAAgB,eAAe,IAAI,mBAAmB,CA+DrD"}
@@ -0,0 +1,68 @@
1
+ export { execute } from "./execute.js";
2
+ export { testEnvironment } from "./test.js";
3
+ export { sessionCodec } from "./session.js";
4
+ export function getConfigSchema() {
5
+ return {
6
+ fields: [
7
+ {
8
+ key: "repoUrl",
9
+ label: "Repository URL",
10
+ type: "text",
11
+ required: true,
12
+ hint: "Git repository URL Cursor should open for this agent.",
13
+ },
14
+ {
15
+ key: "repoStartingRef",
16
+ label: "Starting ref",
17
+ type: "text",
18
+ hint: "Optional branch, tag, or SHA Cursor should start from.",
19
+ },
20
+ {
21
+ key: "repoPullRequestUrl",
22
+ label: "Pull request URL",
23
+ type: "text",
24
+ hint: "Optional PR URL when attaching the agent to an existing review branch.",
25
+ },
26
+ {
27
+ key: "runtimeEnvType",
28
+ label: "Cursor runtime",
29
+ type: "select",
30
+ default: "cloud",
31
+ options: [
32
+ { value: "cloud", label: "Cursor hosted" },
33
+ { value: "pool", label: "Self-hosted pool" },
34
+ { value: "machine", label: "Named machine" },
35
+ ],
36
+ hint: "Choose where Cursor should execute the remote agent.",
37
+ },
38
+ {
39
+ key: "runtimeEnvName",
40
+ label: "Runtime name",
41
+ type: "text",
42
+ hint: "Optional pool or machine name when targeting a non-default runtime.",
43
+ },
44
+ {
45
+ key: "workOnCurrentBranch",
46
+ label: "Work on current branch",
47
+ type: "toggle",
48
+ default: false,
49
+ hint: "Tell Cursor to continue on the current branch instead of making a new one.",
50
+ },
51
+ {
52
+ key: "autoCreatePR",
53
+ label: "Auto-create PR",
54
+ type: "toggle",
55
+ default: false,
56
+ hint: "Allow Cursor to automatically create a pull request for the work.",
57
+ },
58
+ {
59
+ key: "skipReviewerRequest",
60
+ label: "Skip reviewer request",
61
+ type: "toggle",
62
+ default: false,
63
+ hint: "Suppress reviewer requests on auto-created pull requests.",
64
+ },
65
+ ],
66
+ };
67
+ }
68
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAI5C,MAAM,UAAU,eAAe;IAC7B,OAAO;QACL,MAAM,EAAE;YACN;gBACE,GAAG,EAAE,SAAS;gBACd,KAAK,EAAE,gBAAgB;gBACvB,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,IAAI;gBACd,IAAI,EAAE,uDAAuD;aAC9D;YACD;gBACE,GAAG,EAAE,iBAAiB;gBACtB,KAAK,EAAE,cAAc;gBACrB,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,wDAAwD;aAC/D;YACD;gBACE,GAAG,EAAE,oBAAoB;gBACzB,KAAK,EAAE,kBAAkB;gBACzB,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,wEAAwE;aAC/E;YACD;gBACE,GAAG,EAAE,gBAAgB;gBACrB,KAAK,EAAE,gBAAgB;gBACvB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,OAAO;gBAChB,OAAO,EAAE;oBACP,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE;oBAC1C,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,EAAE;oBAC5C,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,eAAe,EAAE;iBAC7C;gBACD,IAAI,EAAE,sDAAsD;aAC7D;YACD;gBACE,GAAG,EAAE,gBAAgB;gBACrB,KAAK,EAAE,cAAc;gBACrB,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,qEAAqE;aAC5E;YACD;gBACE,GAAG,EAAE,qBAAqB;gBAC1B,KAAK,EAAE,wBAAwB;gBAC/B,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,4EAA4E;aACnF;YACD;gBACE,GAAG,EAAE,cAAc;gBACnB,KAAK,EAAE,gBAAgB;gBACvB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,mEAAmE;aAC1E;YACD;gBACE,GAAG,EAAE,qBAAqB;gBAC1B,KAAK,EAAE,uBAAuB;gBAC9B,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,2DAA2D;aAClE;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { AdapterSessionCodec } from "@tickernelz/paperclip-pro-adapter-utils";
2
+ export declare const sessionCodec: AdapterSessionCodec;
3
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/server/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AAqDnF,eAAO,MAAM,YAAY,EAAE,mBAO1B,CAAC"}
@@ -0,0 +1,61 @@
1
+ function asRecord(value) {
2
+ if (typeof value !== "object" || value === null || Array.isArray(value))
3
+ return null;
4
+ return value;
5
+ }
6
+ function readString(value) {
7
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
8
+ }
9
+ function readRepos(value) {
10
+ if (!Array.isArray(value))
11
+ return [];
12
+ const repos = [];
13
+ for (const entry of value) {
14
+ const repo = asRecord(entry);
15
+ if (!repo)
16
+ continue;
17
+ const url = readString(repo.url);
18
+ if (!url)
19
+ continue;
20
+ const startingRef = readString(repo.startingRef);
21
+ const prUrl = readString(repo.prUrl);
22
+ repos.push({
23
+ url,
24
+ ...(startingRef ? { startingRef } : {}),
25
+ ...(prUrl ? { prUrl } : {}),
26
+ });
27
+ }
28
+ return repos;
29
+ }
30
+ function normalize(raw) {
31
+ const record = asRecord(raw);
32
+ if (!record)
33
+ return null;
34
+ const cursorAgentId = readString(record.cursorAgentId) ??
35
+ readString(record.agentId) ??
36
+ readString(record.sessionId);
37
+ if (!cursorAgentId)
38
+ return null;
39
+ const latestRunId = readString(record.latestRunId) ?? readString(record.runId);
40
+ const runtime = readString(record.runtime) ?? "cloud";
41
+ const envType = readString(record.envType);
42
+ const envName = readString(record.envName);
43
+ const repos = readRepos(record.repos);
44
+ return {
45
+ cursorAgentId,
46
+ ...(latestRunId ? { latestRunId } : {}),
47
+ runtime,
48
+ ...(envType ? { envType } : {}),
49
+ ...(envName ? { envName } : {}),
50
+ ...(repos.length > 0 ? { repos } : {}),
51
+ };
52
+ }
53
+ export const sessionCodec = {
54
+ deserialize: normalize,
55
+ serialize: normalize,
56
+ getDisplayId(params) {
57
+ const normalized = normalize(params);
58
+ return normalized ? String(normalized.cursorAgentId) : null;
59
+ },
60
+ };
61
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/server/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=session.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.test.d.ts","sourceRoot":"","sources":["../../src/server/session.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,28 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { sessionCodec } from "./session.js";
3
+ describe("cursorCloud sessionCodec", () => {
4
+ it("normalizes legacy and current session identifiers", () => {
5
+ expect(sessionCodec.deserialize({
6
+ agentId: "agent-123",
7
+ runId: "run-456",
8
+ envType: "pool",
9
+ envName: "trusted",
10
+ repos: [{ url: "https://github.com/paperclipai/paperclip.git", startingRef: "main" }],
11
+ })).toEqual({
12
+ cursorAgentId: "agent-123",
13
+ latestRunId: "run-456",
14
+ runtime: "cloud",
15
+ envType: "pool",
16
+ envName: "trusted",
17
+ repos: [{ url: "https://github.com/paperclipai/paperclip.git", startingRef: "main" }],
18
+ });
19
+ });
20
+ it("drops invalid session payloads and exposes the display id", () => {
21
+ expect(sessionCodec.deserialize({ latestRunId: "run-1" })).toBeNull();
22
+ expect(sessionCodec.getDisplayId?.({
23
+ cursorAgentId: "agent-789",
24
+ latestRunId: "run-101",
25
+ })).toBe("agent-789");
26
+ });
27
+ });
28
+ //# sourceMappingURL=session.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.test.js","sourceRoot":"","sources":["../../src/server/session.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,CACJ,YAAY,CAAC,WAAW,CAAC;YACvB,OAAO,EAAE,WAAW;YACpB,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,MAAM;YACf,OAAO,EAAE,SAAS;YAClB,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,8CAA8C,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;SACtF,CAAC,CACH,CAAC,OAAO,CAAC;YACR,aAAa,EAAE,WAAW;YAC1B,WAAW,EAAE,SAAS;YACtB,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE,MAAM;YACf,OAAO,EAAE,SAAS;YAClB,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,8CAA8C,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;SACtF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACtE,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC;YACjC,aAAa,EAAE,WAAW;YAC1B,WAAW,EAAE,SAAS;SACvB,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}