cursor-agent-a2a 1.0.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.
@@ -0,0 +1,486 @@
1
+ /**
2
+ * Unit tests for cursorAgent.ts - Cursor Agent A2A Routes
3
+ *
4
+ * Tests cover:
5
+ * - Homepage endpoint
6
+ * - Agent Card discovery
7
+ * - Message endpoints (sync and streaming)
8
+ * - Task management (create, query, cancel)
9
+ * - Authentication
10
+ * - Session management
11
+ * - Webhook callbacks
12
+ */
13
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
14
+ import express from 'express';
15
+ import request from 'supertest';
16
+ import cursorAgentRouter from '../cursorAgent.js';
17
+ // Mock the cursor agent service
18
+ vi.mock('../../services/cursorAgentService.js', () => ({
19
+ generateCursorAgentCard: vi.fn().mockReturnValue({
20
+ name: 'Cursor Agent',
21
+ description: 'AI-powered code assistant via Cursor CLI',
22
+ version: '1.0.0',
23
+ url: 'http://localhost:4300',
24
+ skills: [
25
+ {
26
+ name: 'code_generation',
27
+ description: 'Generate and modify code files',
28
+ inputSchema: { type: 'object' },
29
+ outputSchema: { type: 'object' },
30
+ },
31
+ ],
32
+ securitySchemes: [
33
+ {
34
+ type: 'apiKey',
35
+ in: 'header',
36
+ name: 'Authorization',
37
+ scheme: 'bearer',
38
+ },
39
+ ],
40
+ context: {
41
+ a2aAgentId: 'cursor-agent',
42
+ projectId: 'cursor-agent',
43
+ projectName: 'Cursor Agent',
44
+ workingDirectory: process.cwd(),
45
+ agentType: 'cursor-agent',
46
+ agentCategory: 'builtin',
47
+ },
48
+ }),
49
+ executeCursorAgent: vi.fn().mockResolvedValue({
50
+ success: true,
51
+ response: 'Test response',
52
+ sessionId: 'test-session-id',
53
+ metadata: {
54
+ processingTimeMs: 1000,
55
+ },
56
+ }),
57
+ executeCursorAgentStream: vi.fn().mockImplementation(async (message, config, onEvent) => {
58
+ // Simulate streaming events
59
+ onEvent({
60
+ type: 'message',
61
+ content: 'Streaming response',
62
+ sessionId: 'test-session-id',
63
+ timestamp: Date.now(),
64
+ });
65
+ onEvent({
66
+ type: 'result',
67
+ sessionId: 'test-session-id',
68
+ timestamp: Date.now(),
69
+ });
70
+ return { sessionId: 'test-session-id' };
71
+ }),
72
+ }));
73
+ describe('Cursor Agent A2A Routes', () => {
74
+ let app;
75
+ const VALID_API_KEY = process.env.CURSOR_AGENT_API_KEY || 'cursor-agent-demo-key';
76
+ beforeEach(() => {
77
+ vi.clearAllMocks();
78
+ app = express();
79
+ app.use(express.json());
80
+ app.use('/', cursorAgentRouter);
81
+ });
82
+ afterEach(() => {
83
+ vi.clearAllMocks();
84
+ });
85
+ // ============================================================================
86
+ // GET / - Homepage
87
+ // ============================================================================
88
+ describe('GET /', () => {
89
+ it('should return HTML homepage with 200 status', async () => {
90
+ const response = await request(app).get('/').expect(200);
91
+ expect(response.headers['content-type']).toMatch(/text\/html/);
92
+ expect(response.text).toContain('Cursor Agent A2A Service');
93
+ expect(response.text).toContain('Agent Card');
94
+ });
95
+ it('should display agent card information', async () => {
96
+ const response = await request(app).get('/').expect(200);
97
+ expect(response.text).toContain('Cursor Agent');
98
+ expect(response.text).toContain('Skills');
99
+ });
100
+ it('should include API endpoint documentation', async () => {
101
+ const response = await request(app).get('/').expect(200);
102
+ expect(response.text).toContain('/messages');
103
+ expect(response.text).toContain('/tasks');
104
+ expect(response.text).toContain('curl');
105
+ });
106
+ });
107
+ // ============================================================================
108
+ // GET /.well-known/agent-card.json - Agent Card Discovery
109
+ // ============================================================================
110
+ describe('GET /.well-known/agent-card.json', () => {
111
+ it('should return agent card with 200 status', async () => {
112
+ const response = await request(app)
113
+ .get('/.well-known/agent-card.json')
114
+ .expect(200);
115
+ expect(response.body).toHaveProperty('name', 'Cursor Agent');
116
+ expect(response.body).toHaveProperty('description');
117
+ expect(response.body).toHaveProperty('version', '1.0.0');
118
+ expect(response.body).toHaveProperty('url');
119
+ expect(response.body).toHaveProperty('skills');
120
+ expect(response.body).toHaveProperty('securitySchemes');
121
+ expect(response.body).toHaveProperty('context');
122
+ });
123
+ it('should include correct context information', async () => {
124
+ const response = await request(app)
125
+ .get('/.well-known/agent-card.json')
126
+ .expect(200);
127
+ expect(response.body.context).toMatchObject({
128
+ a2aAgentId: 'cursor-agent',
129
+ agentType: 'cursor-agent',
130
+ agentCategory: 'builtin',
131
+ });
132
+ });
133
+ it('should include security schemes', async () => {
134
+ const response = await request(app)
135
+ .get('/.well-known/agent-card.json')
136
+ .expect(200);
137
+ expect(response.body.securitySchemes).toBeInstanceOf(Array);
138
+ expect(response.body.securitySchemes[0]).toMatchObject({
139
+ type: 'apiKey',
140
+ in: 'header',
141
+ name: 'Authorization',
142
+ scheme: 'bearer',
143
+ });
144
+ });
145
+ });
146
+ // ============================================================================
147
+ // POST /messages - Synchronous Message
148
+ // ============================================================================
149
+ describe('POST /messages', () => {
150
+ it('should require authentication', async () => {
151
+ const response = await request(app)
152
+ .post('/messages')
153
+ .send({ message: 'test' })
154
+ .expect(401);
155
+ expect(response.body).toHaveProperty('error');
156
+ expect(response.body.code).toBe('UNAUTHORIZED');
157
+ });
158
+ it('should reject invalid API key', async () => {
159
+ const response = await request(app)
160
+ .post('/messages')
161
+ .set('Authorization', 'Bearer invalid-key')
162
+ .send({ message: 'test' })
163
+ .expect(401);
164
+ expect(response.body.code).toBe('INVALID_API_KEY');
165
+ });
166
+ it('should require message field', async () => {
167
+ const response = await request(app)
168
+ .post('/messages')
169
+ .set('Authorization', `Bearer ${VALID_API_KEY}`)
170
+ .send({})
171
+ .expect(400);
172
+ expect(response.body.code).toBe('VALIDATION_ERROR');
173
+ });
174
+ it('should process message successfully', async () => {
175
+ const response = await request(app)
176
+ .post('/messages')
177
+ .set('Authorization', `Bearer ${VALID_API_KEY}`)
178
+ .send({
179
+ message: 'Say hello',
180
+ workspace: '/test/workspace',
181
+ })
182
+ .expect(200);
183
+ expect(response.body).toHaveProperty('response');
184
+ expect(response.body).toHaveProperty('sessionId');
185
+ expect(response.body).toHaveProperty('metadata');
186
+ expect(response.body.metadata).toHaveProperty('processingTimeMs');
187
+ });
188
+ it('should handle session continuation', async () => {
189
+ // First message to create session
190
+ const firstResponse = await request(app)
191
+ .post('/messages')
192
+ .set('Authorization', `Bearer ${VALID_API_KEY}`)
193
+ .send({
194
+ message: 'First message',
195
+ workspace: '/test/workspace',
196
+ })
197
+ .expect(200);
198
+ const sessionId = firstResponse.body.sessionId;
199
+ // Second message with sessionId
200
+ const secondResponse = await request(app)
201
+ .post('/messages')
202
+ .set('Authorization', `Bearer ${VALID_API_KEY}`)
203
+ .send({
204
+ message: 'Second message',
205
+ sessionId,
206
+ })
207
+ .expect(200);
208
+ expect(secondResponse.body.sessionId).toBe(sessionId);
209
+ });
210
+ it('should use current directory if no workspace provided', async () => {
211
+ const response = await request(app)
212
+ .post('/messages')
213
+ .set('Authorization', `Bearer ${VALID_API_KEY}`)
214
+ .send({
215
+ message: 'Test message',
216
+ })
217
+ .expect(200);
218
+ expect(response.body).toHaveProperty('response');
219
+ });
220
+ it('should handle execution errors', async () => {
221
+ const { executeCursorAgent } = await import('../../services/cursorAgentService.js');
222
+ vi.mocked(executeCursorAgent).mockResolvedValueOnce({
223
+ success: false,
224
+ error: 'Execution failed',
225
+ metadata: { processingTimeMs: 100 },
226
+ });
227
+ const response = await request(app)
228
+ .post('/messages')
229
+ .set('Authorization', `Bearer ${VALID_API_KEY}`)
230
+ .send({
231
+ message: 'Failing message',
232
+ workspace: '/test/workspace',
233
+ })
234
+ .expect(500);
235
+ expect(response.body.code).toBe('EXECUTION_ERROR');
236
+ });
237
+ it('should handle session not found error', async () => {
238
+ const response = await request(app)
239
+ .post('/messages')
240
+ .set('Authorization', `Bearer ${VALID_API_KEY}`)
241
+ .send({
242
+ message: 'Test',
243
+ sessionId: 'non-existent-session',
244
+ })
245
+ .expect(400);
246
+ expect(response.body.code).toBe('SESSION_NOT_FOUND');
247
+ });
248
+ });
249
+ // ============================================================================
250
+ // POST /messages?stream=true - Streaming Message
251
+ // ============================================================================
252
+ describe('POST /messages?stream=true', () => {
253
+ it('should return SSE stream', async () => {
254
+ const response = await request(app)
255
+ .post('/messages?stream=true')
256
+ .set('Authorization', `Bearer ${VALID_API_KEY}`)
257
+ .set('Accept', 'text/event-stream')
258
+ .send({
259
+ message: 'Stream test',
260
+ workspace: '/test/workspace',
261
+ })
262
+ .expect(200);
263
+ expect(response.headers['content-type']).toContain('text/event-stream');
264
+ expect(response.text).toContain('data:');
265
+ });
266
+ it('should stream multiple events', async () => {
267
+ const response = await request(app)
268
+ .post('/messages?stream=true')
269
+ .set('Authorization', `Bearer ${VALID_API_KEY}`)
270
+ .set('Accept', 'text/event-stream')
271
+ .send({
272
+ message: 'Stream test',
273
+ workspace: '/test/workspace',
274
+ })
275
+ .expect(200);
276
+ const events = response.text.split('\n\n').filter((line) => line.startsWith('data:'));
277
+ expect(events.length).toBeGreaterThan(0);
278
+ });
279
+ it('should handle streaming errors', async () => {
280
+ const { executeCursorAgentStream } = await import('../../services/cursorAgentService.js');
281
+ vi.mocked(executeCursorAgentStream).mockRejectedValueOnce(new Error('Stream error'));
282
+ const response = await request(app)
283
+ .post('/messages?stream=true')
284
+ .set('Authorization', `Bearer ${VALID_API_KEY}`)
285
+ .set('Accept', 'text/event-stream')
286
+ .send({
287
+ message: 'Stream error test',
288
+ workspace: '/test/workspace',
289
+ })
290
+ .expect(200);
291
+ expect(response.text).toContain('error');
292
+ });
293
+ });
294
+ // ============================================================================
295
+ // POST /tasks - Create Async Task
296
+ // ============================================================================
297
+ describe('POST /tasks', () => {
298
+ it('should require authentication', async () => {
299
+ const response = await request(app)
300
+ .post('/tasks')
301
+ .send({ message: 'test' })
302
+ .expect(401);
303
+ expect(response.body.code).toBe('UNAUTHORIZED');
304
+ });
305
+ it('should require message field', async () => {
306
+ const response = await request(app)
307
+ .post('/tasks')
308
+ .set('Authorization', `Bearer ${VALID_API_KEY}`)
309
+ .send({})
310
+ .expect(400);
311
+ expect(response.body.code).toBe('VALIDATION_ERROR');
312
+ });
313
+ it('should create task and return 202', async () => {
314
+ const response = await request(app)
315
+ .post('/tasks')
316
+ .set('Authorization', `Bearer ${VALID_API_KEY}`)
317
+ .send({
318
+ message: 'Long running task',
319
+ workspace: '/test/workspace',
320
+ })
321
+ .expect(202);
322
+ expect(response.body).toHaveProperty('taskId');
323
+ expect(response.body).toHaveProperty('status', 'pending');
324
+ expect(response.body).toHaveProperty('checkUrl');
325
+ });
326
+ it('should accept pushNotificationConfig', async () => {
327
+ const response = await request(app)
328
+ .post('/tasks')
329
+ .set('Authorization', `Bearer ${VALID_API_KEY}`)
330
+ .send({
331
+ message: 'Task with webhook',
332
+ workspace: '/test/workspace',
333
+ pushNotificationConfig: {
334
+ url: 'https://example.com/webhook',
335
+ token: 'webhook-token',
336
+ },
337
+ })
338
+ .expect(202);
339
+ expect(response.body).toHaveProperty('taskId');
340
+ });
341
+ it('should handle task creation errors', async () => {
342
+ // This tests error handling in task creation
343
+ const response = await request(app)
344
+ .post('/tasks')
345
+ .set('Authorization', `Bearer ${VALID_API_KEY}`)
346
+ .send({
347
+ message: 'Task',
348
+ workspace: '/test/workspace',
349
+ })
350
+ .expect(202);
351
+ expect(response.body).toHaveProperty('taskId');
352
+ });
353
+ });
354
+ // ============================================================================
355
+ // GET /tasks/:taskId - Query Task Status
356
+ // ============================================================================
357
+ describe('GET /tasks/:taskId', () => {
358
+ it('should require authentication', async () => {
359
+ const response = await request(app)
360
+ .get('/tasks/test-task-id')
361
+ .expect(401);
362
+ expect(response.body.code).toBe('UNAUTHORIZED');
363
+ });
364
+ it('should return 404 for non-existent task', async () => {
365
+ const response = await request(app)
366
+ .get('/tasks/non-existent-task-id')
367
+ .set('Authorization', `Bearer ${VALID_API_KEY}`)
368
+ .expect(404);
369
+ expect(response.body.code).toBe('TASK_NOT_FOUND');
370
+ });
371
+ it('should return task status for existing task', async () => {
372
+ // Create a task first
373
+ const createResponse = await request(app)
374
+ .post('/tasks')
375
+ .set('Authorization', `Bearer ${VALID_API_KEY}`)
376
+ .send({
377
+ message: 'Test task',
378
+ workspace: '/test/workspace',
379
+ })
380
+ .expect(202);
381
+ const taskId = createResponse.body.taskId;
382
+ // Wait a bit for task to start
383
+ await new Promise((resolve) => setTimeout(resolve, 100));
384
+ // Query task status
385
+ const statusResponse = await request(app)
386
+ .get(`/tasks/${taskId}`)
387
+ .set('Authorization', `Bearer ${VALID_API_KEY}`)
388
+ .expect(200);
389
+ expect(statusResponse.body).toHaveProperty('taskId', taskId);
390
+ expect(statusResponse.body).toHaveProperty('status');
391
+ expect(statusResponse.body).toHaveProperty('createdAt');
392
+ expect(statusResponse.body).toHaveProperty('updatedAt');
393
+ });
394
+ it('should return output.result when task is completed', async () => {
395
+ // Create a task
396
+ const createResponse = await request(app)
397
+ .post('/tasks')
398
+ .set('Authorization', `Bearer ${VALID_API_KEY}`)
399
+ .send({
400
+ message: 'Quick task',
401
+ workspace: '/test/workspace',
402
+ })
403
+ .expect(202);
404
+ const taskId = createResponse.body.taskId;
405
+ // Wait for task to complete (mock should complete quickly)
406
+ await new Promise((resolve) => setTimeout(resolve, 500));
407
+ // Query task status
408
+ const statusResponse = await request(app)
409
+ .get(`/tasks/${taskId}`)
410
+ .set('Authorization', `Bearer ${VALID_API_KEY}`);
411
+ // Task might be running, completed, or failed
412
+ expect(['pending', 'running', 'completed', 'failed']).toContain(statusResponse.body.status);
413
+ if (statusResponse.body.status === 'completed') {
414
+ expect(statusResponse.body).toHaveProperty('output');
415
+ expect(statusResponse.body.output).toHaveProperty('result');
416
+ }
417
+ });
418
+ });
419
+ // ============================================================================
420
+ // DELETE /tasks/:taskId - Cancel Task
421
+ // ============================================================================
422
+ describe('DELETE /tasks/:taskId', () => {
423
+ it('should require authentication', async () => {
424
+ const response = await request(app)
425
+ .delete('/tasks/test-task-id')
426
+ .expect(401);
427
+ expect(response.body.code).toBe('UNAUTHORIZED');
428
+ });
429
+ it('should return 404 for non-existent task', async () => {
430
+ const response = await request(app)
431
+ .delete('/tasks/non-existent-task-id')
432
+ .set('Authorization', `Bearer ${VALID_API_KEY}`)
433
+ .expect(404);
434
+ expect(response.body.code).toBe('TASK_NOT_FOUND');
435
+ });
436
+ it('should cancel a pending task', async () => {
437
+ // Create a task
438
+ const createResponse = await request(app)
439
+ .post('/tasks')
440
+ .set('Authorization', `Bearer ${VALID_API_KEY}`)
441
+ .send({
442
+ message: 'Task to cancel',
443
+ workspace: '/test/workspace',
444
+ })
445
+ .expect(202);
446
+ const taskId = createResponse.body.taskId;
447
+ // Cancel immediately (should be pending or running)
448
+ const cancelResponse = await request(app)
449
+ .delete(`/tasks/${taskId}`)
450
+ .set('Authorization', `Bearer ${VALID_API_KEY}`);
451
+ // Task might complete quickly, so accept either success or "cannot cancel" error
452
+ if (cancelResponse.status === 200) {
453
+ expect(cancelResponse.body).toHaveProperty('status', 'canceled');
454
+ expect(cancelResponse.body).toHaveProperty('message');
455
+ }
456
+ else {
457
+ // Task already completed
458
+ expect(cancelResponse.status).toBe(400);
459
+ expect(cancelResponse.body.code).toBe('TASK_CANNOT_BE_CANCELED');
460
+ }
461
+ });
462
+ it('should not cancel completed task', async () => {
463
+ // Create and wait for task to complete
464
+ const createResponse = await request(app)
465
+ .post('/tasks')
466
+ .set('Authorization', `Bearer ${VALID_API_KEY}`)
467
+ .send({
468
+ message: 'Quick task',
469
+ workspace: '/test/workspace',
470
+ })
471
+ .expect(202);
472
+ const taskId = createResponse.body.taskId;
473
+ // Wait for completion
474
+ await new Promise((resolve) => setTimeout(resolve, 1000));
475
+ // Try to cancel (might fail if already completed)
476
+ const cancelResponse = await request(app)
477
+ .delete(`/tasks/${taskId}`)
478
+ .set('Authorization', `Bearer ${VALID_API_KEY}`);
479
+ // Should either succeed (if still running) or fail (if completed)
480
+ if (cancelResponse.status === 400) {
481
+ expect(cancelResponse.body.code).toBe('TASK_CANNOT_BE_CANCELED');
482
+ }
483
+ });
484
+ });
485
+ });
486
+ //# sourceMappingURL=cursorAgent.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursorAgent.test.js","sourceRoot":"","sources":["../../../src/routes/__tests__/cursorAgent.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Cursor Agent A2A Routes
3
+ *
4
+ * Independent A2A-compatible service wrapping Cursor CLI agent command.
5
+ * This service is separate from AgentStudio's agent system.
6
+ *
7
+ * Endpoints:
8
+ * - GET / - Homepage with usage instructions and Agent Card display
9
+ * - GET /.well-known/agent-card.json - Agent Card discovery
10
+ * - POST /messages - Send synchronous message
11
+ * - POST /tasks - Create asynchronous task
12
+ * - GET /tasks/:taskId - Query task status
13
+ * - DELETE /tasks/:taskId - Cancel task
14
+ *
15
+ * Authentication: API key via Authorization header (Bearer token)
16
+ */
17
+ import { Router } from 'express';
18
+ declare const router: Router;
19
+ export default router;
20
+ //# sourceMappingURL=cursorAgent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursorAgent.d.ts","sourceRoot":"","sources":["../../src/routes/cursorAgent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAgB,EAAE,MAAM,EAAY,MAAM,SAAS,CAAC;AAKpD,QAAA,MAAM,MAAM,EAAE,MAA8C,CAAC;AAwxB7D,eAAe,MAAM,CAAC"}